1. 程式人生 > 實用技巧 >[Kong 與 Konga 與 Postgres資料庫] 之 Kuberneres 部署

[Kong 與 Konga 與 Postgres資料庫] 之 Kuberneres 部署

1、Kong的概述

Kong是一個clould-native、快速的、可擴充套件的、分散式的微服務抽象層(也稱為API閘道器、API中介軟體或在某些情況下稱為服務網格)框架。Kong作為開源專案在2015年推出,它的核心價值是高效能和可擴充套件性。Kong被廣泛用於從初創企業到全球5000家公司以及政府組織的生產環境中。

如果構建Web、移動或IoT(物聯網)應用,可能最終需要使用通用的功能來實現這些應用。Kong充當微服務請求的閘道器(或側車),通過外掛能夠提供負載平衡日誌記錄、身份驗證、速率限制、轉換等能力。

2、功能特性

  • 雲本土化(Cloud-Native):Kong可以在Kubernetes或物理環境上執行;
  • 動態負載平衡(Dynamic Load Balancing):跨多個上游服務的負載平衡業務。
  • 基於雜湊的負載平衡(Hash-based Load Balancing):一致的雜湊/粘性會話的負載平衡。
  • 斷路器(Circuit-Breaker):智慧跟蹤不健康的上游服務。
  • 健康檢查(Health Checks):主動和被動監控您的上游服務。
  • 服務發現(Service Discovery):解決如Consul等第三方DNS解析器的SRV記錄。
  • 無伺服器(Serverless):從Kong中直接呼叫和保證AWS或OpenWhisk函式安全。
  • WebSockets:通過WebSockets與上游服務進行通訊。
  • OAuth2.0:輕鬆的向API中新增OAuth2.0認證。
  • 日誌記錄(Logging):通過HTTP、TCP、UDP記錄請求或者相應的日誌,儲存在磁碟中。
  • 安全(Security):ACL,Bot檢測,IPs白名單/黑名單等。
  • 系統日誌(Syslog):記錄資訊到系統日誌。
  • SSL:為基礎服務或API設定特定的SSL證書。
  • 監視(Monitoring):能夠實時對關鍵負載和效能指標進行監控。
  • 轉發代理(Forward Proxy):使埠連線到中間透明的HTTP代理。
  • 認證(Authentications):支援HMAC,JWT和BASIC方式進行認證等等。
  • 速率限制(Rate-limiting):基於多個變數的阻塞和節流請求。
  • 轉換(Transformations):新增、刪除或操作HTTP請求和響應。
  • 快取(Caching):在代理層進行快取和服務響應。
  • 命令列工具(CLI):能夠通過命令列控制Kong的叢集。
  • REST API:可以通過REST API靈活的操作Kong。
  • GEO複製:在不同的區域,配置總是最新的。
  • 故障檢測與恢復(Failure Detection & Recovery):如果Cassandra節點失效,Kong並不會受影響。
  • 群集(Clustering):所有的Kong節點會自動加入群集,並更新各個節點上的配置。
  • 可擴充套件性(Scalability):通過新增節點,實現水平縮放。
  • 效能(Performance):通過縮放和使用Nigix,Kong能夠輕鬆處理負載。
  • 外掛(Plugins):基於外掛的可擴充套件體系結構,能夠方便的向Kong和API新增功能。

3、Kong依賴的技術

Kong部署在Nginx和Apache Cassandra或PostgreSQL等可靠技術之上,並提供了易於使用的RESTful API來操作和配置系統。下面是Kong的技術邏輯圖。基於這些技術,Kong提供相關的特性支援:

  • Nginx
    • 經過驗證的高效能基礎;
    • HTTP和反向代理伺服器;
    • 處理低層級的操作。
  • OpenRestry
    • 支援Lua指令碼;
    • 攔截請求/響應生命週期;
    • 基於Nginx進行擴充套件。
  • Clustering&Datastore
    • 支援Cassandra或PostgreSQL資料庫;
    • 記憶體級的快取;
    • 支援水平擴充套件。
  • Plugins
    • 使用Lua建立外掛;
    • 功能強大的定製能力;
    • 與第三方服務實現整合。
  • Restful Administration API
    • 通過Restful API管理Kong;
    • 支援CI/CD&DevOps;
    • 基於外掛的可擴充套件。

實踐Kong for Kubernetes

Kong之前都是使用Admin API來進行管理的,Kong主要暴露兩個埠管理埠8001和代理埠8000,管理Kong主要的是為上游服務配置Service、Routes、Plugins、Consumer等實體資源,Kong按照這些配置規則進行對上游服務的請求進行路由分發和控制。在Kubernetes叢集環境下,Admin API方式不是很適應Kubernetes宣告式管理方式。所以Kong在Kubernetes叢集環境下推出Kong Ingress Controller。Kong Ingress Controller定義了四個CRDs(CustomResourceDefinitions),基本上涵蓋了原Admin API的各個方面。

  • kongconsumers:Kong的使用者,給不同的API使用者提供不同的消費者身份。
  • kongcredentials:Kong使用者的認證憑證。
  • kongingresses:定義代理行為規則,是對Ingress的補充配置。
  • kongplugins:外掛的配置。
Kong建立的CRDs:

[root@localhost konga]# kubectl get crds
NAME                                          CREATED AT
kongclusterplugins.configuration.konghq.com   2020-08-12T13:16:56Z
kongconsumers.configuration.konghq.com        2020-08-12T13:16:56Z
kongcredentials.configuration.konghq.com      2020-08-12T13:16:56Z
kongingresses.configuration.konghq.com        2020-08-12T13:16:56Z
kongplugins.configuration.konghq.com          2020-08-12T13:16:56Z

先決條件

  • Kubernetes叢集:您可以使用MinikubeGKE叢集。Kong與Kubernetes的所有發行版相容。
  • kubectl訪問許可權:您應該已經kubectl安裝並配置為與Kubernetes叢集通訊。

為Kubernetes安裝Kong

使用以下安裝方法之一安裝Kong for Kubernetes:

YAML清單

要通過部署Kong kubectl,請使用:

kubectl apply -f https://bit.ly/kong-ingress-dbless

重要!這不是生產級部署。根據您的用例調整“引數”:

  • 副本:確保您正在執行Kong的多個例項,以防止由於單個節點故障而造成的中斷。
  • 效能優化:調整Kong的記憶體設定,並根據使用情況定製部署。
  • 負載均衡器:確保在Kong前面執行基於4層或TCP的均衡器。這使Kong可以提供TLS證書並與證書管理器整合。

