因为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时,推荐使用配置IngressCRDs的方式来配置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-create-admin.png

管理员用户创建完成后,就可以登录到konga中,之后出现创建konga到kong admin api连接的页面,在连接创建页面填入如下图所示内容:

konga-create-conn.png

连接创建完成后就可以进入到konga的dashboard页面,此时konga已经和k8s中的kong连接上,并显示相关信息了:

konga-dashboard.png

小结

到这里已经完成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时,还是推荐使用配置IngressCRDs的方式来配置kong。

参考