当前位置: 首页 > 科技观察

在K8s上部署Kong和Konga真的很难吗?

时间:2023-03-14 21:33:21 科技观察

本文转载自微信公众号《运维开发故事》,作者小江。转载本文请联系运维开发故事公众号。背景随着k8s的成熟,越来越多的人在k8s上使用ingress-nginx、traefik、apisix等ingress。ingress-kong也可以作为k8s的ingress,当然kong也可以单独作为微服务的网关。如果使用kong作为ingress,则需要使用kong镜像部署ingress-kong,使用kong/kubernetes-ingress-controller镜像部署kongingress-controller。您还需要部署sa帐户、rbac和CRD资源。如果只用kong作为网关来代替springcloud中的gateway,那么只需要部署sa账号和rbac,然后再部署一个带有kong镜像的pod作为网关使用即可,不需要crd。Kong和Konga支持三种数据库:MySQL、MongoDB和PostgresSQL。而我这里选择了PostgresSQL。因为公司全在docker,全在kubernetes,所以这里也选择在k8s部署kong和konga。下面记录一下部署kong和konga过程中遇到的一些报错和排查解决方法。部署konga$catkong-ui-pre.yaml---apiVersion:apps/v1kind:Deploymentmetadata:labels:appName:konga-ui-aggre-sitappEnv:sitname:konga-ui-aggre-sitnamespace:kongspec:replicas:1selector:matchLabels:appName:konga-ui-aggre-sitappEnv:sittemplate:metadata:labels:appName:konga-ui-aggre-sitappEnv:sitspec:imagePullSecrets:-name:registry-authcontainers:-env:-name:NODE_ENVvalue:"production"-name:DB_ADAPTERvalue:"postgres"-name:DB_HOSTvalue:"你自己的pgsql地址"-name:DB_PORTvalue:"你自己的pgsql端口"-name:DB_USERvalue:"kong"-name:DB_PASSWORDvalue:"你自己的pgsql密码"-name:DB_DATABASEvalue:"konga"-name:TOKEN_SECRETvalue:"自己生成一个随机字符串"-name:NO_AUTHvalue:"false"-name:NODE_TLS_REJECT_UNAUTHORIZEDvalue:"0"image:registry.ayunw.cn/kube-system/pantsel/konga:0.14.9imagePullPolicy:IfNotPresentlivenessProbe:failureThreshold:3httpGet:path:/port:1337scheme:HTTPInitialDelaySeconds:5periodSeconds:10successThreshold:1timeoutSeconds:1name:konga-ui-aggre-sitports:-containerPort:1337name:kong-uiprotocol:TCPreadinessProbe:failureThreshold:3httpGet:path:/port:1337scheme:HTTPInitialDelaySeconds:5periodSeconds:10successThreshold:1timeoutSecondsName:1WhenkongA服务部署kong和konga,使用pgsql。根据GitHub上的文档,生产环境使用NODE_ENV时需要手动初始化pgsql看了看kong官网的文档进行初始化。官网文档:https://docs.konghq.com/install/docker/Initializepgsqlerror$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"\>注册表。ayunw.cn/kong/kong-custom:382-ffaf4d50kongmigrationsupUnabletofindimage'registry.ayunw.cn/kong/kong-custom:382-ffaf4d50'locally382-ffaf4d50:Pullingfromkong/kong-custom0a6724ff3fcd:Pullcomplete274efec6805c:Pullcomplete4bb58967a4ce:Pullcomplete3f59fb9af44b:Pullcomplete7e3ec18b9226:Pullcompletece8acfac03f7:PullcompleteDigest:sha256:453dea194d4e39275ea771d062262f0868e29120fc529702dea10278677413c2Status:Downloadednewerimageforregistry.ayunw.cn/kong/kong-custom:382-ffaf4d50Error:[PostgreSQLerror]failedtoretrievePostgreSQLserver_version_num:temporaryfailureinnameresolutionRunwith--v(verbose)or--vv(debug)formoredetails想了想,他是在docker中部署kong,而不是在k8s中部署kong,所以他需要创建一个docker网络作为kong-net,然后保证所有kong相关的服务都运行在同一个网络中,所以这里我是部署在k8s中的,pgsql也是购买的云服务,应该不会这样初始化吧。然后去github找到https://github.com/pantsel/konga/tree/master文档上ProductionDockerImage步骤中的Preparethedatabase进行操作。但是里面可能有一个参数不是很清楚。我一开始比较模糊,就是https://github.com/pantsel/konga上ProductionDockerImage步骤下Preparethedatabase步骤中的connection-uri参数,你会发现他好像没有给一个连接uri的uri的示例。但实际上,你会发现在这个github的Production步骤中,有一个类似这个的url,告诉你在使用MySQL或者PostgresSQL时如何初始化。命令为:node./bin/konga.jsprepare--adapterpostgres--uripostgresql://localhost:5432/konga。但是注意在k8s中部署konga时不要使用这个命令。不过这里有个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:pgsqlpassword@pgsqladdress:pgsqlport/kongadebug:Preparingdatabase...UsingpostgresDBAdapter。FailedtoconnecttoDBError:getaddrinfoEAI_AGAINkongaatGetAddrInfoReqWrap.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:pgsqlpassword@pgsqladdress:pgsqlport/kongadebug:Preparingdatabase...UsingpostgresDBAdapter.Databaseexists。继续...调试:挂钩:api_health_checks:process()calleddebug:Hook:health_checks:process()calleddebug:Hook:start-scheduled-snapshots:process()calleddebug:Hook:upstream_health_checks:process()calleddebug:Hook:user_events_hook:process()calleddebug:SeedingUser...debug:Userseedplanteddebug:SeedingKongnode...debug:Kongnodeseedplanteddebug:SeedingEmailtransport...debug:Emailtransportseedplanteddebug:Databasemigrationscompleted!初始化成功部署konga遇到的问题总结1.connection-uri写在document一定不能写错,postgresql不要写成postgres2,密码里的符号“#”要改成%23Deploymentkong---#Source:kong-custom-pre-master/templates/deployment.yamlapiVersion:apps/v1kind:Deploymentmetadata:name:kong-custom-pre-masternamespace:konglabels:appEnv:preappName:kong-customappGroup:kongspec:replicas:1progressDeadlineSeconds:1800minReadySeconds:5strategy:type:RollingUpdaterollingUpdate:maxUnavailable:50%maxSurge:50%selector:matchLabels:appEnv:preappName:kong-customappGroup:kongtemplate:metadata:labels:appEnv:preappName:kong-customappGroup:kongspec:dnsPolicy:ClusterFirstterminationGracePeriodSecondsName:10serviceAccountkong-serviceaccountimagePullSecrets:-name:registry-auth-kong-proinitContainers:-name:wait-for-migrationsimage:"registry.ayunw.cn/kong/kong-custom:398-c44f9085"command:-/bin/sh--c-whiletrue;dokongmigrationsbootstrap;if[[0-eq0]];thenexit0;fi;sleep2;done;env:#注意这里KONG_DATABASE的值是错误的,应该将Kong改成postgres-name:KONG_DATABASEvalue:"kong"-名称:KONG_PG_USER值:“kong”-名称:KONG_PG_PORT值:“pgsql端口”-名称:KONG_PG_PASSWORD值:“pgsql密码”-名称:KONG_PG_HOST值:“pgsql地址”容器:-名称:kong-custom-pre-masterimage:“注册表。ayunw.cn/kong/kong-custom:398-c44f9085"ports:-name:proxycontainerPort:8000协议:TCP名称:代理ssl容器端口:9443协议:TCP名称:度量容器端口:8100协议:TCP名称:管理员url容器端口:8444协议:TCP资源:限制:cpu:“5000m”内存:“1024Mi”请求:cpu:“100m“内存:”512Mi“生命周期:preStop:exec:命令:-/bin/sh--c-kongquitenv:-名称:”KONG_PROXY_LISTEN“值:”0.0.0.0:8000,0.0.0.0:9443sslhttp2“-名称:”KONG_PORT_MAPS"值:"80:8000,443:8443"-名称:"KONG_ADMIN_LISTEN"值:"0.0.0.0:8444ssl"-名称:"KONG_STATUS_LISTEN"值:"0.0.0.0:8100"-名称:"KONG_NGINX_WORKER_PROCESSES"值:"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的值是错误的,应该将Kong改成postgres-name:KONG_DATABASEvalue:"kong"-name:KONG_PG_USERvalue:"kong"-name:KONG_PG_PORTvalue:"pgsql端口"-name:KONG_PG_PASSWORDvalue:"pgsql密码"-name:KONG_PG_HOSTvalue:"pgsql地址"查看kong的日志报错$kubectllogs-f--tail=20-nkongkong-custom-sit-9c5cf7b69-4q29lstacktraceback:[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:inmainchunknginx:[error]init_by_luaerror:/usr/local/share/lua/5.1/kong/cmd/utils/migrations.lua:16:DatabaseneedsbootstrappingorissolderthanKong1.0.Tostartanewinstallationfromscratch,run'kongmigrationsbootstrap'.从版本低于1.0的版本迁移,先迁移到Kong1.5.0。本地/共享/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明明是kongmigrations的命令没有执行但是已经写在deployment.yaml中的initContainers里了,为什么没有执行?原因是因为kong的deployment.yaml中initContainers下的env环境变量KONG_DATABASE写错了,我写的是kong.根据github:https://github.com/pantsel/konga/tree/masterREADME.md文件中Environmentvariables可知,KONG_DATABASE变量是表示使用postgres或MySQL的三个选项之一或off。因为我用的是pgsql,所以这里需要指定postgres,那么初始化会回到pgsql进行创建库、表、创建数据等操作,这样才会成功。更改后,kong启动正常。最后在konga的github上没有找到manifests可以直接使用的yamlmanifest文件,只找到chart包,于是渲染了一下,然后根据自己的实际环境改了。第一次使用难免会遇到各种杂七杂八的问题。其实也是我个人的粗心,几次没有仔细看文档。如果读者找到konga的manifests清单文件,也可以在下方留言交流。也提醒大家,平时需要注意自己的习惯,以免重蹈我的覆辙!