helm部署

Kong有一個官方的Helm Chart。要將Kong部署到帶有Helm的Kubernetes叢集上,請使用:

$ helm repo add kong https://charts.konghq.com
$ helm repo update

# Helm 2
$ helm install kong/kong

# Helm 3
$ helm install kong/kong --generate-name --set ingressController.installCRDs=false

Kustomize

可以使用Kubernetes的kustomize宣告性地修補Kong的Kubernetes清單。遠端定製構建的一個示例是:

kustomize build github.com/kong/kubernetes-ingress-controller/deploy/manifests/base

在Kong的儲存庫中可以使用Kustomization 進行不同型別的部署。

使用託管的Kubernetes雲產品

如果您正在使用雲提供商將Kong安裝在託管的Kubernetes產品上,例如Google Kubernetes Engine(GKE),Amazon EKS(EKS),Azure Kubernetes Service(AKS)等,請確保已設定Kubernetes群集在雲提供程式上,並已kubectl在您的工作站上進行了配置。

一旦您配置了Kubernetes叢集並配置了kubectl,任何雲提供商的安裝都將使用上述方法之一(YAML manifestsHelm ChartKustomize)來安裝Kong。

每個雲提供商在允許如何配置特定資源(例如負載均衡器,儲存卷等)方面都有一些細微的不同。我們建議您參考其文件來調整這些設定。

關於Kong的資料庫使用

如果您使用的是資料庫,我們建議您在Kubernetes內部以記憶體模式(也稱為無DB)執行Kong,因為所有配置都儲存在Kubernetes控制面板中。此設定簡化了Kong的操作,因此無需擔心資料庫的設定,備份,可用性,安全性等。如果您決定使用資料庫,建議您在Kubernetes之外執行資料庫。您可以從雲提供商使用Amazon RDS之類的服務或類似的託管Postgres服務來自動執行資料庫操作。

我們不建議在Kubernetes部署中將Kong與Cassandra一起使用,因為Kong的Cassandra使用所涵蓋的功能是通過Kubernetes中的其他方式處理的。

當前採用yaml清單方式實踐

下載官方yaml 檔案

通過瀏覽器開啟官方下載地址https://bit.ly/kong-ingress-dbless,下載對應的yaml檔案

wget https://raw.githubusercontent.com/Kong/kubernetes-ingress-controller/master/deploy/single/all-in-one-dbless.yaml

修改yaml檔案

當前我們deployment配置的kong 最新版本預設沒有用資料庫,前面[關於kong的資料庫使用]章節,我們已經說明。

當前kong:2.1,kong-ingress-controller:0.9.1版本,為適應當前環境,我們修改瞭如下的配置,漏掉的位置會在yaml 檔案中進行標識

  1. 修改service配置為NodePort,預設是LoadBalancer
  2. 預設只開通了8444介面,對與接入不方便,修改成新增8001埠,KONG_ADMIN_LISTEN :value: 0.0.0.0:8001, 0.0.0.0:8444 ssl 引數
  3. 對應的service 裡面也增加的8001埠進行對我對映

整體配置檔案如下:

