10
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

NRI OpenStandia (IAM編)Advent Calendar 2024

Day 5

Kong Gatewayをデプロイする(DB-lessモード編)

Last updated at Posted at 2024-12-04

はじめに

Kong Gateway は、以下の4つのモードでデプロイすることができます。

  • Traditionalモード
  • DB-less and declarativeモード
  • Hybridモード
  • Kong Konnect

それぞれの方式には利点と制限事項があります。そのため、Kong Gateway を本番環境にインストールする際には、どのモードを選択するかを慎重に判断することが重要です。

本記事では、DB-less and declarative モードの特徴、メリット、制限事項、ならびにデプロイ手順について説明します。

Kong Gateway とは何かを知りたい場合は、以下の記事をご覧ください。

DB-less and declarativeモードとは

DB-less モードは、データベース (DB) に接続せずインメモリストレージのみで稼働する1構成です。

image.png

DB-less モードでは仕様上 decK を利用することができません。
ただし、decK で取り扱っていた設定ファイル kong.yml を利用して設定管理 (宣言的、Declarative) を行うことができます。

ユースケースとしては、

  • kong.yml の検証 CI
  • 超 Thin 環境での Kong Gateway ホスト

あたりが想定されます。

サイドカーに立ち上げてプロキシとして使うことも想定はできますが、不必要に容量が大きくなってしまうため、その場合は Envoy 等のプロキシ製品の活用を検討すると良いと思われます。Kubernetes 環境においてルーティング等に利用を考える場合は Kong Ingress Controller の活用をご検討ください。

特徴

  • Kong Gatewayの最小構成
    DB を使わない構成なので、必要なものは Kong Gateway インスタンス (と設定ファイル) のみです。

メリット

  • Traditionalモードよりも更にシンプルな構成
    DB を使わないので疎通を含む多くの設定が不要になります。

  • 全てコードベースで完結
    起動に関する設定を「2種類 (kong.conf, kong.yml)」のソースコードに集約することができるため、管理や複製・切り戻しが楽になります。

デメリット

  • 本番運用に適さない
    DB-less モードは本番運用のための API Gateway 構成ではありません。
    検証やテスト、あるいは簡易プロキシなどのために利用するものです。

  • Kong の設定にメモリ制限がある
    kong.yml に定義する全構成がメモリ内に収まる範囲である必要があります。

  • GUIによる操作はできない
    Kong Manager (管理 GUI) へのアクセスは可能ですが、設定情報の確認や設定の追加は行えません。

  • 負荷分散はできない
    単一サーバ構成となるため、DB-less モード Kong Gateway を複数立てるだけでは厳密な負荷分散設定はできません。
    複数の Kong Gateway 前にリバースプロキシを配置すれば疑似的な構成は可能ですが、DB-less モードの利点を損なってしまいます。

DB-less モードのセットアップ

公式ドキュメントを参考に、Kong Gateway を DB-less モードでデプロイします。

Thin 環境での立ち上げを計画する場合は、CPU アーキテクチャが対応しているかについても併せてご確認ください。

環境

  • WSL 2
  • Ubuntu 22.04.1

実施手順

以下の記事では Docker を利用した起動方法の説明をしていました。

DB-less モードでは Thin な環境で実行できることが強みですので、今回は apt パッケージを利用したインストールを行います。

Kong Gateway のインストール

Ubuntu への Kong Gateway インストール
# パッケージ情報の取得
$ curl -1sLf "https://packages.konghq.com/public/gateway-38/gpg.8F87A07D181DAA6B.key" |  gpg --dearmor | sudo tee /usr/share/keyrings/kong-gateway-38-archive-keyring.gpg > /dev/null
$ curl -1sLf "https://packages.konghq.com/public/gateway-38/config.deb.txt?distro=ubuntu&codename=jammy" | sudo tee /etc/apt/sources.list.d/kong-gateway-38.list > /dev/null

# apt リスト更新
$ sudo apt-get update

# kong インストール
$ sudo apt-get install -y kong-enterprise-edition=3.8.1.0

# インストール確認
$ kong version
> Kong Enterprise 3.8.1.0

Kong Gateway の起動

DB-less モードの起動は

  • kong.confdatabase=off を設定して起動する。
  • 環境変数 KONG_DATABASEoff を設定して起動する。

