背景
随着k8s的成熟,在k8s上使用ingress-nginx、traefik、apisix等各类ingress的人也越来越多。ingress-kong也可以作为k8s的ingress使用,当然kong也可以单独作为微服务的gateway网关来使用。
如果kong是作为ingress来使用,那么需要使用kong镜像来部署一个ingress-kong和一个kong/kubernetes-ingress-controller镜像来部署一个kong的ingress-controller。还需要部署sa账号和rbac,还有CRD资源。
如果kong只是作为一个gateway来替换springcloud中的gateway来使用,那么只需要部署sa账号和rbac,然后用kong镜像部署一个pod即可当做gateway使用,crd也就不需要了。
kong和konga支持MySQL、MongoDB、PostgresSQL三种数据库。而我这里选择的是PostgresSQL。因为公司都是all in docker,all in kubernetes,因此这里也就选择了在k8s中部署kong和konga。下面记录了一下部署kong和konga过程中遇到的一些报错和排查解决方案思路手段。
部署konga
- $catkong-ui-pre.yaml
- —
- apiVersion:apps/v1
- kind:Deployment
- metadata:
- labels:
- appName:konga-ui-aggre-sit
- appEnv:sit
- name:konga-ui-aggre-sit
- namespace:kong
- spec:
- replicas:1
- selector:
- matchLabels:
- appName:konga-ui-aggre-sit
- appEnv:sit
- template:
- metadata:
- labels:
- appName:konga-ui-aggre-sit
- appEnv:sit
- spec:
- imagePullSecrets:
- –name:registry-auth
- containers:
- -env:
- –name:NODE_ENV
- value:\”production\”
- –name:DB_ADAPTER
- value:\”postgres\”
- –name:DB_HOST
- value:\”你自己的pgsql地址\”
- –name:DB_PORT
- value:\”你自己的pgsql端口\”
- –name:DB_USER
- value:\”kong\”
- –name:DB_PASSWORD
- value:\”你自己的pgsql密码\”
- –name:DB_DATABASE
- value:\”konga\”
- –name:TOKEN_SECRET
- value:\”自己生成随机字符串\”
- –name:NO_AUTH
- value:\”false\”
- –name:NODE_TLS_REJECT_UNAUTHORIZED
- value:\”0\”
- image:registry.ayunw.cn/kube-system/pantsel/konga:0.14.9
- imagePullPolicy:IfNotPresent
- livenessProbe:
- failureThreshold:3
- httpGet:
- path:/
- port:1337
- scheme:HTTP
- initialDelaySeconds:5
- periodSeconds:10
- successThreshold:1
- timeoutSeconds:1
- name:konga-ui-aggre-sit
- ports:
- -containerPort:1337
- name:kong-ui
- protocol:TCP
- readinessProbe:
- failureThreshold:3
- httpGet:
- path:/
- port:1337
- scheme:HTTP
- initialDelaySeconds:5
- periodSeconds:10
- successThreshold:1
- timeoutSeconds:1
- serviceAccountName:kong-serviceaccount
我部署kong和konga的时候使用的是pgsql,根据GitHub上的文档上说明得知,在使用NODE_ENV为production的时候需要手动去初始化pgsql。看了一下kong官网的文档来初始化,官网文档:https://docs.konghq.com/install/docker/
初始化pgsql报错
- $dockerrun–rm–network=kong-net-e\”KONG_DATABASE=postgres\”\\
- >-e\”KONG_PG_HOST=pgsql地址\”\\
- >-e\”KONG_PG_USER=konga\”\\
- >-e\”KONG_PG_PASSWORD=pgsql密码\”\\
- >-e\”KONG_PG_DATABASE=konga\”\\
- >-e\”KONG_PG_PORT=3306\”\\
- >registry.ayunw.cn/kong/kong-custom:382-ffaf4d50kongmigrationsup
- Unabletofindimage\’registry.ayunw.cn/kong/kong-custom:382-ffaf4d50\’locally
- 382-ffaf4d50:Pullingfromkong/kong-custom
- 0a6724ff3fcd:Pullcomplete
- 274efec6805c:Pullcomplete
- 4bb58967a4ce:Pullcomplete
- 3f59fb9af44b:Pullcomplete
- 7e3ec18b9226:Pullcomplete
- ce8acfac03f7:Pullcomplete
- Digest:sha256:453dea194d4e39275ea771d062262f0868e29120fc529702dea10278677413c2
- Status:Downloadednewerimageforregistry.ayunw.cn/kong/kong-custom:382-ffaf4d50
- Error:[PostgreSQLerror]failedtoretrievePostgreSQLserver_version_num:temporaryfailureinnameresolution
- Runwith–v(verbose)or–vv(debug)formoredetails
想了一下,他这个完全是docker部署kong而不是k8s中部署kong,因此他会需要创建一个docker的network为kong-net,然后保证所有kong相关的服务都跑在同一个网络中。那我这里是部署在k8s中,且pgsql也是买的云的服务,所以我这里其实是不应该这样子来进行初始化的。
然后上github,找到https://github.com/pantsel/konga/tree/master文档上的Production Docker Image步骤中的Prepare the database来操作。
但是里面可能有一个参数解释的不是很清楚,我自己一开始也是比较模糊的,就是https://github.com/pantsel/konga上Production Docker Image步骤下的Prepare the database步骤中的connection-uri参数,你会发现他似乎没给出connection-uri的这个uri的例子是什么样子的。但是其实你会发现在这个github中的Production步骤有写一条url和这个比较类似的,告诉你在使用MySQL或者PostgresSQL的时候应该怎么初始化,命令是:node ./bin/konga.js prepare –adapter postgres –uri postgresql://localhost:5432/konga。但是注意,这个命令他应该不是在你将konga部署在k8s中来使用的。但是这里就有一条url:postgresql://localhost:5432/konga,可以用来参考,那么也就是说差不多就是这个样子的url了,但是应该还需要带上用户名和密码。
其实这里我还犯了一个错误,就是其实一开始我初始化的pgsql命令中pgsql的url写错了,看了https://github.com/pantsel/konga/tree/master中的文档后,手敲命令,将postgresql://localhost:5432/konga敲成了postgre://localhost:5432/konga,所以初始化的时候也报错了。
更改后重新初始化
- $dockerrunregistry.ayunw.cn/kube-system/pantsel/konga:0.14.9-cprepare-apostgres-upostgresql://konga:pgsql密码@pgsql地址:pgsql端口/konga
- debug:Preparingdatabase…
- UsingpostgresDBAdapter.
- FailedtoconnecttoDBError:getaddrinfoEAI_AGAINkonga
- atGetAddrInfoReqWrap.onlookup[asoncomplete](dns.js:64:26){
- errno:\’EAI_AGAIN\’,
- code:\’EAI_AGAIN\’,
- syscall:\’getaddrinfo\’,
- hostname:\’konga\’
- }
然后想到了因为“#”导致的问题。甚至尝试了将密码用单引号或者双引号括起来尝试,仍然报错,然后将整个连接pgsql的url全部用单引号或者双引号括起来,也都是没有用。再查了一下google发现需要将“#”符号改成%23。
再次初始化
- $dockerrunregistry.ayunw.cn/kube-system/pantsel/konga:0.14.9-cprepare-apostgres-upostgresql://konga:pgsql密码@pgsql地址:pgsql端口/konga
- debug:Preparingdatabase…
- UsingpostgresDBAdapter.
- Databaseexists.Continue…
- debug:Hook:api_health_checks:process()called
- debug:Hook:health_checks:process()called
- debug:Hook:start-scheduled-snapshots:process()called
- debug:Hook:upstream_health_checks:process()called
- debug:Hook:user_events_hook:process()called
- debug:SeedingUser…
- debug:Userseedplanted
- debug:SeedingKongnode…
- debug:Kongnodeseedplanted
- debug:SeedingEmailtransport…
- debug:Emailtransportseedplanted
- debug:Databasemigrationscompleted!
初始化成功
总结部署konga遇到的问题
1、文档中写的connection-uri的话必须不能写错,postgresql不要写成postgres
2、密码中有符号“#”要改成%23
部署kong
- —
- #Source:kong-custom-pre-master/templates/deployment.yaml
- apiVersion:apps/v1
- kind:Deployment
- metadata:
- name:kong-custom-pre-master
- namespace:kong
- labels:
- appEnv:pre
- appName:kong-custom
- appGroup:kong
- spec:
- replicas:1
- progressDeadlineSeconds:1800
- minReadySeconds:5
- strategy:
- type:RollingUpdate
- rollingUpdate:
- maxUnavailable:50%
- maxSurge:50%
- selector:
- matchLabels:
- appEnv:pre
- appName:kong-custom
- appGroup:kong
- template:
- metadata:
- labels:
- appEnv:pre
- appName:kong-custom
- appGroup:kong
- spec:
- dnsPolicy:ClusterFirst
- terminationGracePeriodSeconds:10
- serviceAccountName:kong-serviceaccount
- imagePullSecrets:
- –name:registry-auth-kong-pro
- initContainers:
- –name:wait-for-migrations
- image:\”registry.ayunw.cn/kong/kong-custom:398-c44f9085\”
- command:
- -/bin/sh
- –c
- -whiletrue;dokongmigrationsbootstrap;if[[0-eq0]];thenexit0;fi;sleep2;done;
- env:
- #注意这里KONG_DATABASE的value是错误的,应该将Kong改成postgres
- –name:KONG_DATABASE
- value:\”kong\”
- –name:KONG_PG_USER
- value:\”kong\”
- –name:KONG_PG_PORT
- value:\”pgsql端口\”
- –name:KONG_PG_PASSWORD
- value:\”pgsql密码\”
- –name:KONG_PG_HOST
- value:\”pgsql地址\”
- containers:
- –name:kong-custom-pre-master
- image:\”registry.ayunw.cn/kong/kong-custom:398-c44f9085\”
- ports:
- –name:proxy
- containerPort:8000
- protocol:TCP
- –name:proxy-ssl
- containerPort:9443
- protocol:TCP
- –name:metrics
- containerPort:8100
- protocol:TCP
- –name:admin-url
- containerPort:8444
- protocol:TCP
- resources:
- limits:
- cpu:\”5000m\”
- memory:\”1024Mi\”
- requests:
- cpu:\”100m\”
- memory:\”512Mi\”
- lifecycle:
- preStop:
- exec:
- command:
- -/bin/sh
- –c
- -kongquit
- env:
- –name:\”KONG_PROXY_LISTEN\”
- value:\”0.0.0.0:8000,0.0.0.0:9443sslhttp2\”
- –name:\”KONG_PORT_MAPS\”
- value:\”80:8000,443:8443\”
- –name:\”KONG_ADMIN_LISTEN\”
- value:\”0.0.0.0:8444ssl\”
- –name:\”KONG_STATUS_LISTEN\”
- value:\”0.0.0.0:8100\”
- –name:\”KONG_NGINX_WORKER_PROCESSES\”
- value:\”2\”
- –name:\”KONG_ADMIN_ACCESS_LOG\”
- value:\”/dev/stdout\”
- –name:\”KONG_ADMIN_ERROR_LOG\”
- value:\”/dev/stderr\”
- –name:\”KONG_PROXY_ERROR_LOG\”
- value:\”/dev/stderr\”
- #注意这里KONG_DATABASE的value是错误的,应该将Kong改成postgres
- –name:KONG_DATABASE
- value:\”kong\”
- –name:KONG_PG_USER
- value:\”kong\”
- –name:KONG_PG_PORT
- value:\”pgsql端口\”
- –name:KONG_PG_PASSWORD
- value:\”pgsql密码\”
- –name:KONG_PG_HOST
- value:\”pgsql地址\”
查看kong的日志报错
- $kubectllogs-f–tail=20-nkongkong-custom-sit-9c5cf7b69-4q29l
- stacktraceback:
- [C]:infunction\’error\’
- /usr/local/share/lua/5.1/kong/cmd/utils/migrations.lua:16:infunction\’check_state\’
- /usr/local/share/lua/5.1/kong/init.lua:455:infunction\’init\’
- init_by_lua:3:inmainchunk
- nginx:[error]init_by_luaerror:/usr/local/share/lua/5.1/kong/cmd/utils/migrations.lua:16:DatabaseneedsbootstrappingorisolderthanKong1.0.
- Tostartanewinstallationfromscratch,run\’kongmigrationsbootstrap\’.
- Tomigratefromaversionolderthan1.0,migratedtoKong1.5.0first.
- Ifyoustillhave\’apis\’entities,youcanconvertthemtoRoutesandServices
- usingthe\’kongmigrationsmigrate-apis\’commandinKong1.5.0.
- stacktraceback:
- [C]:infunction\’error\’
- /usr/local/share/lua/5.1/kong/cmd/utils/migrations.lua:16:infunction\’check_state\’
- /usr/local/share/lua/5.1/kong/init.lua:455:infunction\’init\’
- init_by_lua:3:inmainchunk
很明显是因为没有执行kong migrations的命令。但是明明在deployment.yaml中的initContainers中已经写了,为何没执行?
原因
是因为kong的deployment.yaml中的initContainers下的env环境变量中KONG_DATABASE写错了,我写成了kong。而根据github:https://github.com/pantsel/konga/tree/master上README.md文档中的Environment variables中所知,KONG_DATABASE这个变量是要指明使用postgres或者MySQL或者off三个选项其中的一个。因为我用的是pgsql,因此这里需要指定postgres,那么初始化就回去pgsql中创建库、表、创建数据等操作,这样才会成功。
更改后,kong启动正常。
写在最后
我在konga的github上没找到manifests直接可以用的yaml清单文件,只找到了chart包,因此我是渲染出来以后然后根据自己的实际环境进行了更改。初次使用难免会遇到杂七杂八的问题。其实也是由于我个人的不细心,没仔细多看几遍文档导致的。有读者如果找到了konga的manifests清单文件也可下方留言交流。也提醒各位小伙伴们,平常也需要注意一下习惯,减少和我犯同样的错误!
原文链接:https://mp.weixin.qq.com/s/YhqOdIDGyvJGVctj-B9-1A