Kong Web圖形化管理工具Konga部署安裝
因?yàn)閗ong的社區(qū)版不提供dashboard,本文將介紹kong的第三方開(kāi)源的圖形化管理工具konga在Kubernetes集群上的部署安裝。 konga是一個(gè)非官方的第三方開(kāi)源的kong的圖形化管理工具,konga需要使用kong的Admin API,konga具有如下特性:
- 支持管理所有的Kong Admin API對(duì)象
- 從遠(yuǎn)程數(shù)據(jù)源(數(shù)據(jù)庫(kù)、文件、api等)導(dǎo)入Consumer
- 支持管理多個(gè)Kong節(jié)點(diǎn)
- 通過(guò)快照方式備份、恢復(fù)和遷移Kong節(jié)點(diǎn)
- 對(duì)Kong節(jié)點(diǎn)和API進(jìn)行健康檢查監(jiān)控
創(chuàng)建Kong Admin API的k8s service
前面在《使用helm在Kubernetes集群中部署Kong》一文中介紹了kong在k8s上的最基本安裝,當(dāng)將kong在k8s上用作ingress controller時(shí),推薦使用配置Ingress和CRDs的方式來(lái)配置kong, 而不推薦使用Kong的Admin API,kong官方的helm chart默認(rèn)安裝時(shí)也不會(huì)把kong的Admin API暴露出來(lái)。而由于konga需要使用Admin API,所以我們先修改之前部署ingress-kong的helm relase,在k8s中創(chuàng)建Kong Admin API的service。 kong-values.yml配置文件如下,注意konga容器內(nèi)部會(huì)訪問(wèn)kong Admin API,因此admin api的k8s service只需是ClusterIP類(lèi)型,在k8s集群內(nèi)部向konga提供服務(wù)即可:
- admin:
- enabled: true # 開(kāi)啟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
上面對(duì)release ingress-kong的更新是在k8s中創(chuàng)建了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提供了自己的持久化機(jī)制來(lái)存儲(chǔ)它的用戶(hù)信息和配置信息,支持的數(shù)據(jù)庫(kù)包括MySQL、MongoDB、PostgresSQL,可通過(guò)DB_ADAPTER等環(huán)境變量指定。 這里使用的是外部的MySQL數(shù)據(jù)庫(kù)。下面分別在k8s上創(chuàng)建如下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啟動(dòng)前完成konga所需mysql數(shù)據(jù)庫(kù)schema的migration,第一次啟動(dòng)時(shí)在kongadb中創(chuàng)建了下面的數(shù)據(jù)庫(kù)表:
- +-------------------------------+
- | 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
創(chuàng)建存放konga.example.com ssl證書(shū)的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訪問(wèn),第一次打開(kāi)這個(gè)頁(yè)面時(shí)需要按頁(yè)面的引導(dǎo)完成初始化配置。 首先創(chuàng)建一個(gè)konga管理用戶(hù),如下圖所示:

管理員用戶(hù)創(chuàng)建完成后,就可以登錄到konga中,之后出現(xiàn)創(chuàng)建konga到kong admin api連接的頁(yè)面,在連接創(chuàng)建頁(yè)面填入如下圖所示內(nèi)容:

連接創(chuàng)建完成后就可以進(jìn)入到konga的dashboard頁(yè)面,此時(shí)konga已經(jīng)和k8s中的kong連接上,并顯示相關(guān)信息了:

小結(jié)
到這里已經(jīng)完成konga在k8s集群中的部署,需要注意的是前面kong的部署時(shí)dbless模式的,也就是kong沒(méi)有使用數(shù)據(jù)(postgresql或apache cassandra),而且kong在這里用作k8s的ingress controller。 這種情況是不建議通過(guò)kong Admin API(或使用konga的web界面)來(lái)管理服務(wù)的,同時(shí)因?yàn)閗ong是dbless的,如果你使用konga Web界面對(duì)服務(wù)和kong的配置做相關(guān)的更新和刪除時(shí)也會(huì)報(bào)類(lèi)似can't do something when not use a database。 也就是說(shuō)如果kong是以dbless模式部署的,konga只能作為一個(gè)只讀的dashboard使用。最后,當(dāng)將kong在k8s上用作ingress controller時(shí),還是推薦使用配置Ingress和CRDs的方式來(lái)配置kong。