[root@localhost kong-gateway]# cat kong-all-in-one-dbless.yaml 
apiVersion: v1
kind: Namespace
metadata:
  name: kong
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: kongclusterplugins.configuration.konghq.com
spec:
  additionalPrinterColumns:
  - JSONPath: .plugin
    description: Name of the plugin
    name: Plugin-Type
    type: string
  - JSONPath: .metadata.creationTimestamp
    description: Age
    name: Age
    type: date
  - JSONPath: .disabled
    description: Indicates if the plugin is disabled
    name: Disabled
    priority: 1
    type: boolean
  - JSONPath: .config
    description: Configuration of the plugin
    name: Config
    priority: 1
    type: string
  group: configuration.konghq.com
  names:
    kind: KongClusterPlugin
    plural: kongclusterplugins
    shortNames:
    - kcp
  scope: Cluster
  validation:
    openAPIV3Schema:
      properties:
        config:
          type: object
        configFrom:
          properties:
            secretKeyRef:
              properties:
                key:
                  type: string
                name:
                  type: string
                namespace:
                  type: string
              required:
              - name
              - namespace
              - key
              type: object
          type: object
        disabled:
          type: boolean
        plugin:
          type: string
        protocols:
          items:
            enum:
            - http
            - https
            - grpc
            - grpcs
            - tcp
            - tls
            type: string
          type: array
        run_on:
          enum:
          - first
          - second
          - all
          type: string
      required:
      - plugin
  version: v1
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: kongconsumers.configuration.konghq.com
spec:
  additionalPrinterColumns:
  - JSONPath: .username
    description: Username of a Kong Consumer
    name: Username
    type: string
  - JSONPath: .metadata.creationTimestamp
    description: Age
    name: Age
    type: date
  group: configuration.konghq.com
  names:
    kind: KongConsumer
    plural: kongconsumers
    shortNames:
    - kc
  scope: Namespaced
  validation:
    openAPIV3Schema:
      properties:
        credentials:
          items:
            type: string
          type: array
        custom_id:
          type: string
        username:
          type: string
  version: v1
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: kongcredentials.configuration.konghq.com
spec:
  additionalPrinterColumns:
  - JSONPath: .type
    description: Type of credential
    name: Credential-type
    type: string
  - JSONPath: .metadata.creationTimestamp
    description: Age
    name: Age
    type: date
  - JSONPath: .consumerRef
    description: Owner of the credential
    name: Consumer-Ref
    type: string
  group: configuration.konghq.com
  names:
    kind: KongCredential
    plural: kongcredentials
  scope: Namespaced
  validation:
    openAPIV3Schema:
      properties:
        consumerRef:
          type: string
        type:
          type: string
      required:
      - consumerRef
      - type
  version: v1
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: kongingresses.configuration.konghq.com
spec:
  group: configuration.konghq.com
  names:
    kind: KongIngress
    plural: kongingresses
    shortNames:
    - ki
  scope: Namespaced
  validation:
    openAPIV3Schema:
      properties:
        proxy:
          properties:
            connect_timeout:
              minimum: 0
              type: integer
            path:
              pattern: ^/.*$
              type: string
            protocol:
              enum:
              - http
              - https
              - grpc
              - grpcs
              - tcp
              - tls
              type: string
            read_timeout:
              minimum: 0
              type: integer
            retries:
              minimum: 0
              type: integer
            write_timeout:
              minimum: 0
              type: integer
          type: object
        route:
          properties:
            headers:
              additionalProperties:
                items:
                  type: string
                type: array
              type: object
            https_redirect_status_code:
              type: integer
            methods:
              items:
                type: string
              type: array
            path_handling:
              enum:
              - v0
              - v1
              type: string
            preserve_host:
              type: boolean
            protocols:
              items:
                enum:
                - http
                - https
                - grpc
                - grpcs
                - tcp
                - tls
                type: string
              type: array
            regex_priority:
              type: integer
            strip_path:
              type: boolean
        upstream:
          properties:
            algorithm:
              enum:
              - round-robin
              - consistent-hashing
              - least-connections
              type: string
            hash_fallback:
              type: string
            hash_fallback_header:
              type: string
            hash_on:
              type: string
            hash_on_cookie:
              type: string
            hash_on_cookie_path:
              type: string
            hash_on_header:
              type: string
            healthchecks:
              properties:
                active:
                  properties:
                    concurrency:
                      minimum: 1
                      type: integer
                    healthy:
                      properties:
                        http_statuses:
                          items:
                            type: integer
                          type: array
                        interval:
                          minimum: 0
                          type: integer
                        successes:
                          minimum: 0
                          type: integer
                      type: object
                    http_path:
                      pattern: ^/.*$
                      type: string
                    timeout:
                      minimum: 0
                      type: integer
                    unhealthy:
                      properties:
                        http_failures:
                          minimum: 0
                          type: integer
                        http_statuses:
                          items:
                            type: integer
                          type: array
                        interval:
                          minimum: 0
                          type: integer
                        tcp_failures:
                          minimum: 0
                          type: integer
                        timeout:
                          minimum: 0
                          type: integer
                      type: object
                  type: object
                passive:
                  properties:
                    healthy:
                      properties:
                        http_statuses:
                          items:
                            type: integer
                          type: array
                        interval:
                          minimum: 0
                          type: integer
                        successes:
                          minimum: 0
                          type: integer
                      type: object
                    unhealthy:
                      properties:
                        http_failures:
                          minimum: 0
                          type: integer
                        http_statuses:
                          items:
                            type: integer
                          type: array
                        interval:
                          minimum: 0
                          type: integer
                        tcp_failures:
                          minimum: 0
                          type: integer
                        timeout:
                          minimum: 0
                          type: integer
                      type: object
                  type: object
                threshold:
                  type: integer
              type: object
            host_header:
              type: string
            slots:
              minimum: 10
              type: integer
          type: object
  version: v1
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: kongplugins.configuration.konghq.com
spec:
  additionalPrinterColumns:
  - JSONPath: .plugin
    description: Name of the plugin
    name: Plugin-Type
    type: string
  - JSONPath: .metadata.creationTimestamp
    description: Age
    name: Age
    type: date
  - JSONPath: .disabled
    description: Indicates if the plugin is disabled
    name: Disabled
    priority: 1
    type: boolean
  - JSONPath: .config
    description: Configuration of the plugin
    name: Config
    priority: 1
    type: string
  group: configuration.konghq.com
  names:
    kind: KongPlugin
    plural: kongplugins
    shortNames:
    - kp
  scope: Namespaced
  validation:
    openAPIV3Schema:
      properties:
        config:
          type: object
        configFrom:
          properties:
            secretKeyRef:
              properties:
                key:
                  type: string
                name:
                  type: string
              required:
              - name
              - key
              type: object
          type: object
        disabled:
          type: boolean
        plugin:
          type: string
        protocols:
          items:
            enum:
            - http
            - https
            - grpc
            - grpcs
            - tcp
            - tls
            type: string
          type: array
        run_on:
          enum:
          - first
          - second
          - all
          type: string
      required:
      - plugin
  version: v1
---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: tcpingresses.configuration.konghq.com
spec:
  additionalPrinterColumns:
  - JSONPath: .status.loadBalancer.ingress[*].ip
    description: Address of the load balancer
    name: Address
    type: string
  - JSONPath: .metadata.creationTimestamp
    description: Age
    name: Age
    type: date
  group: configuration.konghq.com
  names:
    kind: TCPIngress
    plural: tcpingresses
  scope: Namespaced
  subresources:
    status: {}
  validation:
    openAPIV3Schema:
      properties:
        apiVersion:
          type: string
        kind:
          type: string
        metadata:
          type: object
        spec:
          properties:
            rules:
              items:
                properties:
                  backend:
                    properties:
                      serviceName:
                        type: string
                      servicePort:
                        format: int32
                        type: integer
                    type: object
                  host:
                    type: string
                  port:
                    format: int32
                    type: integer
                type: object
              type: array
            tls:
              items:
                properties:
                  hosts:
                    items:
                      type: string
                    type: array
                  secretName:
                    type: string
                type: object
              type: array
          type: object
        status:
          type: object
  version: v1beta1
status:
  acceptedNames:
    kind: ""
    plural: ""
  conditions: []
  storedVersions: []
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: kong-serviceaccount
  namespace: kong
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: kong-ingress-clusterrole
rules:
- apiGroups:
  - ""
  resources:
  - endpoints
  - nodes
  - pods
  - secrets
  verbs:
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - services
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - networking.k8s.io
  - extensions
  - networking.internal.knative.dev
  resources:
  - ingresses
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - events
  verbs:
  - create
  - patch
- apiGroups:
  - networking.k8s.io
  - extensions
  - networking.internal.knative.dev
  resources:
  - ingresses/status
  verbs:
  - update
- apiGroups:
  - configuration.konghq.com
  resources:
  - tcpingresses/status
  verbs:
  - update
- apiGroups:
  - configuration.konghq.com
  resources:
  - kongplugins
  - kongclusterplugins
  - kongcredentials
  - kongconsumers
  - kongingresses
  - tcpingresses
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - configmaps
  verbs:
  - create
  - get
  - update
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: kong-ingress-clusterrole-nisa-binding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: kong-ingress-clusterrole
subjects:
- kind: ServiceAccount
  name: kong-serviceaccount
  namespace: kong
---
apiVersion: v1
kind: Service
metadata:
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp
    service.beta.kubernetes.io/aws-load-balancer-type: nlb
  name: kong-proxy
  namespace: kong
