5分钟极速部署:用Docker Compose搭建Kong网关与Konga可视化平台

当你需要快速搭建一个API网关环境时,手动配置数据库、安装依赖、调试参数的过程往往令人望而生畏。特别是对于刚接触Kong的开发者,面对纯命令行操作和复杂的配置项,很容易陷入"从入门到放弃"的困境。本文将带你用Docker Compose一键部署包含Kong网关和Konga管理面板的完整环境,无需手动配置即可获得生产级API管理能力。

1. 为什么选择Docker Compose部署Kong

传统部署方式需要分别安装PostgreSQL数据库、Kong服务以及Konga界面,过程中可能遇到版本兼容性、依赖冲突等问题。而Docker Compose方案将所有组件容器化,通过声明式配置实现:

  • 环境隔离:每个服务运行在独立容器中,避免污染主机环境
  • 版本固化:精确控制各组件版本,确保稳定性
  • 一键启停:单个命令即可创建或销毁整个环境
  • 配置即代码:docker-compose.yml文件可纳入版本控制

以下是最简化的部署架构:

┌───────────────────────────────────────────────┐
│                  Docker Host                  │
│                                               │
│  ┌─────────────┐    ┌─────────────┐          │
│  │   Kong      │    │   Konga     │          │
│  │  (3.3.0)    │    │  (latest)   │          │
│  └──────┬──────┘    └──────┬──────┘          │
│         │                  │                 │
│  ┌──────▼──────┐           │                 │
│  │ PostgreSQL  │           │                 │
│  │  (13-alpine)│           │                 │
│  └─────────────┘           │                 │
│                            │                 │
└────────────────────────────┼─────────────────┘
                             │
                      ┌──────▼──────┐
                      │   用户访问    │
                      └─────────────┘

2. 编写docker-compose.yml文件

创建名为kong-konga的目录,新建docker-compose.yml文件:

version: '3.8'

services:
  postgres:
    image: postgres:13-alpine
    environment:
      POSTGRES_USER: kong
      POSTGRES_PASSWORD: kong
      POSTGRES_DB: kong
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U kong"]
      interval: 5s
      timeout: 5s
      retries: 5

  kong:
    image: kong:3.3.0
    depends_on:
      postgres:
        condition: service_healthy
    environment:
      KONG_DATABASE: postgres
      KONG_PG_HOST: postgres
      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 reuseport backlog=16384, 0.0.0.0:8444 http2 ssl reuseport backlog=16384
    ports:
      - "8000:8000"   # 代理端口
      - "8001:8001"   # 管理API
      - "8443:8443"   # HTTPS代理
      - "8444:8444"   # 管理API HTTPS
    volumes:
      - ./plugins:/usr/local/share/lua/5.1/kong/plugins
    healthcheck:
      test: ["CMD", "kong", "health"]
      interval: 10s
      timeout: 10s
      retries: 10

  konga:
    image: pantsel/konga:latest
    depends_on:
      kong:
        condition: service_healthy
    environment:
      TOKEN_SECRET: secure_token_here
      DB_ADAPTER: postgres
      DB_HOST: postgres
      DB_USER: kong
      DB_PASSWORD: kong
      DB_DATABASE: kong
      KONGA_HOOK_TIMEOUT: 120000
    ports:
      - "1337:1337"
    restart: unless-stopped

volumes:
  postgres_data:

关键配置说明:

  1. PostgreSQL服务

    • 使用轻量级alpine镜像
    • 通过healthcheck确保数据库就绪后才启动Kong
    • 数据卷持久化存储
  2. Kong服务

    • depends_on确保数据库健康后才启动
    • 开放四个核心端口:
      • 8000:HTTP代理端口
      • 8001:管理API端口
      • 8443/8444:对应HTTPS端口
    • 预留plugins目录用于自定义插件
  3. Konga服务

    • 与Kong共享PostgreSQL实例
    • 设置较长的HOOK_TIMEOUT避免操作超时
    • 1337为默认Web访问端口