のいずれかにより行います。

kong.conf の見本は GitHub を参照してください。

kong.conf
database=off

それでは起動します。

# 起動
$ sudo kong start -c kong.conf

# ポート確認
$ ss -atn
> State          Recv-Q          Send-Q                    Local Address:Port                   Peer Address:Port         Process
> ...
> LISTEN         0               4096                            0.0.0.0:8000                        0.0.0.0:*
> ...
> LISTEN         0               511                             0.0.0.0:8002                        0.0.0.0:*
> ...
> LISTEN         0               4096                          127.0.0.1:8001                        0.0.0.0:*
> ...

# 試しに Acmin API へアクセス
$ curl -i -X GET http://localhost:8001
> HTTP/1.1 200 OK
> Date: Tue, 03 Dec 2024 06:06:49 GMT
> ...

各ポートと用途の対応は以下をご確認ください。

動作確認

Traditional モードのように Admin API から Services などの追加を行うとエラー表示されます。

$ curl -i -s -X POST http://localhost:8001/services \
 --data name=example_service \
 --data url='http://worldtimeapi.org'
 
> {
>    "code": 12,
>     "name": "operation unsupported",
>     "message": "cannot create 'services' entities when not using a database"
> }

起動後に設定を追加するには kong.yml を作成した後、以下を実行します。

$ curl -i -X POST http://localhost:8001/config \
  --form config=@kong.yml

実際に kong.yml を作成してみます。
kong.yml の見本は以下のコマンドで生成できます。

$ sudo kong config -c kong.conf init

以下の記事を元にロードバランシングを設定するので、手動設定手順と比べてみていただけると良いかなと思います。

kong.yml
_format_version: "3.0"

# service, route 作成
services:
- connect_timeout: 60000
  enabled: true
  host: example_upstream
  name: example_service
  port: 80
  protocol: http
  read_timeout: 60000
  retries: 5
  routes:
  - https_redirect_status_code: 426
    name: example_route
    path_handling: v0
    paths:
    - /mock
    preserve_host: false
    protocols:
    - http
    - https
    regex_priority: 0
    request_buffering: true
    response_buffering: true
    strip_path: true
  write_timeout: 60000

# upstream 作成
upstreams:
- algorithm: round-robin
  hash_fallback: none
  hash_on: none
  hash_on_cookie_path: /
  name: example_upstream
  slots: 10000
  targets:
  - target: httpbun.com:80
    weight: 100
  - target: httpbin.org:80
    weight: 100
# kong.yml を正しく読み取れるか検証
$ sudo kong config -c kong.conf parse kong.yml
> parse successful

# 設定適用
$ curl -i -X POST http://localhost:8001/config --form config=@kong.yml

# 数回アクセスしてみる
## httpbin.org にアクセスされた
$ curl http://localhost:8000/mock
> HTTP/1.1 200 OK
> ...

## httpbun.com にアクセスされた
$ curl -http://localhost:8000/mock
> HTTP/1.1 302 Found
> Connection: keep-alive
> Location: https://httpbun.com/
> ...

無事設定通りに動いていることを確認できます。

起動時から kong.yml に従って動作させたい場合は

  • kong.confdeclarative_config=kong.yml を設定して起動する。
  • 環境変数 KONG_DECLARATIVE_CONFIGkong.yml を設定して起動する。

のいずれかにより行います。

また、8002 ポートでサービスが動いていることが確認できていましたが、実際に localhost:8002 へアクセスすると管理 GUI にアクセスできます。

kong-gui.png

ただし、この画面から Routes や Services などを追加することはできません。
たとえ設定を行った後でも Summary の数字は増えませんので、完全に利用できない機能であると言えます。

Kong Gateway を停止するには以下を実行します。
永続化を行っていないので、先ほど設定したロードバランシングを含め、すべての設定値は削除されます。

$ sudo kong stop

さいごに

本記事では、Kong Gateway のデプロイ方式の一つである DB-less モードについて、その特徴、メリット、デメリット、そして具体的なセットアップ手順を説明しました。
DB-less モードは本番運用には適しません。
ただし、検証用のセットアップとして有効であり、特に Kong Gateway 本番構成前の kong.yml 検証には強力な起動モードであるということができます。

  1. Kong 製 OSS の lua-resty-lmdb で実現しているようです。

10
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?