spec:
  ports:
  - name: proxy
    port: 80
    protocol: TCP
    targetPort: 8000
  - name: proxy-ssl
    port: 443
    protocol: TCP
    targetPort: 8443
  - name: kong-admin
    port: 8001
    protocol: TCP
    targetPort: 8001
  - name: kong-admin-ssl
    port: 8444
    protocol: TCP
    targetPort: 8444
  selector:
    app: ingress-kong
  type: NodePort
---
apiVersion: v1
kind: Service
metadata:
  name: kong-validation-webhook
  namespace: kong
spec:
  ports:
  - name: webhook
    port: 443
    protocol: TCP
    targetPort: 8080
  selector:
    app: ingress-kong
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: ingress-kong
  name: ingress-kong
  namespace: kong
spec:
  replicas: 3
  selector:
    matchLabels:
      app: ingress-kong
  template:
    metadata:
      annotations:
        kuma.io/gateway: enabled
        prometheus.io/port: "8100"
        prometheus.io/scrape: "true"
        traffic.sidecar.istio.io/includeInboundPorts: ""
      labels:
        app: ingress-kong
    spec:
      containers:
      - env:
        - name: KONG_PROXY_LISTEN
          value: 0.0.0.0:8000, 0.0.0.0:8443 ssl http2
        - name: KONG_ADMIN_LISTEN
          value: 0.0.0.0:8001, 0.0.0.0:8444 ssl
        - name: KONG_STATUS_LISTEN
          value: 0.0.0.0:8100
        - name: KONG_DATABASE
          value: "off"
        - name: KONG_NGINX_WORKER_PROCESSES
          value: "1"
        - name: KONG_ADMIN_ACCESS_LOG
          value: /dev/stdout
        - name: KONG_ADMIN_ERROR_LOG
          value: /dev/stderr
        - name: KONG_PROXY_ERROR_LOG
          value: /dev/stderr
        image: kong:2.1
        lifecycle:
          preStop:
            exec:
              command:
              - /bin/sh
              - -c
              - kong quit
        livenessProbe:
          failureThreshold: 3
          httpGet:
            path: /status
            port: 8100
            scheme: HTTP
          initialDelaySeconds: 5
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1
        name: proxy
        ports:
        - containerPort: 8000
          name: proxy
          protocol: TCP
        - containerPort: 8443
          name: proxy-ssl
          protocol: TCP
        - containerPort: 8100
          name: metrics
          protocol: TCP
        readinessProbe:
          failureThreshold: 3
          httpGet:
            path: /status
            port: 8100
            scheme: HTTP
          initialDelaySeconds: 5
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1
        securityContext:
          runAsUser: 1000
      - env:
        - name: CONTROLLER_KONG_ADMIN_URL
          value: https://127.0.0.1:8444
        - name: CONTROLLER_KONG_ADMIN_TLS_SKIP_VERIFY
          value: "true"
        - name: CONTROLLER_PUBLISH_SERVICE
          value: kong/kong-proxy
        - name: POD_NAME
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: metadata.namespace
        image: kong-docker-kubernetes-ingress-controller.bintray.io/kong-ingress-controller:0.9.1
        imagePullPolicy: IfNotPresent
        livenessProbe:
          failureThreshold: 3
          httpGet:
            path: /healthz
            port: 10254
            scheme: HTTP
          initialDelaySeconds: 5
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1
        name: ingress-controller
        ports:
        - containerPort: 8080
          name: webhook
          protocol: TCP
        readinessProbe:
          failureThreshold: 3
          httpGet:
            path: /healthz
            port: 10254
            scheme: HTTP
          initialDelaySeconds: 5
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1
      serviceAccountName: kong-serviceaccount

執行該yaml 檔案

[root@localhost kong-gateway]# kubectl apply -f all-in-one-dbless.yaml 
namespace/kong created
customresourcedefinition.apiextensions.k8s.io/kongclusterplugins.configuration.konghq.com created
customresourcedefinition.apiextensions.k8s.io/kongconsumers.configuration.konghq.com created
customresourcedefinition.apiextensions.k8s.io/kongcredentials.configuration.konghq.com created
customresourcedefinition.apiextensions.k8s.io/kongingresses.configuration.konghq.com created
customresourcedefinition.apiextensions.k8s.io/kongplugins.configuration.konghq.com created
customresourcedefinition.apiextensions.k8s.io/tcpingresses.configuration.konghq.com created
serviceaccount/kong-serviceaccount created
clusterrole.rbac.authorization.k8s.io/kong-ingress-clusterrole created
clusterrolebinding.rbac.authorization.k8s.io/kong-ingress-clusterrole-nisa-binding created
service/kong-proxy created
service/kong-validation-webhook created
deployment.apps/ingress-kong created

檢視啟動情況

[root@localhost kong-gateway]# kubectl get po -n kong -l app=ingress-kong
NAME                            READY   STATUS    RESTARTS   AGE
ingress-kong-5f8b45fbff-4cdtv   2/2     Running   2          20m
ingress-kong-5f8b45fbff-mkkq9   2/2     Running   2          20m
ingress-kong-5f8b45fbff-qt8tw   2/2     Running   1          12h
[root@localhost kong-gateway]# kubectl get svc -n kong
NAME                              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                    AGE
service/kong-proxy                NodePort    10.97.22.195    <none>        80:32284/TCP,443:32083/TCP,8001:32704/TCP,8444:30658/TCP   39h
service/kong-validation-webhook   ClusterIP   10.101.75.177   <none>        443/TCP  

開放kong-proxy對外8001介面ingress配置檔案

當前配置檔案時為了開放kong-proxy-admin的介面,可以讓使用者使用ingress域名進行訪問,限制kong admin管理介面為8001和8443

[root@localhost kong-gateway]# cat kong-proxy-admin.ingress-demo.yaml 
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  labels:
    ingresscontroller: kong
  annotations:
    kubernetes.io/ingress.class: kong 
  name: kong-proxy
  namespace: kong
spec:
  rules:
  - host: kong-proxy-admin.mydomain.com
    http:
      paths:
      - backend:
          serviceName: kong-proxy
          servicePort: 8001 
        path: /

[root@localhost kong-gateway]# kubectl get ing -n kong 
kong-proxy   <none>   kong-proxy-admin.mydomain.com   172.18.0.2   80      10h

