Kong Web圖形化管理工具Konga部署安裝
因為kong的社區版不提供dashboard,本文將介紹kong的第三方開源的圖形化管理工具konga在Kubernetes集群上的部署安裝。 konga是一個非官方的第三方開源的kong的圖形化管理工具,konga需要使用kong的Admin API,konga具有如下特性:
- 支持管理所有的Kong Admin API對象
- 從遠程數據源(數據庫、文件、api等)導入Consumer
- 支持管理多個Kong節點
- 通過快照方式備份、恢復和遷移Kong節點
- 對Kong節點和API進行健康檢查監控
創建Kong Admin API的k8s service
前面在《使用helm在Kubernetes集群中部署Kong》一文中介紹了kong在k8s上的最基本安裝,當將kong在k8s上用作ingress controller時,推薦使用配置Ingress和CRDs的方式來配置kong, 而不推薦使用Kong的Admin API,kong官方的helm chart默認安裝時也不會把kong的Admin API暴露出來。而由于konga需要使用Admin API,所以我們先修改之前部署ingress-kong的helm relase,在k8s中創建Kong Admin API的service。 kong-values.yml配置文件如下,注意konga容器內部會訪問kong Admin API,因此admin api的k8s service只需是ClusterIP類型,在k8s集群內部向konga提供服務即可:
- admin:
- enabled: true # 開啟Admin API
- type: ClusterIP
- annotations:
- konghq.com/protocol: https
- ingressController:
- ingressClass: kong
- postgresql:
- enabled: false
- proxy:
- type: ClusterIP
- http:
- hostPort: 80
- tls:
- hostPort: 443
- nodeSelector:
- node-role.kubernetes.io/edge: ''
- affinity:
- podAntiAffinity:
- requiredDuringSchedulingIgnoredDuringExecution:
- - labelSelector:
- matchExpressions:
- - key: app.kubernetes.io/instance
- operator: In
- values:
- - kong
- - key: app.kubernetes.io/name
- operator: In
- values:
- - kong
- topologyKey: kubernetes.io/hostname
- tolerations:
- - key: node-role.kubernetes.io/master
- operator: Exists
- effect: NoSchedule
- - key: node-role.kubernetes.io/master
- operator: Exists
- effect: PreferNoSchedule
更新ingress-kong的helm release:
- helm upgrade ingress-kong kong/kong -n ingress-kong -f kong-values.yml
上面對release ingress-kong的更新是在k8s中創建了service ingress-kong-kong-admin:
- get svc ingress-kong-kong-admin -n ingress-kong
- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
- ingress-kong-kong-admin ClusterIP 10.105.100.17 <none> 8444/TCP 27m
部署konga
konga提供了自己的持久化機制來存儲它的用戶信息和配置信息,支持的數據庫包括MySQL、MongoDB、PostgresSQL,可通過DB_ADAPTER等環境變量指定。 這里使用的是外部的MySQL數據庫。下面分別在k8s上創建如下konga的deployment、service和ingress。
konga.deploy.yml:
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- labels:
- app: konga
- name: konga
- namespace: ingress-kong
- spec:
- replicas: 1
- selector:
- matchLabels:
- app: konga
- strategy:
- rollingUpdate:
- maxSurge: 1
- maxUnavailable: 1
- type: RollingUpdate
- template:
- metadata:
- labels:
- app: konga
- spec:
- initContainers:
- - name: dbmigration
- image: pantsel/konga
- command:
- - node
- - /app/bin/konga.js
- - prepare
- - --adapter
- - mysql
- - --uri
- - mysql://konga:konga147Q=@192.168.100.21:3306/kongadb
- containers:
- - name: konga
- image: pantsel/konga
- env:
- - name: DB_ADAPTER
- value: mysql
- - name: DB_URI
- value: mysql://konga:konga147Q=@192.168.100.21:3306/kongadb
- - name: NODE_ENV
- value: production
- - name: NODE_TLS_REJECT_UNAUTHORIZED
- value: "0"
- ports:
- - containerPort: 1337
- protocol: TCP
- restartPolicy: Always
上面的deployment部署文件中,使用初始化容器在pod啟動前完成konga所需mysql數據庫schema的migration,第一次啟動時在kongadb中創建了下面的數據庫表:
- +-------------------------------+
- | Tables_in_kongadb |
- +-------------------------------+
- | konga_api_health_checks |
- | konga_email_transports |
- | konga_kong_nodes |
- | konga_kong_services |
- | konga_kong_snapshot_schedules |
- | konga_kong_snapshots |
- | konga_kong_upstream_alerts |
- | konga_netdata_connections |
- | konga_passports |
- | konga_settings |
- | konga_users |
- +-------------------------------+
konga.svc.yml:
- apiVersion: v1
- kind: Service
- metadata:
- name: konga
- namespace: ingress-kong
- spec:
- ports:
- - name: http
- protocol: TCP
- port: 1337
- targetPort: 1337
- selector:
- app: konga
- type: ClusterIP
創建存放konga.example.com ssl證書的secret:
- kubectl create secret tls example-com-tls-secret \
- --cert=cert.pem \
- --key=key.pem \
- -n ingress-kong
konga.ingress.yml:
- apiVersion: networking.k8s.io/v1
- kind: Ingress
- metadata:
- annotations:
- kubernetes.io/ingress.class: kong
- konghq.com/protocols: "https"
- name: konga
- namespace: ingress-kong
- spec:
- rules:
- - host: konga.example.com
- http:
- paths:
- - backend:
- service:
- name: konga
- port:
- number: 1337
- path: /
- pathType: Prefix
- tls:
- - hosts:
- - konga.example.com
- secretName: example-com-tls-secret
konga的初始化配置
konga部署成功后,可以使用https://konga.example.com訪問,第一次打開這個頁面時需要按頁面的引導完成初始化配置。 首先創建一個konga管理用戶,如下圖所示:

管理員用戶創建完成后,就可以登錄到konga中,之后出現創建konga到kong admin api連接的頁面,在連接創建頁面填入如下圖所示內容:

連接創建完成后就可以進入到konga的dashboard頁面,此時konga已經和k8s中的kong連接上,并顯示相關信息了:

小結
到這里已經完成konga在k8s集群中的部署,需要注意的是前面kong的部署時dbless模式的,也就是kong沒有使用數據(postgresql或apache cassandra),而且kong在這里用作k8s的ingress controller。 這種情況是不建議通過kong Admin API(或使用konga的web界面)來管理服務的,同時因為kong是dbless的,如果你使用konga Web界面對服務和kong的配置做相關的更新和刪除時也會報類似can't do something when not use a database。 也就是說如果kong是以dbless模式部署的,konga只能作為一個只讀的dashboard使用。最后,當將kong在k8s上用作ingress controller時,還是推薦使用配置Ingress和CRDs的方式來配置kong。