跳到主要内容

使用docker部署kong

Docker 整体过程参考该文档

启动postgre并初始化kong需要的数据库

01 启动postgres

docker run -d --name kong-database \
--network=kong-net \
-e "POSTGRES_DB=kong" \
-e "POSTGRES_USER=kong" \
-e "POSTGRES_PASSWORD=kongpwd" \
-e "PGDATA=/var/lib/postgresql/data/pgdata" \
-v "/Users/xxx/Desktop/dws/kongtest/postgresql/postgresql.conf:/etc/postgresql/postgresql.conf" \
-v "/Users/xxx/Desktop/dws/kongtest/postgresql/pgdata:/var/lib/postgresql/data/pgdata" \
-p 5432:5432 \
postgres:9.6 -c 'config_file=/etc/postgresql/postgresql.conf'

成功执行之后,新建了一个pg实例,在实例中创建了一个新的kong用户(密码是kongpwd),新建了一个新的数据库 kong。

创建注意事项:如果是上面的创建方式,想办法先拿到一个postgresql.conf文件(无论是自备,还是使用从容器里复制到本地目录的方式,然后删除掉容器和本地pgdata目录),仅以存在该文件为前提,执行上述脚本。

可以通过docker exec -it [container] bash链接到容器中,执行psql -U kongpsql -h localhost -p 5432 -U kong -d kong,在psql的命令行来查看:

\du #查看所有用户
\l #查看所有数据库

碰到的问题及解决方法

  • postgres用docker运行,存储及配置文件映射到本地

    第一次运行kong-database时,如果映射了pgdata的本地目录,并且目录里没有内容的话,会自动把容器里的相关内容复制到本地目录里,关于这部分内容,可以参见volume详解 · Docker -- 从入门到实战

    单独运行踩坑: 因为做了配置文件和pgdata目录的本地映射,先直接执行,发现在我机器目录下的postgresql下生成的postgresql.conf是一个目录,并非文件。此时,因为我们还指定了要初始化一个新的db kong,设置新用户用kong和密码,由于配置文件有问题,所以pg没有进行kong db的初始化。

    如果不删掉本地pgdata目录,不论容器删除多少次重启,都因为本地已经有pg数据,所以不会再走初始化的逻辑,导致不达预期。

    解法:获取到postgresql.conf后,直接删掉pgdata目录,删掉容器,重新运行,生成新的pgdata和容器,这时候因为配置文件已经就位,初始化过程不会被阻断,就会正常创建新数据库kong。

  • 访问权限问题

    可参考docs/postgres at master · docker-library/docs · GitHub中关于 POSTGRES_HOST_AUTH_METHOD的描述,主要是要修改pg_hba.conf文件,增加对可访问的主机、用户等的访问控制。因为映射了本地的目录作为pg的数据存储,所以直接修改本地的目录下的pg-hba.conf文件即可。在pg-hba.conf中增加一行:

    host all all all md5
  • docker-compose里指定config_file的问题

    如果使用docker-compose来运行pg,此时docker run启动命令里的-c参数不知道如何转换到docker-compose文件中去,参考了该文章docker compose up with postgres quick tips,使用了command: postgres -c config_file=/etc/postgresql/postgresql.conf

    最后写成docker-compose文件如下:

      kong-database:
    image: postgres:9.6
    container_name: kongdb-pg
    restart: always
    networks:
    - kong-net
    environment:
    POSTGRES_DB: kong
    POSTGRES_USER: kong
    POSTGRES_PASSWORD: kongpwd
    PGDATA: /var/lib/postgresql/data/pgdata
    ports:
    - 5432:5432
    volumes:
    - /Users/xxx/Desktop/dws/kongtest/postgresql/postgresql.conf:/etc/postgresql/postgresql.conf
    - /Users/xxx/Desktop/dws/kongtest/postgresql/pgdata:/var/lib/postgresql/data/pgdata
    command: postgres -c config_file=/etc/postgresql/postgresql.conf

02 准备kong数据库

准备kong数据库是在已经上一步创建好的pg实例的kong数据库中,创建表的过程。

docker run --rm --network=kong-net \
-e "KONG_DATABASE=postgres" \
-e "KONG_PG_HOST=kong-database" \
-e "KONG_PG_DATABASE=kong" \
-e "KONG_PG_USER=kong" \
-e "KONG_PG_PASSWORD=kongpwd" \
kong:2.7.0 kong migrations bootstrap

该命令只需要执行一次,执行完成后,kong数据库里就创建好了kong网关需要的数据库表结构了。

这里的--network需要注意一下,可以通过docker network ls来查看。

03 如果使用docker-compose

最终,如果上述两部分内容,用docker-compose.yml文件来写,如下:

如果只运行其中的kong-migration服务,可以使用docker-compose run kong-migration

version: '3.8'
services:
kong-database:
image: postgres:9.6
container_name: kongdb-pg
restart: always
networks:
- kong-net
environment:
POSTGRES_DB: kong
POSTGRES_USER: kong
POSTGRES_PASSWORD: kongpwd
PGDATA: /var/lib/postgresql/data/pgdata
ports:
- 5432:5432
volumes:
- /Users/xxx/Desktop/dws/kongtest/postgresql/postgresql.conf:/etc/postgresql/postgresql.conf
- /Users/xxx/Desktop/dws/kongtest/postgresql/pgdata:/var/lib/postgresql/data/pgdata
command: postgres -c config_file=/etc/postgresql/postgresql.conf