[root@localhost kong-gateway]# kubectl describe  ing -n kong kong-proxy
Name:             kong-proxy
Namespace:        kong
Address:          172.18.0.2
Default backend:  default-http-backend:80 (<error: endpoints "default-http-backend" not found>)
Rules:
  Host                           Path  Backends
  ----                           ----  --------
  kong-proxy-admin.mydomain.com  
                                 /   kong-proxy:8001 (10.244.0.20:8001,10.244.0.21:8001,10.244.0.22:8001)
Annotations:                     kubernetes.io/ingress.class: kong
Events:                          <none>

安裝Konga 管理UI

Kong 企業版提供了管理UI,開源版本是沒有的。但是有很多的開源的管理 UI ,其中比較好用的是Konga。專案地址:https://github.com/pantsel/konga

Konga 特性

Konga 主要是用 AngularJS 寫的,運行於nodejs服務端。具有以下特性:

  • 管理所有Kong Admin API物件。
  • 支援從遠端源(資料庫,檔案,API等)匯入使用者。
  • 管理多個Kong節點。使用快照備份,還原和遷移Kong節點。
  • 使用執行狀況檢查監視節點和API狀態。
  • 支援電子郵件和閒置通知。
  • 支援多使用者。
  • 易於資料庫整合(MySQL,postgresSQL,MongoDB,SQL Server)。

Kubernetes安裝Konga資料庫postgres

  1. 我們今天通過Kubernetes來安裝Konga。安裝步驟同樣遵循先配置postgres資料庫,初始化資料庫,啟動容器的流程

  2. 第二步配置konga 容器,然後連線postgres資料庫,啟動konga

  3. 配置konga連線kong admin 8001或者8444埠,配置kong的引數

Kubernetes 部署 Konga資料庫容器postgres

要在Kubernetes上部署PostgreSQL,我們需要遵循以下步驟:

  • Postgres Docker映像
  • 用於儲存Postgres配置的配置對映
  • 永久儲存量
  • PostgreSQL部署
  • PostgreSQL服務

PostgreSQL Docker映像

我們正在使用公共登錄檔中的PostgreSQL 10.4 Docker映像。該映像將提供提供PostgreSQL自定義配置/環境變數(如使用者名稱,密碼,資料庫名稱和路徑等)的功能。

PostgreSQL配置的配置對映

我們將使用配置對映來儲存PostgreSQL相關資訊。在這裡,我們在配置對映中使用資料庫,使用者和密碼,部署模板中的PostgreSQL pod將使用該資料庫,使用者和密碼。

檔案:postgres-configmap.yaml

[root@localhost postgres]# cat postgres-configmap.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: postgres-config
  namespace: kong
  labels:
    app: postgres
data:
  POSTGRES_DB: postgresdb
  POSTGRES_USER: admin
  POSTGRES_PASSWORD: admin

建立Postgres配置資源

$ kubectl create -f postgres-configmap.yaml 

永久儲存量StorageClass

眾所周知,容器本質上是短暫的。容器例項終止後,由容器或容器中生成的所有資料都將丟失。

為了儲存資料,我們將在Kubernetes中使用持久卷和持久卷宣告資源將資料儲存在持久儲存中。

當前我們配置了StorageClass 動態儲存使用,會在下面進行呼叫,不過配置Deployment模式不支援直接掛載StorageClass ,需要將控制器修改成StatefulSet 模式進行掛載。

PostgreSQL部署

用於部署PostgreSQL容器的PostgreSQL清單使用PostgreSQL 10.4映像。它使用的是PostgreSQL配置,例如使用者名稱,密碼和我們之前建立的configmap中的資料庫名。它還會掛載從持久卷建立的卷,並宣告使PostgreSQL容器的資料持久化。

[root@localhost postgres]# cat postgres-statefulSet.yaml 
apiVersion: apps/v1
kind: StatefulSet 
metadata:
  name: postgres
  namespace: kong
spec:
  serviceName: postgres
  replicas: 1
  selector:
    matchLabels:
      app: postgres 
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
        - name: postgres
          image: postgres:10.4 
          imagePullPolicy: "IfNotPresent"
          ports:
            - containerPort: 5432
          envFrom:
            - configMapRef:
                name: postgres-config
          volumeMounts:
            - mountPath: /var/lib/postgresql/data
              name: postgredb
  volumeClaimTemplates:
  - metadata:
      name: postgredb
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 5Gi
      storageClassName: "standard"		

建立Postgres部署

$ kubectl create -f postgres-deployment.yaml

PostgreSQL Service

要訪問部署或容器,我們需要配置PostgreSQL服務。Kubernetes提供了不同型別的服務,例如ClusterIP,NodePort和LoadBalancer。

使用ClusterIP,我們可以在Kubernetes中訪問PostgreSQL服務。NodePort可以在Kubernetes節點上公開服務端點。為了從外部訪問PostgreSQL,我們需要使用Load Balancer服務型別,該服務型別可以在外部公開該服務。

檔案:postgres-service.yaml

[root@localhost postgres]# cat postgres-service.yaml 
apiVersion: v1
kind: Service
metadata:
  name: postgres
  namespace: kong
  labels:
    app: postgres
spec:
  type: NodePort
  ports:
   - port: 5432
  selector:
   app: postgres

建立Postgres服務

$ kubectl create -f postgres-service.yaml

連線到PostgreSQL

為了連線PostgreSQL,我們需要從服務部署中獲取Node埠。

[root@localhost postgres]# kubectl get svc postgres -n kong 
NAME       TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
postgres   NodePort   10.98.211.186   <none>        5432:30761/TCP   14h

我們需要使用埠31070從kubernetes叢集中存在的機器/節點連線到PostgreSQL,並使用前面configmap中給出的憑據。

$ psql -h localhost -U admin --password -p 30761 postgresdb
# 通過psql 命令進行連線

PostgreSQL結論

與僅使用虛擬機器時相比,在Kubernetes上執行PostgreSQL有助於以更好的方式利用資源。Kubernetes還使用同一虛擬機器或Kubernetes叢集中的PostgreSQL提供其他應用程式的隔離。

是否可以使用StatefulSets嗎?

在Kubernetes中,需要StatefulSets來擴充套件有狀態的應用程式。可以使用StatefulSets通過單個命令輕鬆擴充套件PostgreSQL。

