最近Kong Gatewayに少し興味があるので、気が向いたときに遊んでみることにした。
「ローカル起動編」ってシリーズものっぽいタイトルをつけたけど、シリーズものになるかどうかは分からない。今日はとりあえずローカルで起動するところまでをやってみた。
OSSのDB-lessモードで遊ぶ
Kong GatewayにはEnterprise版とOSS版があるみたいなので、とりあえずOSS版で。
それからDBモードとDB-lessモードとがあるみたいなので、DB-lessモードで。
ということで、OSS版のDB-lessモードで遊ぶ。
ローカルマシンで起動
↓書いてあるとおりに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を渡すのがちょっと面倒だなーって思ってたら、こういうのを見つけた。設定を環境変数で差し込めるみたい。
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_PATH
と KONG_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/
面白かった。環境変数で差し込む場合は、最大長に気をつけたほうがいいかな。