因为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提供服务即可:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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:

1
helm upgrade ingress-kong kong/kong -n ingress-kong -f kong-values.yml

上面对release ingress-kong的更新是在k8s中创建了service ingress-kong-kong-admin:

1
2
3
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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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中创建了下面的数据库表:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
+-------------------------------+
| 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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
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:

1
2
3
4
kubectl create secret tls example-com-tls-secret \
  --cert=cert.pem \
  --key=key.pem \
  -n ingress-kong

konga.ingress.yml:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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-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。

参考