Kubernetes安裝Konga

  1. 我們今天通過Kubernetes來安裝Konga。安裝步驟同樣遵循先配置postgres資料庫,初始化資料庫,啟動容器的流程

  2. 第二步配置konga 容器,然後連線postgres資料庫,啟動konga

  3. 配置konga連線kong admin 8001或者8444埠,配置kong的引數

配置konga Secret加密資訊

建立配置konga Secret加密資訊連線PostgreSQL資料庫。

[root@localhost konga]# cat konga-creds.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: kongcreds
  namespace: kong 
type: Opaque
data:
  username: YWRtaW4= 
  password: YWRtaW4= 
  postgresdbname: cG9zdGdyZXNkYg==
#your secret in base64 echo -n 'admin' | base64 YWRtaW4=

[root@localhost konga]# kubectl get secret -n kong 
NAME                              TYPE                                  DATA   AGE
kongcreds                         Opaque                                3      26h

配置konga Deployment Pod

通過Konga Deployment 引用secret 配置檔案,同時在配置連線地址時,設定成service 內部dns 域名連線,具體配置檔案如下:

[root@localhost konga]# cat konga-deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: konga
  namespace: kong
spec:
  replicas: 1
  selector:
    matchLabels:
      app: konga
  template:
    metadata:
      labels:
        name: konga
        app: konga
    spec:
      containers:
      - name: konga
        image: pantsel/konga:latest 
        env:
        - name: DB_ADAPTER
          value: postgres
        - name: DB_HOST
          value: postgres.kong.svc.cluster.local.
        - name: DB_USER
          valueFrom:
            secretKeyRef:
              name: kongcreds
              key: username
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: kongcreds
              key: password
        - name: DB_DATABASE
          value: postgresdb
        - name: TOKEN_SECRET
          value: somesecretstring
        ports:
        - containerPort: 1337
          protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: konga
  name: konga-svc
  namespace: kong
spec:
  ports:
    - protocol: TCP
      port: 443
      targetPort: 1337
  selector:
    app: konga

配置konga Ingress 域名對外

[root@localhost konga]# cat konga-admin-ingress-demo.yaml 
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  labels:
    ingresscontroller: kong
  annotations:
    kubernetes.io/ingress.class: kong 
  name: kong-admin
  namespace: kong
spec:
  rules:
  - host: konga-admin.mydomain.com
    http:
      paths:
      - backend:
          serviceName: konga-svc
          servicePort: 443
        path: /

測試訪問konga 頁面

通過Ingress 域名 konga-admin.mydomain.com訪問,首先會進行管理員賬號和密碼建立,然後進入Connections 介面 連線對應kong節點。

注意當前我沒有使用Ingress 域名,是直接使用埠對映進去的,生產情況下建議使用Ingress 域名。

  1. 登入Konga 介面

  1. 建立一個新的Kong 節點連線

  1. 建立成功之後點選連線

  1. 連線成功之後,可以看到整體的kong節點的配置和概況

  1. 因為我之前建立了兩個Ingress 對映域名,所以在konga service選項和Routes選項會展示出來

  1. 配置好konga管理後臺之後,我們可以通過konga 後臺直接對kong進行管理,圖形化介面建立Service和Routes 或者其他功能和引數的修改,都可以在konga web 介面進行操作。本章到這裡也就告一段落了,後面我會介紹下關於kong節點的配置檔案。

Kong API Gateway 配置檔案詳解

配置檔案這塊轉載該部落格,https://linuxops.org/blog/kong/config.html

下面介紹的配置檔案,可以直接在自定義映象修改對應的配置,也可以在konga web介面進行修改。

兩個主要元件

  • Kong Server,基於 nginx 的伺服器,用來接收 API 請求。下面主要是對配置檔案進行詳解。後面也可以通過Kong API Gateway 管理API詳解,對kong進行操作。Kong 功能強大注意還是因為它支援強大的外掛功能。
  • Apache Cassandra,用來儲存操作資料。

一、前言

Kong配置檔案是Kong服務的核心檔案,它配置了Kong以怎麼的方式執行,並且依賴於這個配置生成Nginx的配置檔案,本文通過解讀Kong配置檔案,以瞭解Kong的執行和配置。

在成功安裝Kong以後,會有一個名為kong.conf.default預設的配置檔案示例,如果是通過包管理器安裝的,通常位於/etc/kong/kong.conf.default,我們要將其複製為kong.conf以便於我們修改使用他。

在Kong的配置檔案中,約定了以下的幾條規則:

  • 配置檔案中以#開頭的行均為註釋行,程式不會讀取這些內容。
  • 在官方提供的預設配置檔案中,以#開頭的有值的配置專案均為預設配置。
  • 所有的配置項,均可以在系統環境變數中配置,但是必須要加上KONG_為字首。
  • 值為布林型的配置,可以使用on/off或者true/false
  • 值為列表的,必須使用半形逗號分割。

Kong的配置,大概分為幾種,分別是:

  • 常規配置:配置服務執行目錄,外掛載入,日誌等等
  • NGINX配置:配置Nginx注入,例如監聽IP和埠配置等等,用於Kong在啟動的時候生成Nginx配置檔案
  • 資料庫儲存配置:配資料庫型別,地址、使用者名稱密碼等等資訊
  • 資料庫快取配置:配置資料的快取規則,Kong會快取諸如API資訊、使用者、憑證等資訊,以減少訪問資料庫次數提高效能
  • DNS解析器配置:預設情況會使用系統設定,如hostsresolv.conf的配置,你也可以通過DNS的解析器配置來修改
  • 其他雜項配置:繼承自lua-nginx模組的其他設定允許更多的靈活性和高階用法。

下面我們一個模組一個模組解釋一下各項的配置。

二、常規配置

在常規配置中,主要是控制Kong一些執行時的一些配置,主要有如下配置:

