Kong+Konga+Consul 安装和使用
此处使用Docker安装方式
一、 安装Kong
kong具体使用可参考另一篇文章:Kong API网关
为了确保 Kong、Konga 和 Consul 能够通信,Kong 和 Konga 也需要加入到同一个网络。如果你尚未创建网络,或者希望使用新的网络,可以创建一个:
docker network create kong-net
1.1 安装 PostgreSQL (Kong 的数据库)
Kong 需要 PostgreSQL 来存储其配置数据
docker run -d --name kong-database \
--network=kong-net \
-p 5432:5432 \
-e "POSTGRES_USER=kong" \
-e "POSTGRES_DB=kong" \
-e "POSTGRES_PASSWORD=kong" \
postgres:13
–network=kong-net: 确保数据库与 Kong、Consul 在同一网络。
-e 环境变量:设置数据库的用户名、数据库名和密码。
建议使用 PostgreSQL 9.6 或更高版本,这里使用了 13 版本。
1.2 初始化 Kong 数据库
运行一个临时容器来执行数据库迁移:
docker run --rm \
--network=kong-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_PG_USER=kong" \
-e "KONG_PG_PASSWORD=kong" \
kong:3.6.1 kong migrations bootstrap
--rm: 容器退出后自动删除。--network=kong-net: 连接同一网络以访问kong-database。-e环境变量:配置数据库连接信息。kong:3.6.1 kong migrations bootstrap: 这里使用了 Kong 3.6.1 镜像并执行初始化命令。请考虑使用最新的稳定版本或你需要的特定版本
1.3 安装并配置 Kong
现在启动 Kong 容器,并关键一步:配置它使用 Consul 进行服务发现
docker run -d --name kong \
--network=kong-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_PG_USER=kong" \
-e "KONG_PG_PASSWORD=kong" \
-e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
-e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
-e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \
-e "KONG_DNS_RESOLVER=172.17.0.3:8600" \ # 替换为你的Consul容器IP 如172.17.0.3:8600
# -e "KONG_DNS_RESOLVER=127.0.0.11:53" # 使用 Docker 内置 DNS
# -e "KONG_DNS_ORDER=SRV,LAST,A,CNAME" \
-e "KONG_DNS_ORDER=A,CNAME" # 简化解析顺序,只解析 A 记录和 CNAME
-e "KONG_DB_UPDATE_PROPAGATION_TIMEOUT=60"
-p 18000:8000 \ # 代理HTTP流量端口
-p 8443:8443 \ # 代理HTTPS流量端口
-p 8001:8001 \ # Admin API HTTP端口
-p 8444:8444 \ # Admin API HTTPS端口
kong:3.6.1
核心配置说明:
KONG_DNS_RESOLVER: 必须修改为你 Consul 容器的实际 IP 地址和 DNS 端口(通常是8600)。这是 Kong 查询 Consul 中服务 DNS 记录的关键配置14。KONG_DNS_ORDER:SRV优先,确保 Kong 优先使用 Consul 提供的 SRV 记录进行服务发现1。端口映射:
8000: 代理 HTTP 流量的端口。8443: 代理 HTTPS 流量的端口。8001: Kong 的 Admin API HTTP 端口,用于管理配置。8444: Kong 的 Admin API HTTPS 端口。
验证 Kong 是否运行成功:
curl -i http://localhost:8001/status
# 或访问 http://<你的服务器IP>:8001/status。
二. 安装 Konga (Kong 的 Web UI)
Konga 是 Kong 的一个开源管理界面。
文档地址:https://github.com/pantsel/konga
注意: 官方发布的 Konga 镜像与 PostgreSQL 13 及以上版本存在已知兼容性问题,通常会导致 column r.consrc does not exist 错误
以下为安装步骤
为 Konga 创建数据库(可选但推荐), 虽然 Konga 可以使用 SQLite,但生产环境建议使用 PostgreSQ
docker run -d --name konga-database \ --network=kong-net \ -p 5433:5432 \ # 避免与Kong的数据库端口冲突 -e "POSTGRES_USER=konga" \ -e "POSTGRES_DB=konga" \ -e "POSTGRES_PASSWORD=konga" \ postgres:9.6初始化 Konga 数据库
此命令初始化 Konga 的数据库结构
latest 会出现 Failed to prepare database: error: column r.consrc does not exist等问题
docker run --rm \ --network=kong-net \ pantsel/konga \ -c prepare -a postgres -u postgresql://konga:konga@konga-database:5432/konga启动 Konga
docker run -d --name konga \ --network=kong-net \ -e "NODE_ENV=production" \ -e "KONGA_HOOK_TIMEOUT=120000" \ -e "DB_ADAPTER=postgres" \ -e "DB_URI=postgresql://konga:konga@konga-database:5432/konga?sslmode=disable" \ -e "DB_POOL_SIZE=5" \ -p 1337:1337 \ pantsel/konga- 环境变量 DB_*:配置 Konga 连接其数据库。
- -p 1337:1337: 将 Konga 的 Web 界面映射到宿主机的 1337 端口。
访问 Konga: 打开浏览器访问 http://<你的服务器IP>:1337。首次访问需要注册管理员账户。
在 Konga 中连接 Kong, 访问konga面板,如: http://localhost:1337/
- 首次登录需要设置用户名和密码如kong,kong123456
- 登录 Konga 后,点击页面上的
CONNECTIONS或+ NEW CONNECTION。 - 填写 Kong 的管理 API 地址(因为它们在同一个 Docker 网络
kong-net中,Konga 可以直接通过容器名kong和 Admin API 端口8001访问 Kong):http://kong:8001。 - 为这个连接起一个名字(例如 “My-Kong”),然后点击
ACTIVATE或SAVE CONNECTION来激活并测试连接 - active后左侧菜单会出现API GATEWAY相关菜单(SERVICES,ROUTES,Consumers,Plugins,Upstreams,Certificates 等)
三、安装 Consul
具体使用可参考另一篇文章:Consul注册中心
# 这里需要加入同一网络 kong-net
docker run -d --name=consul --network=kong-net -p 8500:8500 consul:1.15.4 agent -dev -client 0.0.0.0 -ui
四、结合 Kong+Konga+Consul
修改kong配置文件,绑定consul 如/etc/kong/kong.conf,加入
dns_resolver = 127.0.0.1:8600 # consul地址
konga创建service 各参数如 Name:userHttp Host:userHttp.service.consul #consul中定义的服务名 Port:0
konga创建route 各参数如 Name:user Paths:/user
这样项目中api服务端口变更的话(比如9501->9502)就不用去修改kong网关配置
CORS跨域问题可以在konga为路由添加Cors插件