Kong Gateway OSS版のDB-lessモードで遊んでみる。ローカル起動編。

最近Kong Gatewayに少し興味があるので、気が向いたときに遊んでみることにした。

「ローカル起動編」ってシリーズものっぽいタイトルをつけたけど、シリーズものになるかどうかは分からない。今日はとりあえずローカルで起動するところまでをやってみた。

OSSのDB-lessモードで遊ぶ

Kong GatewayにはEnterprise版とOSS版があるみたいなので、とりあえずOSS版で。

それからDBモードとDB-lessモードとがあるみたいなので、DB-lessモードで。

ということで、OSS版のDB-lessモードで遊ぶ。

https://docs.konghq.com/gateway/3.7.x/install/docker/?install=oss#install-kong-gateway-in-db-less-mode

ローカルマシンで起動

↓書いてあるとおりにDockerのネットワークを作って

docker network create kong-net

↓設定ファイルを作って

cat <<EOF > kong.yml
_format_version: "3.0"
_transform: true

services:
  - host: httpbin.org
    name: example_service
    port: 80
    protocol: http
    routes:
      - name: example_route
        paths:
          - /mock
        strip_path: true
EOF

↓実行。この実行方法だと管理APIを誰でも叩けるから、本番環境では使わないでねって書いてある。承知した。

docker run -d --name kong-dbless \
 --network=kong-net \
 -v "$(pwd):/kong/declarative/" \
 -e "KONG_DATABASE=off" \
 -e "KONG_DECLARATIVE_CONFIG=/kong/declarative/kong.yml" \
 -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
 -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
 -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
 -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
 -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \
 -e "KONG_ADMIN_GUI_URL=http://localhost:8002" \
 -p 8000:8000 \
 -p 8443:8443 \
 -p 127.0.0.1:8001:8001 \
 -p 127.0.0.1:8444:8444 \
 kong:3.7.1

これで起動できた。

確認

↓管理APIを叩いてみる

curl -s http://localhost:8001/services | jq
{
  "data": [
    {
      "tls_verify": null,
      "tls_verify_depth": null,
      "connect_timeout": 60000,
      "read_timeout": 60000,
      "protocol": "http",
      "host": "httpbin.org",
      "tags": null,
      "ca_certificates": null,
      "retries": 5,
      "created_at": 1721052686,
      "id": "5f2be09e-de92-5059-859b-a01b35cf0d4a",
      "port": 80,
      "write_timeout": 60000,
      "updated_at": 1721052686,
      "enabled": true,
      "client_certificate": null,
      "path": null,
      "name": "example_service"
    }
  ],
  "next": null
}

↓Gatewayを叩いてみる。httpbinにプロキシされるようになってるから、こんな感じで叩いてみた。

curl -s http://localhost:8000/mock/json
{
  "slideshow": {
    "author": "Yours Truly",
    "date": "date of publication",
    "slides": [
      {
        "title": "Wake up to WonderWidgets!",
        "type": "all"
      },
      {
        "items": [
          "Why <em>WonderWidgets</em> are great",
          "Who <em>buys</em> WonderWidgets"
        ],
        "title": "Overview",
        "type": "all"
      }
    ],
    "title": "Sample Slide Show"
  }
}

ほいほい。よい。

YAMLファイルの内容を環境変数で渡したい

デプロイするならECSがいいかなーって思ってるんだけど、ECSってConfigMapみたいなものがなくてファイルを差し込めないので、kong.ymlを渡すのがちょっと面倒だなーって思ってたら、こういうのを見つけた。設定を環境変数で差し込めるみたい。

https://docs.konghq.com/gateway/3.7.x/production/deployment-topologies/db-less-and-declarative-config/#load-the-file

Another way you can start Kong in DB-less mode is by including the entire declarative configuration in a string using the KONG_DECLARATIVE_CONFIG_STRING environment variable:

やってみよ。JSONかな?

まずはコンテナを止めて

docker stop kong-dbless
docker rm kong-dbless

起動する。ボリュームのマウントをやめて KONG_DECLARATIVE_CONFIG のところを KONG_DECLARATIVE_CONFIG_STRING に変えてみた。

docker run -d --name kong-dbless \
 --network=kong-net \
 -e "KONG_DATABASE=off" \
 -e "KONG_DECLARATIVE_CONFIG_STRING=$(cat kong.yml | yq -c)" \
 -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
 -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
 -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
 -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
 -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \
 -e "KONG_ADMIN_GUI_URL=http://localhost:8002" \
 -p 8000:8000 \
 -p 8443:8443 \
 -p 127.0.0.1:8001:8001 \
 -p 127.0.0.1:8444:8444 \
 kong:3.7.1

お。動いた。

curl -s http://localhost:8000/mock/json
{
  "slideshow": {
    "author": "Yours Truly",
    "date": "date of publication",
    "slides": [
      {
        "title": "Wake up to WonderWidgets!",
        "type": "all"
      },
      {
        "items": [
          "Why <em>WonderWidgets</em> are great",
          "Who <em>buys</em> WonderWidgets"
        ],
        "title": "Overview",
        "type": "all"
      }
    ],
    "title": "Sample Slide Show"
  }
}

ドキュメントを読みながら思ったけど

運用するときは /config エンドポイントによる設定の書き換えは使えないようにしたいかもな。

Managerを動かしてみるか

↓ここを見た感じだと

https://docs.konghq.com/gateway/3.7.x/kong-manager/enable/

KONG_ADMIN_GUI_PATHKONG_ADMIN_GUI_URL を指定すればよさそうに見える。でもDBを使ってる場合は使えるよって書いてある。

DB-lessモードだとAdmin APIがリードオンリーになるからManagerもリードオンリーになるよ、ってドキュメントのどっかで見かけたから、DB-lessモードでも動きはしそうだよな。

って思いながら、さっき実行したDockerコマンドを眺めてみると

 -e "KONG_ADMIN_GUI_URL=http://localhost:8002" \

ってあるやん。KONG_ADMIN_GUI_PATH のデフォルト値は / みたいだし、これ、ポートをマッピングするだけでいけるのでは?と思って↓を足してみた。

 -p 127.0.0.1:8002:8002 \

こう

docker run -d --name kong-dbless \
 --network=kong-net \
 -e "KONG_DATABASE=off" \
 -e "KONG_DECLARATIVE_CONFIG_STRING=$(cat kong.yml | yq -c)" \
 -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
 -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
 -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
 -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
 -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \
 -e "KONG_ADMIN_GUI_URL=http://localhost:8002" \
 -p 8000:8000 \
 -p 8443:8443 \
 -p 127.0.0.1:8001:8001 \
 -p 127.0.0.1:8002:8002 \
 -p 127.0.0.1:8444:8444 \
 kong:3.7.1

わーい。動いた。

とはいえ、更新はできないね。DB-lessモードだから想定通りね。

次は

Getting Startedのこのあたりを読んでいくかなー

https://docs.konghq.com/gateway/3.7.x/get-started/services-and-routes/

面白かった。環境変数で差し込む場合は、最大長に気をつけたほうがいいかな。