如何使用Docker Compose启动kong服务

Kong 的定义

Kong 是一个用于构建、部署和管理 API 的开源微服务 API 网关。它提供了许多功能,包括请求路由、访问控制、插件支持、负载均衡、认证和授权等。Kong 旨在简化 API 的管理和保护,并提供了一个可扩展的平台,适用于微服务架构。

Kong 特性

  1. API 管理: Kong 提供了一个集中化的 API 管理平台,让你能够轻松管理多个 API。它支持 API 注册、版本控制和发布。
  2. 请求路由: Kong 可以根据请求的路径、主机和其他条件将请求路由到相应的后端服务。这有助于构建灵活的 API 网关。
  3. 插件支持: Kong 的插件系统允许你轻松扩展其功能。它提供了许多内置插件,如认证、授权、日志记录等,同时你还可以开发自定义插件以满足特定需求。
  4. 负载均衡: Kong 可以将请求分发到多个后端服务,从而实现负载均衡。这有助于提高系统的可伸缩性和可用性。
  5. 安全性: Kong 提供了许多安全性功能,包括身份验证、访问控制、SSL/TLS 支持等,以确保 API 的安全性。
  6. 可扩展性: Kong 是一个高度可扩展的平台,支持插件和自定义扩展,以适应不同的业务需求。
  7. 开源和社区支持: Kong 是一个开源项目,具有庞大的社区支持。它的源代码可在 GitHub 上获得,并且有广泛的文档和社区讨论。

Kong Gateway 环境部署流程

一个生产环境的 kong gateway 最少包括以下三个部分:

数据存储、kong核心服务、可视化UI界面。

通常在服务器中手动部署或者Docker部署都需要按顺序安装和配置。

比如:

  1. 创建 kong 的net-work
  2. 安装 postgres 数据
  3. 配置 kong database 的信息
  4. 启动 kong 服务
  5. 配置 可视化UI界面 konga 的参数信息
  6. 启动 可视化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。

相关推荐
腾讯TNTWeb前端团队3 小时前
helux v5 发布了,像pinia一样优雅地管理你的react状态吧
前端·javascript·react.js
范文杰6 小时前
AI 时代如何更高效开发前端组件?21st.dev 给了一种答案
前端·ai编程
拉不动的猪6 小时前
刷刷题50(常见的js数据通信与渲染问题)
前端·javascript·面试
拉不动的猪6 小时前
JS多线程Webworks中的几种实战场景演示
前端·javascript·面试
FreeCultureBoy7 小时前
macOS 命令行 原生挂载 webdav 方法
前端
uhakadotcom8 小时前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom8 小时前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom8 小时前
React与Next.js:基础知识及应用场景
前端·面试·github
uhakadotcom8 小时前
Remix 框架:性能与易用性的完美结合
前端·javascript·面试
uhakadotcom8 小时前
Node.js 包管理器:npm vs pnpm
前端·javascript·面试