Kong API网关无法访问PostgreSQL及权限异常排查求助
Kong网关Docker部署故障排查建议
问题背景
此前正常运行的Kong API网关(通过docker-compose部署,包含kong、postgres、migrations、konga四个容器)突发故障:
- 执行
docker-compose up时,kong容器日志报错:Cannot mkdir /tmp/resty_fozOysRNjN: Permission denied
- 尝试以root身份运行容器后,出现PostgreSQL连接拒绝错误:
2024/06/17 16:10:49 [error] 1#0: init_by_lua error: /usr/local/share/lua/5.1/kong/init.lua:660: [PostgreSQL error] failed to retrieve PostgreSQL server_version_num: connection refused
已确认PostgreSQL可通过psql正常连接,且相同docker-compose配置在其他机器可正常运行。
附docker-compose配置:
services: kong-db: image: postgres:9.6 environment: POSTGRES_USER: kong POSTGRES_DB: kong POSTGRES_PASSWORD: kong ports: - "5432:5432" volumes: - kong-db-data:/var/lib/postgresql/data networks: - kong-net kong-migrations: image: kong:latest command: /bin/sh -c "sleep 10 && kong migrations bootstrap --vv" environment: KONG_DATABASE: postgres KONG_PG_HOST: kong-db KONG_PG_PORT: 5432 KONG_PG_USER: kong KONG_PG_PASSWORD: kong KONG_LOG_LEVEL: debug depends_on: - kong-db networks: - kong-net kong: image: kong:latest command: /bin/sh -c "sleep 30 && kong start --vv" environment: KONG_DATABASE: postgres KONG_PG_HOST: kong-db KONG_PG_PORT: 5432 KONG_PG_USER: kong KONG_PG_PASSWORD: kong KONG_PROXY_ACCESS_LOG: /dev/stdout KONG_ADMIN_ACCESS_LOG: /dev/stdout KONG_PROXY_ERROR_LOG: /dev/stderr KONG_ADMIN_ERROR_LOG: /dev/stderr KONG_ADMIN_LISTEN: 0.0.0.0:8001, 0.0.0.0:8444 ssl KONG_LOG_LEVEL: debug depends_on: - kong-migrations ports: - "8000:8000" - "8443:8443" - "8001:8001" - "8444:8444" networks: - kong-net konga: image: pantsel/konga environment: NODE_ENV: production ports: - "1337:1337" depends_on: - kong entrypoint: /bin/sh -c "sleep 40 && npm start" networks: - kong-net volumes: kong-db-data: networks: kong-net: driver: bridge
排查步骤
一、解决/tmp目录权限问题
- 检查宿主机/tmp目录权限:执行
ls -ld /tmp查看权限,确保为drwxrwxrwt(其他用户有读写执行权限)。如果权限异常,执行chmod 1777 /tmp恢复默认权限。 - 避免直接用root运行Kong容器:Kong官方镜像默认用kong用户运行,强制root会引发后续问题。可在docker-compose的kong服务中添加
user: "1000:1000"(替换为宿主机上有/tmp权限的用户UID:GID),或者挂载自定义临时目录:
宿主机执行kong: # ...其他配置 volumes: - ./kong-tmp:/tmpmkdir -p kong-tmp && chmod 777 kong-tmp完成目录准备。
二、解决PostgreSQL连接拒绝问题(root运行容器时出现)
- 检查PostgreSQL监听地址:进入postgres容器,执行
cat /var/lib/postgresql/data/postgresql.conf | grep listen_addresses,确认listen_addresses设置为'*'。若不是,修改后重启postgres容器。 - 验证容器间网络连通性:在kong容器内执行
ping kong-db和telnet kong-db 5432,确认网络可达且端口开放。若无法连通,执行docker network inspect kong-net检查网络配置,确保所有服务都加入该网络。 - 检查PostgreSQL用户连接权限:进入postgres容器执行
psql -U kong,然后查询用户权限:
若SELECT rolname, rolhost FROM pg_roles WHERE rolname='kong';rolhost不是'%',执行ALTER USER kong WITH LOGIN PASSWORD 'kong' HOST '%';修改权限。 - 替换固定sleep为健康检查:当前依赖等待逻辑不可靠,修改docker-compose为postgres添加健康检查,让依赖服务等待postgres就绪后启动:
kong-db: # ...其他配置 healthcheck: test: ["CMD-SHELL", "pg_isready -U kong -d kong"] interval: 5s timeout: 5s retries: 5 kong-migrations: # ...其他配置 depends_on: kong-db: condition: service_healthy command: kong migrations bootstrap --vv # 移除sleep kong: # ...其他配置 depends_on: kong-db: condition: service_healthy kong-migrations: condition: service_completed_successfully command: kong start --vv # 移除sleep - 清理旧容器和缓存:执行以下命令清理残留状态后重新部署:
docker-compose down -v docker system prune -f docker-compose up -d
内容的提问来源于stack exchange,提问作者kaiserlautern
相关产品推荐
相关产品推荐

