Kong 的定义
Kong 是一个用于构建、部署和管理 API 的开源微服务 API 网关。它提供了许多功能,包括请求路由、访问控制、插件支持、负载均衡、认证和授权等。Kong 旨在简化 API 的管理和保护,并提供了一个可扩展的平台,适用于微服务架构。
Kong 特性
- API 管理: Kong 提供了一个集中化的 API 管理平台,让你能够轻松管理多个 API。它支持 API 注册、版本控制和发布。
- 请求路由: Kong 可以根据请求的路径、主机和其他条件将请求路由到相应的后端服务。这有助于构建灵活的 API 网关。
- 插件支持: Kong 的插件系统允许你轻松扩展其功能。它提供了许多内置插件,如认证、授权、日志记录等,同时你还可以开发自定义插件以满足特定需求。
- 负载均衡: Kong 可以将请求分发到多个后端服务,从而实现负载均衡。这有助于提高系统的可伸缩性和可用性。
- 安全性: Kong 提供了许多安全性功能,包括身份验证、访问控制、SSL/TLS 支持等,以确保 API 的安全性。
- 可扩展性: Kong 是一个高度可扩展的平台,支持插件和自定义扩展,以适应不同的业务需求。
- 开源和社区支持: Kong 是一个开源项目,具有庞大的社区支持。它的源代码可在 GitHub 上获得,并且有广泛的文档和社区讨论。
Kong Gateway 环境部署流程
一个生产环境的 kong gateway 最少包括以下三个部分:
数据存储、kong核心服务、可视化UI界面。
通常在服务器中手动部署或者Docker部署都需要按顺序安装和配置。
比如:
- 创建 kong 的net-work
- 安装 postgres 数据
- 配置 kong database 的信息
- 启动 kong 服务
- 配置 可视化UI界面 konga 的参数信息
- 启动 可视化UI界面 konga
一套下来需要很长的时间,而且容易出错。
为了解决以上问题,提高效率,我们可以通过 docker compose 将 以上内容进行编排处理,做到一行命令部署 kong 整体服务,简化多容器服务的维护和管理工作。
通过 Docker compose 创建 Kong 服务环境
创建 docker-compose.yml
yml
version: '3'
services:
kong-database:
image: postgres:9.6
restart: always #每次总是启动
networks:
- kong-net
environment:
POSTGRES_USER: kong
POSTGRES_DB: kong
POSTGRES_PASSWORD: kong
ports:
- "5432:5432"
volumes:
- /root/docker/kong/data:/var/lib/postgresql/data
#######################
# 执行数据库迁移
######################
kong-migration:
image: kong:2.8.1
command: "kong migrations bootstrap"
networks:
- kong-net
restart: on-failure
environment:
- KONG_DATABASE=postgres
- KONG_PG_DATABASE=kong
- KONG_PG_PASSWORD=kong
- KONG_PG_HOST=kong-database
links:
- kong-database #连接的是kong-database服务的
depends_on:
- kong-database #依赖于kong-database服务
#####################
# kong gateway
#####################
kong:
image: kong:2.8.1
restart: always
networks:
- kong-net
environment:
KONG_DATABASE: postgres
KONG_PG_HOST: kong-database
KONG_PG_PASSWORD: kong
KONG_PROXY_LISTEN: 0.0.0.0:8000, 0.0.0.0:8443 ssl
# KONG_PROXY_LISTEN_SSL: 0.0.0.0:8443 重点:开启443用上面的代码,此行有问题
KONG_ADMIN_LISTEN: 0.0.0.0:8001
depends_on:
- kong-migration
links:
- kong-database
healthcheck:
test: [ "CMD", "curl", "-f", "http://kong:8001" ]
interval: 5s
timeout: 2s
retries: 15
ports:
- "8001:8001"
- "80:8000" # 对外暴漏端口
- "443:8443" # 对外暴漏端口
- "8444:8444"
#######################
#以下两个是konga GUI
#######################
konga-prepare:
image: pantsel/konga:0.14.9
command: "-c prepare -a postgres -u postgresql://kong:kong@kong-database:5432/konga" #注意是用户名:密码@数据库服务名称:端口
networks:
- kong-net
restart: on-failure
links:
- kong-database
depends_on:
- kong #依赖kong服务
- kong-database #依赖kong-database服务
konga:
image: pantsel/konga:0.14.9
restart: always
networks:
- kong-net
environment:
DB_ADAPTER: postgres
DB_HOST: kong-database
DB_USER: kong
DB_DATABASE: konga
DB_PASSWORD: kong #必须加上密码,不然会失败
depends_on:
- kong
- kong-database
ports:
- "1337:1337"
networks:
kong-net:
driver: bridge
在文件目录下执行 docker compose up -d
部署 kong 服务环境
docker compose down
关闭并删除 kong 服务相关容器
踩过的一些坑
创建完成kong,重启后相关数据丢失,每次需要重新配置,很麻烦
解决方案:postgresql 本地数据持久化
通过 volume 技术将 postgresql 数据挂载到宿主机目录下,实现每次重启时与本地数据同步。
yml
volumes:
- /root/docker/kong/data:/var/lib/postgresql/data
volumes 挂载报错,导致启动失败
解决方案:挂载本地宿主机的路径需要授权 chmod -R 777 .
HTTPS 注册的问题
在 konga 可以导入 https 证书,但是网上的一些教程给的 docker-compose.yml 文件配置是
makefile
KONG_PROXY_LISTEN_SSL: 0.0.0.0:8443
最目前版本中,这样配置是无效的。
需要改成本文 docker-compose.yml 中的配置
yml
KONG_PROXY_LISTEN: 0.0.0.0:8000, 0.0.0.0:8443 ssl
KONG_PROXY_LISTEN_SSL
不再需要,把 ssl 的配置信息放在 KONG_PROXY_LISTEN
一行即可。
版本问题
之前,在网上搜到的 docker-compose.yml
中 kong konga 的版本号都是 latest。
最近,在一台新服务器上配置,发现报错了和 postgresql 的版本不匹配。
经过调试,将版本锁定到了本文 docker-compose.yml
的版本地址,不再使用 latest。