0
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?

Kong Gatewayで分散アクセスを実現する

Posted at

Kong Gatewayを使ってトラフィックをプロクシする場合、一般的には以下のようにKong Gateway内にRouteとServiceのエンティティを定義してトラフィックを転送する。
20240827090859.png

しかし、負荷分散のためにService AとBにアクセスしたい場合、Serviceで直接複数の宛先を指定することは出来ないため、Serviceだけでは分散構成が作れない。

20240827091040.png

Kong Gatewayでは分散構成を取る場合、Upstreamと呼ばれるエンティティを作成して、その中にTargetと呼ばれる実際の宛先を指定して実現する。
20240827091809.png

今回はこれの設定方法と挙動を確認する。

前提

以下があるものとして進める。

  • Kong Gateway
  • Kong Manager

検証で使ったKong Gateway、Kong Managerはこちらの方法で構築したものを利用した。
設定方法についてはAdminAPI、Deckを使ったCLIでの設定方法もあるが、ここではKong ManagerによりUIで設定する。
CLIの設定方法が気になる方は公式ドキュメントのLoad Balancingのページが参考になると思う。

検証のための設定

ここでは以下の構成を取る。
20240827092233.png

httpbin.orghttpbun.comはそれぞれリクエストのチェックに使えるWebサイトで、
https://httpbin.org/anythinghttps://httpbun.com/anythingにアクセスすると、HTTPリクエストの内容をそのまま返してくれる。

httpbin.org
  "args": {},
  "data": "",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    :(省略)
httpbun.com
  "method": "GET",
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip",
    "Host": "httpbun.com",
    :(省略)

今回は<Kong GatewayのProxy>/apicheckにアクセスすると、それぞれhttpbin.org、httpbun.comに分散するよう設定する。

ServiceとRouteの作成

最初にServiceを作成する。
通常はServiceのUpstream URLにhttpbin.org等を設定するが、今回はUpstreamエンティティの中のTargetで設定するため、実際のホスト名を指定する必要はない。
今回はNamedummy-serviceとし、Upstream URLhttps://dummy.vhostとした。
20240827100134.png

次にRouteを作成する。
こちらでは先程作成したServiceに紐づけて/apicheckというパスにアクセスすると先程のServiceを参照するように設定する。
ここではNameapicheck-routeとし、Pathsを/apicheckとした。
20240827093608.png

UpstreamとTargetの作成

UpstreamエンティティはGateway ServicesRoutesと同じようにKong Managerの左サイドバーから選択して作成することが出来る。
左サイドバーのUpstreamを選択し、Nameで先ほど作成したServiceが選択できるようになっているので選択してSaveする。
20240827094027.png
なお、ここでは細かい説明は省略するが、以下のようなものも設定できるようになっている。

  • 分散アルゴリズム:Round RobinLeast ConnectionsConsistent HashingLatencyから選択可(デフォルトはRound Robin)
  • Hashに何を使うか:ConsumerIPHeaderCookiePathから選択可
  • パスの健全性チェックやサーキットブレーカーの有効・無効
  • 健全性チェック時の健全・不健全の定義

詳細な情報が必要な人はAdvanced Load Balancingあたりのページを参照すると良いと思う。

最後にTargetを作成してRouteとエンドポイントのサービス(httpbin.org、httpbun.com)を繋ぐ。
作成後、作成したUpstreamをクリックして、Targets->New Targetを選択する。
20240827094909.png

するとTarget Addressを入力する画面に遷移するので、httpbin.orgのパスを以下のように作成する。

  • Target Address:httpbin.org:443
  • Weight:100(デフォルト値)
  • Tags:空(デフォルト値)

注意点としては、Target Addressではポートを指定しないとデフォルトで8000番を指してしまう点と、Weightはパーセンテージではなく数値である点は気にしておいた方がよい。
作成後、同じ要領でhttpbun.comに対してもTargetを作成する。

  • Target Address:httpbun.org:443
  • Weight:100(デフォルト値)
  • Tags:空(デフォルト値)

Weightを同値にしているので、おおよそ同じ割合でそれぞれの宛先に分散するはずだ。
以上で設定は終了となる。

検証

作成したRouteに以下のようなcurlコマンドで何度かアクセスしてみる。

curl localhost:8000/apicheck/anything

実行するとリクエストの内容が確認できる。

curl localhost:8000/apicheck/anything
{
  "args": {},
  "data": "",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "User-Agent": "curl/8.7.1",
    "X-Amzn-Trace-Id": "Root=1-66cd259a-55717d764f2154693d29a442",
    "X-Forwarded-Host": "localhost",
    "X-Forwarded-Path": "/apicheck/anything",
    "X-Forwarded-Prefix": "/apicheck",
    "X-Kong-Request-Id": "12378b7549a1a531baea7f7e72b9bf7b"
  },

また、"Host"がhttpbin.orgになったりhttpbun.comになったりと、宛先が切り替わっていることも確認できる。

$ for((i=0;i<10;i++)); do curl -s localhost:8000/apicheck/anything ; done | grep \"Host\"
    "Host": "httpbin.org",
    "Host": "httpbin.org",
    "Host": "httpbun.com",
    "Host": "httpbin.org",
    "Host": "httpbun.com",
    "Host": "httpbin.org",
    "Host": "httpbun.com",
    "Host": "httpbun.com",
    "Host": "httpbin.org",
    "Host": "httpbun.com",

リクエストが分散して転送されていることが確認できた。

最後に

このようにUpstreamとTargetを使うと、Pluginを使わなくても分散処理が簡単に使えることが確認できた。
ただ、カナリアリリースなど特定のユーザを特定のバージョンに流したり、一定期間後に特定のバージョンを使用不可にするような用途で使うのは難しいので、あくまでも負荷分散のために利用し、カナリアリリースのようなユースケースでは専用のPluginを使った方がよい。

0
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
0
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?