提示:生产环境应替换所有默认密码,并配置TLS证书

3. 启动与验证服务

在项目目录下执行:

# 启动所有服务(-d表示后台运行)
docker-compose up -d

# 查看服务状态
docker-compose ps

预期输出应显示三个服务状态均为running

      Name                    Command               State                          Ports                        
-------------------------------------------------------------------------------------------------------------
kong-konga_kong_1      /docker-entrypoint.sh kong ...   Up      0.0.0.0:8000-8001->8000-8001/tcp, 0.0.0.0:8443-8444->8443-8444/tcp
kong-konga_konga_1     /app/start.sh                   Up      0.0.0.0:1337->1337/tcp                        
kong-konga_postgres_1  docker-entrypoint.sh postgres    Up      5432/tcp                                     

验证Kong管理API:

curl -i http://localhost:8001/

应返回200状态码和Kong版本信息。

4. 配置Konga管理界面

访问http://localhost:1337完成初始化:

  1. 注册管理员账户

    • 填写邮箱、用户名和密码
    • 首次登录后进入设置向导
  2. 连接Kong管理API

    • 选择"Connect to Kong Admin API"
    • 名称:Local Kong
    • Kong Admin URL:http://kong:8001
    • 不启用JWT认证
  3. 初始化仪表盘

    • 创建成功后进入Konga主界面
    • 左侧菜单包含Services、Routes、Consumers等管理项

常见问题排查:

  • Konga无法连接Kong

    # 检查Kong容器日志
    docker-compose logs kong
    
    # 测试容器间连通性
    docker-compose exec konga curl http://kong:8001
    
  • 数据库迁移失败

    # 手动执行迁移
    docker-compose exec kong kong migrations bootstrap
    

5. 通过Konga管理API网关

5.1 创建第一个Service

  1. 导航至"Services" → "Add New Service"

  2. 填写基础信息:

    • Name:example-service
    • Protocol:http
    • Host:mockbin.org
    • Port:80
  3. 点击"Submit"保存

5.2 添加路由规则

  1. 在刚创建的Service详情页点击"Add Route"

  2. 配置路由规则:

    • Paths:/mock
    • 其他保持默认
  3. 测试路由:

    curl -i http://localhost:8000/mock/request
    

    应返回Mockbin的响应内容

5.3 启用限流插件

  1. 在Service详情页点击"Add Plugin"

  2. 选择"Rate Limiting"插件

  3. 配置参数:

    • Minute:10 (每分钟10次请求)
    • Policy:local (使用内存计数器)
  4. 测试限流:

    # 快速发起11次请求
    for i in {1..11}; do curl -I http://localhost:8000/mock/request; done
    

    第11次请求应返回429状态码

6. 生产环境优化建议

6.1 安全加固配置

docker-compose.yml中增加:

environment:
  KONG_ADMIN_GUI_AUTH: basic-auth
  KONG_ADMIN_GUI_AUTH_CONF: '{"admin":"$2a$10$N9qo8uLOickgx2ZMRZoMy.MrqopwcX6VYjX7U1qZQeAYn3vlzCQZO"}'

生成密码哈希:

docker run --rm kong:3.3.0 kong hash-password YourSecurePassword

6.2 性能调优参数

environment:
  KONG_PROXY_LISTEN: 0.0.0.0:8000 reuseport backlog=16384
  KONG_NGINX_WORKER_PROCESSES: "auto"
  KONG_NGINX_WORKER_CONNECTIONS: "4096"
  KONG_DB_CACHE_WARMUP_ENTITIES: "on"

6.3 日志与监控集成

ELK日志配置示例:

environment:
  KONG_LOG_LEVEL: info
  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_PLUGINS: bundled, prometheus

在Konga中启用Prometheus插件后,可通过http://localhost:8001/metrics获取监控数据

更多推荐