配置項 預設值 說明
prefix /usr/local/kong/ 配置Kong的工作目錄,相當於Nginx的工作目錄,這個目錄存放執行時的臨時檔案和日誌,包括Kong啟動的時候自動生成的Nginx的配置檔案。 每一個Kong經常必須有一個單獨的工作目錄
log_level notice Nginx的日誌級別。日誌存放/logs/error.log
proxy_access_log logs/access.log 代理埠請求的日誌檔案,可以設定為off來關閉日誌的記錄,也可以通過設定絕對路徑也可以設定相對路徑。 如果設定了相對路徑,則日誌檔案會儲存在的目錄下
proxy_error_log logs/error.log 代理埠請求的錯誤日誌檔案,可以設定為off來關閉日誌的記錄,也可以通過設定絕對路徑也可以設定相對路徑。 如果設定了相對路徑,則日誌檔案會儲存在的目錄下
admin_access_log logs/admin_access.log Kong管理的API埠請求的日誌檔案,可以設定為off來關閉日誌的記錄,也可以通過設定絕對路徑也可以設定相對路徑。 如果設定了相對路徑,則日誌檔案會儲存在的目錄下
admin_error_log logs/error.log Kong管理的API埠請求的錯誤日誌檔案,可以設定為off來關閉日誌的記錄,也可以通過設定絕對路徑也可以設定相對路徑。 如果設定了相對路徑,則日誌檔案會儲存在的目錄下
plugins bundled Kong啟動的時候載入的外掛,如果多個必須要使用半形逗號分割。預設情況下,只有捆綁官方發行版本的外掛通過 bundled 這個值來載入。 載入外掛只是Kong在啟動的時候載入外掛的程式碼,但是並不會使用它,如果要使用他,還必須要通過管理API來配置 當然,如果你不想載入任何外掛,可以使用off來關閉它,值得強調的一點bundled值可以和其他外掛名稱一起使用,bundled並不是一個外掛名稱,它代表了隨官方發行的所有外掛。
anonymous_reports on 如果Kong程序發生了錯誤,會以匿名的方式將錯誤提交給Kong官方, 以幫助改善Kong。

在常規的配置中,主要配置了Kong執行的目錄日誌等資訊。

無論如何,配置的檔案或者目錄Kong必須要用許可權訪問,否則會報錯。

三、Nginx注入配置

Kong基於Nginx,當然需要配置Nginx來滿足Kong的執行要求,Kong提供了Nginx的注入配置,使得我們更輕鬆控制。

在Nginx注入配置中,有如下配置:

配置項 預設值 說明
proxy_listen 0.0.0.0:8000, 0.0.0.0:8443 ssl 配置Kong代理監聽的地址和埠,這個是Kong的入口,API呼叫都將通過這個埠請求。這個配置和Ngxin中的配置一致,通過SSL可以指定接受https的請求 支援IPv4和IPv6
admin_listen 127.0.0.1:8001, 127.0.0.1:8444 ssl 配置Kong的管理API監聽的埠,和proxy_listen配置一樣,但是這個配置不建議監聽在公網IP上。
nginx_user nobody nobody 配置Nginx的使用者名稱和使用者組,和Nginx的配置規則一樣
nginx_worker_processes auto 設定Nginx的程序書,通常等於CPU核心數
nginx_daemon on 是否以daemon的方式執行Ngxin
mem_cache_size 128m 記憶體的快取大小,可以使用km為單位
ssl_cipher_suite modern 定義Nginx提供的TLS密碼,可以配置的值有:modern,intermediate, old, custom.
ssl_ciphers 定義Nginx提供的TLS密碼的列表,參考Nginx的配置
ssl_cert 配置SSL證書的crt路徑,必須是要絕對路徑
ssl_cert_key 設定SSL證書的key檔案,必須是絕對路徑
client_ssl off .....
client_ssl_cert .....
client_ssl_cert_key .....
admin_ssl_cert .....
admin_ssl_cert_key .....
headers server_tokens, latency_tokens 設定再相應客戶端時候應該注入的頭部,可以設定的值如下: - server_tokens: 注入'Via'和'Server'頭部. - latency_tokens: 注入'X-Kong-Proxy-Latency'和'X-Kong-Upstream-Latency' 頭部. - X-Kong-<header-name>: 只有在適當的時候注入特定的頭部 這個配置可以被設定為off。當然,即便設定了off以後,外掛依然可以注入頭部
trusted_ips 定義可信的IP地址段,通常不建議在此處限制請求,應該再外掛中過濾
real_ip_header X-Real-IP 獲取客戶端真實的IP,將值通過同步的形式傳遞給後端
real_ip_recursive off 這個值在Nginx配置中設定了同名的ngx_http_realip_module指令
client_max_body_size 0 配置Nginx接受客戶端最大的body長度,如果超過此配置 將返回413。 設定為0則不檢查長度
client_body_buffer_size 8k 設定讀取緩衝區大小,如果超過記憶體緩衝區大小,那麼NGINX會快取在磁碟中,降低效能。
error_default_type text/plain 當請求' Accept '頭丟失,Nginx返回請求錯誤時使用的預設MIME型別。可以配置的值為: text/plain,text/html, application/json, application/xml.

在Nginx注入配置中,配置了Nginx的基本的引數,這些引數大部分和NGINX的配置值是一樣的,可以通過Nginx的配置文件瞭解一下。

四、 資料庫儲存配置

資料庫配置的模組配置資料庫相關的連線資訊等等。主要有如下配置:

配置項 預設值 說明
database postgres 設定資料庫型別,Kong支援兩種資料庫,一種是postgres,一種是cassandra
PostgreSQL配置 如果database設定為postgres以下配置生效
pg_host 127.0.0.1 設定PostgreSQL的連線地址
pg_port 5432 設定PostgreSQL的埠
pg_user kong 設定PostgreSQL的使用者名稱
pg_password 設定PostgreSQL的密碼
pg_database kong 設定資料庫名稱
pg_ssl off 是否開啟ssl連線
pg_ssl_verify off 如果啟用了' pg_ssl ',則切換伺服器證書驗證。
cassandra配置 如果database設定為cassandra以下配置生效
cassandra_contact_points 127.0.0.1 .....
cassandra_port 9042 .....
cassandra_keyspace kong .....
cassandra_timeout 5000 .....
cassandra_ssl off .....
cassandra_ssl_verify off .....
cassandra_username kong .....
cassandra_password .....
cassandra_consistency ONE .....
cassandra_lb_policy RoundRobin .....
cassandra_local_datacenter .....
cassandra_repl_strategy SimpleStrategy .....
cassandra_repl_factor 1 .....
cassandra_data_centers dc1:2,dc2:3 .....
cassandra_schema_consensus_timeout 10000 .....

推薦使用PostgreSQL資料庫作為生產環境的儲存,PostgreSQL具有良好的效能和穩定性,是一個非常優秀的開源資料庫。

五、 資料庫快取配置

