使用PostgreSQL时Kong无法加载声明式配置实体的问题
问题原因与解决方案
1. 数据库模式下/services返回空数组的原因
当KONG_DATABASE=postgres时,Kong运行在数据库模式,此时KONG_DECLARATIVE_CONFIG配置会被直接忽略——声明式配置(DB-less模式)仅在KONG_DATABASE=off时生效。你的kong.yml配置并未加载到PostgreSQL中,数据库内无任何服务数据,因此调用/services接口返回空数组。
2. Kong与PostgreSQL结合声明式配置的可行性
Kong不支持同时启用数据库模式和DB-less模式,但可以通过将声明式配置导入到PostgreSQL的方式,把kong.yml作为数据库配置的初始化数据源,之后切换到数据库模式运行。本质是用声明式配置批量初始化数据库中的实体,而非同时运行两种配置模式。
3. 将kong.yml实体加载到PostgreSQL的步骤
第一步:修正kong.yml的配置错误
你的配置文件存在无效关联:routes下的basket-requests指定了service: basket_service,但services列表中未定义该服务,会导致导入失败。需先修正,示例如下:
routes: - name: basket-requests service: customer_service # 改为已定义的服务,或添加basket_service的配置项 paths: - /basket
第二步:导入配置到数据库
方式一:修改Docker Compose启动命令
调整Kong容器的command字段,在启动前执行配置导入:
bash -c "while !</dev/tcp/kong_postgresql/5432; do sleep 10; done; kong migrations bootstrap && kong config db_import /app/kong.yml && kong start"
该命令会先等待PostgreSQL就绪,执行数据库迁移,将kong.yml的配置导入到PostgreSQL,最后启动Kong。
方式二:手动导入(适用于已运行的环境)
进入Kong容器:
docker exec -it api_gateway bash
执行导入命令:
kong config db_import /app/kong.yml
导入完成后重启Kong即可。
第三步:优化环境变量(可选)
配置导入完成后,可移除KONG_DECLARATIVE_CONFIG环境变量,避免混淆,确保Kong完全依赖PostgreSQL存储配置。
内容的提问来源于stack exchange,提问作者Code Rains
相关产品推荐
相关产品推荐

