1. 程式人生 > >KONG閘道器 — 介紹安裝

KONG閘道器 — 介紹安裝

閘道器是微服務中不可或缺的一部分,它承載了所有請求流量入口,引數驗證攔截,使用者許可權驗證,但是除了JAVA的spring cloud之外,公共閘道器屈指可數,其中最受關注的就是KONG了,筆者半年前就已經在使用kong的那時候使用的是0.11.2-bate版本(之前還被官方坑了一次),前不久終於等到了1.X的正式版釋出了,筆者就在這裡給大家分享一下kong閘道器的基本情況以及使用安裝的方式。

附上:

喵了個咪的部落格:w-blog.cn

kong官網:https://konghq.com/

PS:本文使用的是Kong1.0.3版本

一,kong是什麼

kong在girhub有不小的人氣,star都有2W多次了相比也知道大家對於kong的熱愛(確實也不使用JAVA棧沒有什麼好的選擇),從下面這張官方配圖可以看出,kong把本身每個服務都需要重複編寫的操作彙總到了一起,讓業務關注業務實現不用在為很多的規則進行重複的處理。

從筆者總結數來kong的主要優勢:

  • 外掛市場豐富,很多外掛可以降低開發成本;
  • 可擴充套件性,可以編寫lua指令碼來定製自己的引數驗證許可權驗證等操作;
  • 基於openResty,openResty基於Nginx保障了強勁的效能;
  • 便捷效能擴容,只需要水平增加伺服器資源效能就能提升 ;
  • 負載均衡健康檢查

二,Docket部署kong

PS:postgreSql資料庫版本必須 > 9.4

因為不是通過docker-composer啟動的容器需要互相訪問需要在同一個網路名下才可以互相訪問

docker network create kong-net

資料庫使用 postgres

docker run -d --name kong-database \
               --network=kong-net \
               -p 5432:5432 \
               -e "POSTGRES_USER=kong" \
               -e "POSTGRES_DB=kong" \
               postgres:9.6

準備資料庫資料和配置,只需要執行一遍執行完成後會自動結束

docker run --rm \
     --network=kong-net \
     -e "KONG_DATABASE=postgres" \
     -e "KONG_PG_HOST=kong-database" \
     -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
     kong:1.0.3 kong migrations bootstrap

啟動kong-service

docker run -d --name kong \
     --network=kong-net \
     -e "KONG_DATABASE=postgres" \
     -e "KONG_PG_HOST=kong-database" \
     -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
     -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
     -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
     -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
     -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
     -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \
     -p 8000:8000 \
     -p 8443:8443 \
     -p 8001:8001 \
     -p 8444:8444 \
     kong:1.0.3
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                NAMES
d82c2b7729ae        kong:1.0.3          "/docker-entrypoin..."   3 seconds ago       Up 2 seconds        0.0.0.0:8000-8001->8000-8001/tcp, 0.0.0.0:8443-8444->8443-8444/tcp   kong
9b7f5a9c808f        postgres:9.6        "docker-entrypoint..."   26 seconds ago      Up 25 seconds       0.0.0.0:5432->5432/tcp                                               kong-database

然後呼叫了一下地址有輸出即可:

curl -i http://localhost:8001/

使用docker-compose部署kong

version: '2.1'
services:
  kong-migrations:
    image: "kong:1.0.3"
    command: kong migrations bootstrap
    depends_on:
      db:
        condition: service_healthy
    environment:
      KONG_DATABASE: postgres
      KONG_PG_DATABASE: kong
      KONG_PG_HOST: db
      KONG_PG_PASSWORD: kong
      KONG_PG_USER: kong
    links:
      - db:db
  kong:
    image: "kong:1.0.3"
    depends_on:
      db:
        condition: service_healthy
    environment:
      KONG_ADMIN_ACCESS_LOG: /dev/stdout
      KONG_ADMIN_ERROR_LOG: /dev/stderr
      KONG_ADMIN_LISTEN: '0.0.0.0:8001'
      KONG_CASSANDRA_CONTACT_POINTS: db
      KONG_DATABASE: postgres
      KONG_PG_DATABASE: kong
      KONG_PG_HOST: db
      KONG_PG_PASSWORD: kong
      KONG_PG_USER: kong
      KONG_PROXY_ACCESS_LOG: /dev/stdout
      KONG_PROXY_ERROR_LOG: /dev/stderr
    links:
      - db:db
    ports:
      - "8000:8000/tcp"
      - "8001:8001/tcp"
      - "8443:8443/tcp"
      - "8444:8444/tcp"
    restart: on-failure
  db:
    image: postgres:9.6
    environment:
      POSTGRES_DB: kong
      POSTGRES_PASSWORD: kong
      POSTGRES_USER: kong
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "kong"]
      interval: 30s
      timeout: 30s
      retries: 3
    restart: on-failure
    stdin_open: true
    tty: true

