Kong&Konga docker swarm 部署

docker-compose 部署

Posted by JerAxxxxxxx on August 23, 2021
5 min read

Kong docker swarm 部署

这次分享下 Kong&Konga 通过 docker swarm 部署的脚本,因为目前没有用上 K8S,目前还是用比较轻量的 docker swarm 进行部署。

#!/bin/bash
# kong镜像名称,需带 tag, 若不带 tag 会默认查找 latest 版本
export KONG_IMAGE_NAME="kong:jerax"
# konga 镜像名称
export KONGA_IMAGE_NAME="konga:jerax"
# postgres 镜像名称
export POSTGRES_IMAGE_NAME="postgres:9.6"
# 本机 ip
export HOST_IP="127.0.0.1"
# 当前文件夹
SHELL_FOLDER=$(
  cd "$(dirname "$0")" || exit
  pwd
)

function build_yaml() {
  echo -e "\033[32m Start building docker-compose.yaml files \033[0m"
  cat <<EOF >"${SHELL_FOLDER}"/docker-compose.yaml
version: "3.8"

networks:
 kong-net:
  driver: overlay

services:
  kong-database:
    image: ${POSTGRES_IMAGE_NAME}
    restart: always
    networks:
      - kong-net
    volumes:
      - postgres-data:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: kong
      POSTGRES_DB: kong
      POSTGRES_PASSWORD: kong
      PGDATA: /var/lib/postgresql/data/pgdata
    ports:
      - "5432:5432"
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "kong"]
      interval: 5s
      timeout: 5s
      retries: 5

  kong-migration:
    image: ${KONG_IMAGE_NAME}
    command: "kong migrations bootstrap"
    networks:
      - kong-net
    restart: on-failure
    environment:
      - KONG_DATABASE=postgres
      - KONG_PG_HOST=kong-database
      - KONG_PG_DATABASE=kong
      - KONG_PG_PASSWORD=kong
    links:
      - kong-database
    depends_on:
      - kong-database

  kong:
    image: ${KONG_IMAGE_NAME}
    restart: always
    networks:
      - kong-net
    volumes:
      - kong-data:/usr/local/kong
      - kong-cfg:/etc/kong
    deploy:
      replicas: 3
    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_ADMIN_LISTEN: 0.0.0.0:8001, 0.0.0.0:8444 ssl
    depends_on:
      - kong-migration
    links:
      - kong-database
    ports:
      - "8001:8001"
      - "8000:8000"
      - "8443:8443"
      - "8444:8444"

  konga-prepare:
    image: ${KONGA_IMAGE_NAME}
    command: "-c prepare -a postgres -u postgresql://kong:kong@kong-database:5432/konga"
    networks:
      - kong-net
    restart: on-failure
    environment:
      - KONG_DATABASE=postgres
      - KONG_PG_HOST=kong-database
      - KONG_PG_DATABASE=konga
      - KONG_PG_PASSWORD=kong
    links:
      - kong-database
    depends_on:
      - kong-database

  konga:
    image: ${KONGA_IMAGE_NAME}
    restart: always
    networks:
     - kong-net
    environment:
      DB_ADAPTER: postgres
      DB_URI: postgresql://kong:kong@kong-database:5432/konga
      NODE_ENV: production
    links:
      - kong-database
    depends_on:
      - kong
      - konga-prepare
    ports:
      - "1337:1337"

volumes:
  postgres-data:
  kong-data:
  kong-cfg:
EOF
  echo -e "\033[32m Yaml file build complete \033[0m"
}

function start_kong() {
  # 初始化 docker swarm
  result=$(docker info)
  if [[ ${result} =~ "Swarm: active" ]]; then
    echo -e "\033[31m Docker swarm already active \033[0m"
  else
    echo -e "\033[32m Start init docker swarm \033[0m"
    docker swarm init --advertise-addr "${HOST_IP}"
  fi
  echo -e "\033[32m Start building the Kong service... \033[0m"
  docker stack deploy -c docker-compose.yaml kong
}

build_yaml &&
  start_kong

docker-compose.yaml

由于博客上 shell 的格式对于 yaml 文件不太友好,重新把 docker-compose.yaml 文件内容贴一下

version: "3.8"

networks:
  kong-net:
    driver: overlay

services:
  kong-database:
    image: ${POSTGRES_IMAGE_NAME}
    restart: always
    networks:
      - kong-net
    volumes:
      - postgres-data:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: kong
      POSTGRES_DB: kong
      POSTGRES_PASSWORD: kong
      PGDATA: /var/lib/postgresql/data/pgdata
    ports:
      - "5432:5432"
    healthcheck:
      test: [ "CMD", "pg_isready", "-U", "kong" ]
      interval: 5s
      timeout: 5s
      retries: 5

  kong-migration:
    image: ${KONG_IMAGE_NAME}
    command: "kong migrations bootstrap"
    networks:
      - kong-net
    restart: on-failure
    environment:
      - KONG_DATABASE=postgres
      - KONG_PG_HOST=kong-database
      - KONG_PG_DATABASE=kong
      - KONG_PG_PASSWORD=kong
    links:
      - kong-database
    depends_on:
      - kong-database

  kong:
    image: ${KONG_IMAGE_NAME}
    restart: always
    networks:
      - kong-net
    volumes:
      - kong-data:/usr/local/kong
      - kong-cfg:/etc/kong
    deploy:
      replicas: 3
    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_ADMIN_LISTEN: 0.0.0.0:8001, 0.0.0.0:8444 ssl
    depends_on:
      - kong-migration
    links:
      - kong-database
    ports:
      - "8001:8001"
      - "8000:8000"
      - "8443:8443"
      - "8444:8444"

  konga-prepare:
    image: ${KONGA_IMAGE_NAME}
    command: "-c prepare -a postgres -u postgresql://kong:kong@kong-database:5432/konga"
    networks:
      - kong-net
    restart: on-failure
    environment:
      - KONG_DATABASE=postgres
      - KONG_PG_HOST=kong-database
      - KONG_PG_DATABASE=konga
      - KONG_PG_PASSWORD=kong
    links:
      - kong-database
    depends_on:
      - kong-database

  konga:
    image: ${KONGA_IMAGE_NAME}
    restart: always
    networks:
      - kong-net
    environment:
      DB_ADAPTER: postgres
      DB_URI: postgresql://kong:kong@kong-database:5432/konga
      NODE_ENV: production
    links:
      - kong-database
    depends_on:
      - kong
      - konga-prepare
    ports:
      - "1337:1337"

volumes:
  postgres-data:
  kong-data:
  kong-cfg:

知识共享许可协议
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。