因为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:[email protected]:3306/kongadb
containers:
- name: konga
image: pantsel/konga
env:
- name: DB_ADAPTER
value: mysql
- name: DB_URI
value: mysql://konga:[email protected]: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-kongkonga.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-secretkonga的初始化配置
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。