db的 healthcheck 做了資料層初始化完成檢測,資料庫完成之後才會按照順序繼續啟動接下來的容器

docker-compose up -d

三,使用外部資料庫

很多使用我們並不在容器中執行DB例項,因為如果出現任何問題資料丟失,我們先準備好對應的postgres資料庫

{DB-host}:{DB-port}
{DB-user}
{DB-pass}

建立資料庫

CREATE DATABASE "kong" WITH ENCODING='UTF8';

初始化kong需要的資料庫

version: '2.1'
services:
  kong-migrations:
    image: "kong:1.0.3"
    command: kong migrations bootstrap
    environment:
      KONG_DATABASE: postgres
      KONG_PG_DATABASE: kong
      KONG_PG_HOST: {DB-host}
      KONG_PG_PORT: {DB-port}
      KONG_PG_PASSWORD: {DB-pass}
      KONG_PG_USER: {DB-user}
> docker-compose up -d
Creating network "kong_default" with the default driver
Creating kong_kong-migrations_1 ...
Creating kong_kong-migrations_1 ... done

在通過docker-compose來執行kong服務

version: '2.1'
services:
  kong:
    image: "kong:1.0.3"
    environment:
      KONG_ADMIN_ACCESS_LOG: /dev/stdout
      KONG_ADMIN_ERROR_LOG: /dev/stderr
      KONG_ADMIN_LISTEN: '0.0.0.0:8001'
      KONG_CASSANDRA_CONTACT_POINTS: db
      KONG_DATABASE: postgres
      KONG_PG_DATABASE: kong
      KONG_PG_HOST: {DB-host}
      KONG_PG_PORT: {DB-port}
      KONG_PG_PASSWORD: {DB-pass}
      KONG_PG_USER: {DB-user}
      KONG_PROXY_ACCESS_LOG: /dev/stdout
      KONG_PROXY_ERROR_LOG: /dev/stderr
    ports:
      - "8000:8000/tcp"
      - "8001:8001/tcp"
      - "8443:8443/tcp"
      - "8444:8444/tcp"
    restart: on-failure
docker-compose up -d
Creating kong_kong_1 ...
Creating kong_kong_1 ... done

kubernetes編排

apiVersion: extensions/v1beta1                  # K8S對應的API版本
kind: Deployment                                # 對應的型別
metadata:
  name: kong
  labels:
    name: kong
  namespace: kong                                # namespace
spec:
  replicas: 1                                   # 映象副本數量
  template:
    metadata:
      labels:                                   # 容器的標籤 可和service關聯
        app: kong
    spec:
      containers:
        - name: kong                        # 容器名和映象
          image: kong:1.0.3
          imagePullPolicy: Always
          ports:
          - containerPort: 8000
          env:                                  # 環境變數
          - name: KONG_DATABASE
            value: postgres
          - name: KONG_PG_DATABASE
            value: dev-kong
          - name: KONG_PG_HOST
            value: {DB-host}
          - name: KONG_PG_PORT
            value: {DB-port}
          - name: KONG_PG_PASSWORD
            value: {DB-pass}
          - name: KONG_PG_USER
            value: {DB-user}
          - name: KONG_LOG_LEVEL
            value: warn
          resources:                            # 資源限制
            requests:
              memory: "256Mi"
              cpu: "200m"
            limits:
              memory: "512Mi"
              cpu: "400m"
---
apiVersion: v1
kind: Service
metadata:
  namespace: kong                                  # 在哪個名稱空間中建立
  name: kong                          # 名稱
  labels:
    name: kong
spec:
  type: NodePort                                  # 開放埠的型別
  selector:                                       # service負載的容器需要有同樣的labels
    app: kong
  ports:
  - name: http
    port: 8000                                    # 通過service來訪問的埠
    targetPort: 8000                              # 對應容器的埠
    nodePort: 30180
  - name: https
    port: 8443                                    # 通過service來訪問的埠
    targetPort: 8443                              # 對應容器的埠
    nodePort: 30143
  - name: api
    port: 8001                                    # 通過service來訪問的埠
    targetPort: 8001                              # 對應容器的埠
    node