kong-migration:
image: kong:2.7.0
container_name: kong-migration
networks:
- kong-net
environment:
KONG_DATABASE: postgres
KONG_PG_HOST: kong-database
KONG_PG_DATABASE: kong
KONG_PG_USER: kong
KONG_PG_PASSWORD: kongpwd
links:
- kong-database
depends_on:
- kong-database
command: kong migrations bootstrap

使用普通模式启动kong

直接使用docker-compose来启动即可,或者直接用docker命令启动。

如果使用了docker-compose的network,需要注意,每个容器实例有自己独立的ip,并非主机的ip,他们通过这一套网络进行互相链接。

使用混部(hybrid)模式部署kong集群

混部模式参考文档

Kong集群(hybrid混合)部署模式

kong 集群部署(混合模式 Hybrid Mode)

混部模式的docker-compose文件

version: '3.8'

networks:
kong-hybrid-net:
driver: bridge

services:
kongdb-hybrid:
image: postgres:9.6
container_name: kongdb-hybrid
restart: on-failure
networks:
- kong-hybrid-net
environment:
POSTGRES_DB: kong
POSTGRES_USER: kong
POSTGRES_PASSWORD: kongpwd
PGDATA: /var/lib/postgresql/data/pgdata
ports:
- 5432:5432
volumes:
- /Users/xxx/Desktop/dws/kong-hybrid/postgresql/postgresql.conf:/etc/postgresql/postgresql.conf
- /Users/xxx/Desktop/dws/kong-hybrid/postgresql/pgdata:/var/lib/postgresql/data/pgdata
command: postgres -c config_file=/etc/postgresql/postgresql.conf

kong-cp1:
image: kong:2.7.0
container_name: kong-cp1
restart: on-failure
networks:
- kong-hybrid-net
logging:
driver: json-file
options:
max-size: 16m
max-file: 8
volumes:
- /Users/xxx/Desktop/dws/kong-hybrid/cluster-key:/cluster/key
environment:
KONG_ROLE: control_plane
KONG_CLUSTER_CERT: /cluster/key/cluster.crt
KONG_CLUSTER_CERT_KEY: /cluster/key/cluster.key
# kong cluster
KONG_CLUSTER_LISTEN: 0.0.0.0:8005
KONG_CLUSTER_TELEMETRY_LISTEN: 0.0.0.0:8006

# kong db
KONG_DATABASE: postgres
KONG_PG_HOST: kongdb-hybrid
KONG_PG_PORT: 5432
KONG_PG_USER: kong
KONG_PG_PASSWORD: kongpwd
KONG_PG_MAX_COCURRENT_QUERIES: 8

# log
KONG_LOG_LEVEL: info

# kong api
KONG_ADMIN_LISTEN: 0.0.0.0:8001
KONG_STATUS_LISTEN: 0.0.0.0:8100
ports:
#- 8000:8000 # proxy
- 8001:8001 # admin api
- 8100:8100 # status
- 8005:8005 # cluster
- 8006:8006 # cluster telemetry
depends_on:
- kongdb-hybrid

kong-dp1:
image: kong:2.7.0
container_name: kong-dp1
restart: on-failure
networks:
- kong-hybrid-net
logging:
driver: json-file
options:
max-size: 16m
max-file: 8
volumes:
- /Users/xxx/Desktop/dws/kong-hybrid/cluster-key:/cluster/key
environment:
KONG_ROLE: data_plane
KONG_CLUSTER_CERT: /cluster/key/cluster.crt
KONG_CLUSTER_CERT_KEY: /cluster/key/cluster.key
# kong cluster
KONG_CLUSTER_CONTROL_PLANE: kong-cp1:8005

# kong db
KONG_DATABASE: off
# log
KONG_LOG_LEVEL: info
# kong api
KONG_PROXY_LISTEN: 0.0.0.0:8000
KONG_STATUS_LISTEN: 0.0.0.0:8100
ports:
- 7001:8000 # proxy
- 9101:8100 # status
depends_on:
- kong-cp1

kong-dp2:
image: kong:2.7.0
container_name: kong-dp2
restart: on-failure
networks:
- kong-hybrid-net
logging:
driver: json-file
options:
max-size: 16m
max-file: 8
volumes:
- /Users/xxx/Desktop/dws/kong-hybrid/cluster-key:/cluster/key
environment:
KONG_ROLE: data_plane
KONG_CLUSTER_CERT: /cluster/key/cluster.crt
KONG_CLUSTER_CERT_KEY: /cluster/key/cluster.key
# kong cluster
KONG_CLUSTER_CONTROL_PLANE: kong-cp1:8005

# kong db
KONG_DATABASE: off
# log
KONG_LOG_LEVEL: info
# kong api
KONG_PROXY_LISTEN: 0.0.0.0:8000
KONG_STATUS_LISTEN: 0.0.0.0:8100
ports:
- 7002:8000 # proxy
- 9102:8100 # status
depends_on:
- kong-cp1

状态和监控信息

http://localhost:[8100|9101|9102]/[status|metrics]

cp关联端口

http://localhost:8001/

cp cluster api

http://localhost:8001/clustering/data-planes

http://localhost:8001/clustering/status