如何使用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。

相关推荐
彭世瑜9 分钟前
ts: TypeScript跳过检查/忽略类型检查
前端·javascript·typescript
FØund40410 分钟前
antd form.setFieldsValue问题总结
前端·react.js·typescript·html
Backstroke fish10 分钟前
Token刷新机制
前端·javascript·vue.js·typescript·vue
小五Five12 分钟前
TypeScript项目中Axios的封装
开发语言·前端·javascript
小曲程序12 分钟前
vue3 封装request请求
java·前端·typescript·vue
临枫54112 分钟前
Nuxt3封装网络请求 useFetch & $fetch
前端·javascript·vue.js·typescript
前端每日三省14 分钟前
面试题-TS(八):什么是装饰器(decorators)?如何在 TypeScript 中使用它们?
开发语言·前端·javascript
小刺猬_98514 分钟前
(超详细)数组方法 ——— splice( )
前端·javascript·typescript
渊兮兮15 分钟前
Vue3 + TypeScript +动画,实现动态登陆页面
前端·javascript·css·typescript·动画
鑫宝Code16 分钟前
【TS】TypeScript中的接口(Interface):对象类型的强大工具
前端·javascript·typescript