在上一節中,配置了Kong持久化儲存,顯然如果每次的請求都需要去查詢資料庫中的相關資訊那無疑是非常消耗資源,效能和穩定性也會大大降低,作為一個API閘道器肯定是不能忍的,解決這個問題的辦法就是快取,Kong將資料快取在記憶體中,這樣會大大提高效能,本節介紹Kong的快取配置。

配置項 預設值 說明
db_update_frequency 5 節點更新資料庫的時間,以秒為單位。 這個配置設定了節點查詢資料庫的時間,假如有3臺Kong伺服器節點ABC,如果再A節點增加了一個API閘道器,那麼B和C節點最多需要等待db_update_frequency時間才能被更新到。
db_update_propagation 0 資料庫節點的更新時間。 如果使用了Cassandra資料庫叢集,那麼如果資料庫有更新,最多需要db_update_propagation時間來同步所有的資料庫副本。 如果使用PostgreSQL或者單資料庫,這個值可以被設定為0
db_cache_ttl 0 快取生效時間,單位秒。如果設定為0表示永不過期 Kong從資料庫中讀取資料並且快取,在ttl過期後會刪除這個快取然後再一次讀取資料庫並快取
db_resurrect_ttl 30 快取重新整理時間,單位秒。當資料儲存中的陳舊實體無法重新整理時(例如,資料儲存不可訪問),應該對其進行恢復。當這個TTL過期時,將嘗試重新整理陳舊的實體。

六、 DNS解析器配置

預設情況下,DNS解析器將使用標準配置檔案/etc/hosts/etc/resolv.conf。如果設定了環境變數LOCALDOMAINRES_OPTIONS,那麼後一個檔案中的設定將被覆蓋。

配置項 預設值 說明
dns_resolver 配置DNS伺服器列表,用半形逗號分割,每個條目使用ip[:port]的格式,這個配置僅提供給Kong使用,不會覆蓋節點系統的配置,如果沒有配置則使用系統的設定。接受IPv4和IPv6的地址。
dns_hostsfile /etc/hosts 配置Kong的hosts檔案,這個配置同樣僅提供給Kong使用,不會覆蓋節點系統的配置。 需要說明的是這個檔案僅讀取一次,讀取的內容會快取再記憶體中,如果修改了此檔案,必須要重啟Kong才能生效。
dns_order LAST,SRV,A,CNAME 解析不同記錄型別的順序。“LAST”型別表示最後一次成功查詢的型別(用於指定的名稱)
dns_stale_ttl 4 配置DNS記錄快取過期時間
dns_not_found_ttl 30 這個配置值不知道該如何理解??
dns_error_ttl 1 .....
dns_no_sync off 如果啟用了該項,那麼在DNS快取過期之後,每一次請求都會發起DNS查詢。在禁用此項時,那麼相同的域名多次請求會同步到一個查詢中共享返回值。

在DNS配置中,我們基本上不需要更改,官網的配置給出了最優的配置。如果我們需要在host檔案中定義後端繫結的域名,一定要在編輯hosts檔案後重載Kong的配置,或者重啟Kong,無論hosts的檔案是否是/etc/hosts,否則都不會生效的。

七、 其他雜項配置

雜項配置基本上關於LUA的配置,如果不熟悉請不要修改,按照官方預設即可。

配置項 預設值 說明
lua_ssl_trusted_certificate ....
lua_ssl_verify_depth 1 ....
lua_package_path ./?.lua;./?/init.lua; ....
lua_package_cpath ....
lua_socket_pool_size 30 ....

Kong基本功能說明

基礎功能(konga為例)

應用級選單

  1. Connections Kong連線,用於配置Kong的AdminAPI地址,配置成功之後,將會開啟Kong級選單。
  2. Snapshots 快照,用於儲存Kong節點快照,可快速恢復節點配置。

API閘道器選單

  1. Consumers API閘道器消費者,用於各類認證以及限流控制等;
  2. Services 服務,用於配置上游服務的資訊,主要包括服務名稱、上游的Host以及Port等;
  3. Routes 路由,用於配置下游的路由資訊,定義服務的出口路徑,主要包括路由名稱、Host、Path、Methods以及Http/Https等;
  4. Plugins 外掛,可配置於Service或Route,主要包括認證、安全、限流、監控、日誌以及自定義幾大模組,官方提供了較為全面的基礎外掛功能;
  5. Upstreams 類nginx中的Upstream,用於配置上游的服務資訊;
  6. Certificates 證書管理。

服務配置

1.新增服務: Services -> Create Services 例項:

說明:由於這裡的Kong部署在K8S環境中,所以可以直接使用K8S中的服務名+埠號來定義服務的Host和Port。

2.新增路由: Services -> Service Detail -> Routes -> Add Route 例項:

配置完成之後,我們就可以訪問我們的服務了。

# https://192.168.0.231:31617/config 或 http://192.168.0.231:32740/config Host: config.kong
> curl -ik -H "Host":"config.kong" https://192.168.0.231:31617/config/basic/dev
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Date: Thu, 17 Oct 2019 02:05:16 GMT
Server: Kestrel
X-Kong-Upstream-Latency: 3
X-Kong-Proxy-Latency: 10007
Via: kong/1.3.0

{"logLevel":"Debug",...}
複製程式碼

外掛配置

外掛新增有兩個入口: 1.服務外掛 Servcies -> Service Detail -> Plugins -> Add Plugin 2.路由外掛 Routes -> Route Detail -> Plugins -> Add Plugin

認證

 1.Basic 認證
 Header: Authorization Basic base64(username:password)

 2.Jwt認證
 支援三種認證引數傳遞:uri param,cookie and header,可自定義鍵名
 key claim一般為iss
 jwt生成 & 校驗:https://jwt.io/

 3.OAuth2認證
 認證地址:oauth2/authorize
 獲取token地址: oauth2/token
 重新整理token地址: oauth2/token

安全

 1. Acl 訪問控制列表
 2. Cors  跨域資源共享
 3. Ip Restriction IP限制
 4. Bot Detection 機器人檢測

限流

 1. Rate Limiting 速率限制
 2. Response Ratelimiting 響應速率限制
 3. Request Size Limiting  請求大小限制
 4. Request Termination 請求阻斷/終止

日誌

監控

請求轉發

自定義

Kong Admin API

AdminAPI

感謝參考

AdminAPI

shoy160

kirito-moe

非學無以廣才

https://linuxops.org/blog/kong/admin.html

https://blog.csdn.net/twingao/article/details/104073289