因为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: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中创建了下面的数据库表:
- +-------------------------------+
- | 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-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访问,第一次打开这个页面时需要按页面的引导完成初始化配置。 首先创建一个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。