Kong Web 图形化管理工具 Konga 部署安装

因为 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 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 管理用户,如下图所示:

Kong Web 图形化管理工具 Konga 部署安装
管理员用户创建完成后,就可以登录到 konga 中,之后出现创建 konga 到 kong admin api 连接的页面,在连接创建页面填入如下图所示内容:

Kong Web 图形化管理工具 Konga 部署安装
连接创建完成后就可以进入到 konga 的 dashboard 页面,此时 konga 已经和 k8s 中的 kong 连接上,并显示相关信息了:

Kong Web 图形化管理工具 Konga 部署安装
小结
到这里已经完成 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。