Kong Web图形化管理工具Konga部署安装
📅 2020-06-04 | 🖱️
因为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提供服务即可:
1admin:
2 enabled: true # 开启Admin API
3 type: ClusterIP
4 annotations:
5 konghq.com/protocol: https
6
7ingressController:
8 ingressClass: kong
9postgresql:
10 enabled: false
11
12proxy:
13 type: ClusterIP
14 http:
15 hostPort: 80
16 tls:
17 hostPort: 443
18
19nodeSelector:
20 node-role.kubernetes.io/edge: ''
21affinity:
22 podAntiAffinity:
23 requiredDuringSchedulingIgnoredDuringExecution:
24 - labelSelector:
25 matchExpressions:
26 - key: app.kubernetes.io/instance
27 operator: In
28 values:
29 - kong
30 - key: app.kubernetes.io/name
31 operator: In
32 values:
33 - kong
34 topologyKey: kubernetes.io/hostname
35tolerations:
36 - key: node-role.kubernetes.io/master
37 operator: Exists
38 effect: NoSchedule
39 - key: node-role.kubernetes.io/master
40 operator: Exists
41 effect: PreferNoSchedule
更新ingress-kong的helm release:
1helm upgrade ingress-kong kong/kong -n ingress-kong -f kong-values.yml
上面对release ingress-kong的更新是在k8s中创建了service ingress-kong-kong-admin:
1get svc ingress-kong-kong-admin -n ingress-kong
2NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
3ingress-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
:
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4 labels:
5 app: konga
6 name: konga
7 namespace: ingress-kong
8spec:
9 replicas: 1
10 selector:
11 matchLabels:
12 app: konga
13 strategy:
14 rollingUpdate:
15 maxSurge: 1
16 maxUnavailable: 1
17 type: RollingUpdate
18 template:
19 metadata:
20 labels:
21 app: konga
22 spec:
23 initContainers:
24 - name: dbmigration
25 image: pantsel/konga
26 command:
27 - node
28 - /app/bin/konga.js
29 - prepare
30 - --adapter
31 - mysql
32 - --uri
33 - mysql://konga:[email protected]:3306/kongadb
34 containers:
35 - name: konga
36 image: pantsel/konga
37 env:
38 - name: DB_ADAPTER
39 value: mysql
40 - name: DB_URI
41 value: mysql://konga:[email protected]:3306/kongadb
42 - name: NODE_ENV
43 value: production
44 - name: NODE_TLS_REJECT_UNAUTHORIZED
45 value: "0"
46 ports:
47 - containerPort: 1337
48 protocol: TCP
49 restartPolicy: Always
上面的deployment部署文件中,使用初始化容器在pod启动前完成konga所需mysql数据库schema的migration,第一次启动时在kongadb中创建了下面的数据库表:
1+-------------------------------+
2| Tables_in_kongadb |
3+-------------------------------+
4| konga_api_health_checks |
5| konga_email_transports |
6| konga_kong_nodes |
7| konga_kong_services |
8| konga_kong_snapshot_schedules |
9| konga_kong_snapshots |
10| konga_kong_upstream_alerts |
11| konga_netdata_connections |
12| konga_passports |
13| konga_settings |
14| konga_users |
15+-------------------------------+
konga.svc.yml
:
1apiVersion: v1
2kind: Service
3metadata:
4 name: konga
5 namespace: ingress-kong
6spec:
7 ports:
8 - name: http
9 protocol: TCP
10 port: 1337
11 targetPort: 1337
12 selector:
13 app: konga
14 type: ClusterIP
创建存放konga.example.com ssl证书的secret:
1kubectl create secret tls example-com-tls-secret \
2 --cert=cert.pem \
3 --key=key.pem \
4 -n ingress-kong
konga.ingress.yml
:
1apiVersion: networking.k8s.io/v1
2kind: Ingress
3metadata:
4 annotations:
5 kubernetes.io/ingress.class: kong
6 konghq.com/protocols: "https"
7 name: konga
8 namespace: ingress-kong
9spec:
10 rules:
11 - host: konga.example.com
12 http:
13 paths:
14 - backend:
15 service:
16 name: konga
17 port:
18 number: 1337
19 path: /
20 pathType: Prefix
21 tls:
22 - hosts:
23 - konga.example.com
24 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。