环境准备:Linux服务器准备、Docker安装、Kong网关部署(Docker方式)
做API网关证书管理,第一步不是写代码,而是把实验环境搭起来。我个人习惯用Linux + Docker跑Kong,这套组合在开发和测试阶段特别灵活。今天就带你把这套环境搭好,每步我都会把坑点说清楚。
Linux服务器准备
咱们选什么Linux发行版?我个人推荐CentOS 7.9或Ubuntu 20.04 LTS。这两个我都在项目里用过,稳定省心。你手头如果是新买的云服务器,多半自带系统,但有几个要点必须检查:
- 内核版本:Docker需要Linux内核3.10以上,用
uname -r确认 - 关闭防火墙或放开端口:Kong默认用8000(HTTP)、8443(HTTPS)、8001(Admin API),还有证书管理可能用到443等。测试阶段可以暂时关掉防火墙,生产环境记得精确放行
- 关闭SELinux(CentOS):运行
setenforce 0,否则Docker挂载目录会报权限错。这个坑我踩过好几次 - 时间同步:证书校验对时间敏感,一定要装ntp或chrony,保持服务器时间准确
curl -sSL https://get.docker.com | sh来做前期检查。它会自动判断系统兼容性,比手动查版本快得多。
Docker安装
Docker安装看似简单,但不同发行版命令差挺多。我把常用两种的安装步骤列出来:
| 发行版 | 安装命令 | 关键注意 |
|---|---|---|
| Ubuntu 20.04 | apt update && apt install docker.io -y |
用系统自带版本,稳定但可能旧 |
| CentOS 7.9 | yum install docker -y |
需要先装yum-utils和配置epel源 |
装完后记得启动服务:
systemctl start docker
systemctl enable docker
docker --version # 验证安装
我再加一个验证步骤——跑个hello-world:
docker run hello-world
如果你看到“Hello from Docker!”,说明环境OK了。上面这个run命令第一次会从Docker Hub拉镜像,网络慢的话等一会儿就好。
/etc/docker/daemon.json里加上国内镜像站(比如阿里云或中科大),重启Docker后再继续。
Kong网关部署(Docker方式)
Kong有几种部署方式:裸机安装、Kubernetes、Docker。咱们用Docker Compose,因为它最轻量,适合本地测试和证书管理实验。我一般用官方docker-compose.yml做模板,然后改一改。
先创建目录结构:
mkdir ~/kong-cert-lab && cd ~/kong-cert-lab
mkdir -p data/postgres data/kong
touch docker-compose.yml
然后写入docker-compose配置:
version: '3.8'
services:
kong-database:
image: postgres:13-alpine
environment:
POSTGRES_DB: kong
POSTGRES_USER: kong
POSTGRES_PASSWORD: kong_pass
volumes:
- ./data/postgres:/var/lib/postgresql/data
networks:
- kong-net
kong-migrations:
image: kong:3.4-alpine
depends_on:
- kong-database
environment:
KONG_DATABASE: postgres
KONG_PG_HOST: kong-database
KONG_PG_PASSWORD: kong_pass
command: "kong migrations bootstrap"
networks:
- kong-net
kong:
image: kong:3.4-alpine
depends_on:
kong-migrations:
condition: service_completed_successfully
ports:
- "8000:8000"
- "8443:8443"
- "8001:8001"
- "8444:8444"
environment:
KONG_DATABASE: postgres
KONG_PG_HOST: kong-database
KONG_PG_PASSWORD: kong_pass
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
volumes:
- ./data/kong:/usr/local/kong/declarative
networks:
- kong-net
networks:
kong-net:
driver: bridge
接下来启动:
docker-compose up -d
等待几十秒,用docker-compose ps看状态,如果三个服务都是Up(kong-database、kong和kong-migrations应该已经退出),基本就成了。验证Kong是否正常运行:
curl -i http://localhost:8001/status
如果返回JSON数据,说明Kong Admin API可用。
tls-handshake、mtls-auth等),这些在Kong 3.x版本里已经内置。但我们后面会用到自己签发的CA证书和服务器证书,所以需要在宿主机上建一个目录存证书文件。我习惯创建/etc/kong/certs,并映射进Kong容器。这个在后续章节会用上。
sudo mkdir -p /etc/kong/certs
# 然后把docker-compose.yml里volumes加上一行:
# - /etc/kong/certs:/etc/kong/certs
环境部署流程图
验证与常见问题
启动后建议做几个基础验证:
- 检查容器状态:
docker-compose ps,确保kong-database和kong都是Up - 测试Admin API:
curl -s http://localhost:8001/status | jq .(如果装了jq) - 测试代理端口:
curl -i http://localhost:8000/,应该返回Kong的默认响应(404 Not Found,因为没有路由,但说明代理在监听)
kong-migrations服务启动后一直卡住,大概率是PostgreSQL连接问题。检查docker-compose logs kong-migrations,看是否有密码或主机名错误。我遇到过大小写坑——PostgreSQL用户名默认小写,但Kong环境变量里写成了大写,结果连接失败。
避坑指南(来自真实项目)
- 端口冲突:如果你的服务器上已经跑了Nginx或Apache,80、443端口可能被占用。可以改Kong的映射端口,比如
8001:8001改成9001:8001,后续所有API调用改端口就行 - 版本一致性:Kong 3.x要和PostgreSQL 13.x匹配,官方文档有兼容性矩阵。我建议用同一份docker-compose里的version tag,因为官方镜像的版本一起打包测试过
- 持久化数据:我习惯把PostgreSQL的数据目录放在
./data/postgres,这样重启容器不会丢配置。证书目录同理,放在宿主机上方便管理 - 性能与日志:测试环境可以不加日志限制,但生产务必配日志轮转,否则Kong的
/dev/stdout会撑爆Docker日志
docker-compose pull拉最新Kong镜像,结果PostgreSQL版本不兼容,migration脚本跑失败,导致网关挂了半小时。后来我养成了习惯——升级前先把镜像版本固定,并且先在测试环境跑一遍。
好了,环境准备工作基本完成。现在你的Linux上跑着一个Kong容器,背后挂着PostgreSQL,证书目录也准备好了。这门课程后面所有的证书管理操作——生成CA、签发服务器证书、配置双向TLS、轮换密钥——都将基于这套环境进行。你也不需要担心配置冲突或污染本地系统,Docker容器隔离开,想重建就docker-compose down && docker-compose up -d,一键恢复干净状态。