テックタッチアドベントカレンダー 6日目を担当する taisa です。 W杯日本代表惜しかったですね。自分は本田さんの解説と三笘さんのプレーが大好きになりました。
今回は、Kong バージョンや Blue-Green デプロイメントによるバージョンアップについて調べてみたのでまとめてみます。Kong についての詳細は、以前書いた記事「 OSS 版 API Gateway、Kong Gateway をつかってみる」を参照してください。
また、余談ですが先日「デジタル庁が、Kong Gateway を推奨 API ゲートウェイに認定する」といったプレスリリースが出されていました。
本記事の目的
Kong のバージョン 1.0.0 から 3.0.0 までの気になる更新内容をさらったあと、Kong をバージョンアップする Blue-Green デプロイメントについて簡単に解説します。以前は Lua でプラグインを書くしかなかったのが Go や TypeScript で書けるようになったり、バージョンアップをするには Blue-Green デプロイメントでダウンタイムなしで行えるが、バージョンを刻む段階を踏む必要があるので注意が必要、などが伝えられたら良いなと思います。
CHANGELOG サマリ
2022 年 12 月現在の最新バージョンは、3.0.0 となっています。本記事では、v1.0.0 ~ v3.0.0 にかけて個人的に気になった変更をピックアップしました。詳しくは本家の CHANGELOG を参考にしてください。
v1.0.0
- Kong 1.0 の安定性を維持するのに役立つ、ダウンタイムのない Blue/Green 移行パスをサポート。
v1.1.0
- インメモリストレージのみを使用した DB レス モードで実行が可能になった。
v1.3.0
- gRPC を正式にサポート開始(ネイティブな gRPC プロキシ機能)
- Route や Service の protocol 属性で指定できる(例:
protocol = grpc
) - 受信したHTTP/2リクエストが、grpc(s) プロトコルを持つ Route にマッチすると、リクエストは
ngx_http_grpc_module
によって処理され、gRPC プロトコルの仕様に従って上流の Service にプロキシされる(まだすべてのKongプラグインがgRPCリクエストに対応しているわけではない)
- Route や Service の protocol 属性で指定できる(例:
v1.5.0
- Kong 1.x シリーズの最後のリリースであり、Kong 0.x のユーザが同シリーズから、より最新のリリースにアップグレードするのを支援するために設計された。Kong のバージョンアップは段階を踏む必要があり、v0.14.1 より前の v0.x バージョンを使っている場合は、まず v0.14.1 に移行する必要があり、v0.14.1 へ移行したら、v1.5.0 に移行し、その後さらに上のバージョンへバージョンアップが可能となる。
v2.0.0
- Go プラグインのサポート(プロセス外の Go プラグインサーバーを使用することで、Lua と同様に Go でプラグインを書けるようになった。)
- 1.0.0 未満のバージョンからの移行のサポートが削除されていることに注意。Kong 1.5.0 に移行してから、Kong 2.0.0 に移行する必要あり。
v2.1.0
- この変更に伴い、不具合のある動作が確認されている。Kong のロードバランサーを使用している場合、上流の Target の 1 つへのリクエストが失敗すると、Kong が同じリクエストを別の正常に稼働している Target に別のリクエストを送信する。
- このバグは、upstream_keepalive_pool を無効にすることで一時的に緩和でき、kong.conf で
upstream_keepalive_pool_size=0
と設定する、または CLI で Kong を起動するときに、環境KONG_UPSTREAM_KEEPALIVE_POOL_SIZE=0
を設定し、Kongインスタンスを再起動する。 ✅ 更新(2020/08/13):この修正版は 2.1.2 としてリリースされた。
- このバグは、upstream_keepalive_pool を無効にすることで一時的に緩和でき、kong.conf で
- New Plugin: grpc-web プラグインを導入し、クライアントが gRPC-Web プロトコルで gRPC サービスを利用できるようになった。
- 新しいプラグイン: grpc-gateway プラグインを導入し、プレーンな HTTP リクエストで上流の gRPC サービスにアクセスできるようになった。
v2.2.0
- UDP のサポート。Kong は、ストリーム・サブシステムで UDP プロキシをサポートするようになり。udp プロトコルは、Routes の protocol 属性と Services の protocol 属性で受け入れられるようになった。ロードバランシングとロギングのプラグインも同様に UDP をサポートする。
- レート制限。設定属性 limit_by = "path " を設定することで、パスによるレート制限をサポート。
v2.4.0
- JavaScript プラグイン開発キット(PDK)が Kong 2.4と同時にリリースされ、Kong のプラグインを JavaScript や TypeScript で書くことができるようになった。
v2.8.0
- Router は、以前の Kong バージョンと比べて 2 倍の速さでビルドされるようになった。
v3.0.0
- Rust で書かれた新しいルーター実装が導入された。
- パフォーマンスとメモリ消費を改善するためにさまざまな内部変更が加えられた。
2.1.0
より前の Kong からの Blue-Green デプロイはサポートされない。Blue-Green デプロイを行うには、3.0.0
にアップグレードする前に2.1.0
またはそれ以降にアップグレードする必要がある。※ Docs には少し違ったことが書いてあるので注意が必要
Blue-Green デプロイメント
Kong のバージョンアップには Blue-Green デプロイメントがサポートされており、基本的にダウンタイムなしでアップデートできます。ただし、下記のようにポイントポイントでアップデートするバージョンを区切り、段階を踏む必要があるので注意が必要です。
Kong Gateway does not support directly upgrading from 1.x to 3.0.x. If you are running 1.x, upgrade to 2.1.0 first at minimum, then upgrade to 3.0.x from there.
また v3.0.0 への Blue-Green デプロイメントについては、次の 2.8 系(おそらく 2.8.2 リリース)からでないと出来ないようなことが書いてあるので注意してください。
Blue-green deployments Traditional mode: Blue-green upgrades from versions of 2.8.1 and below to 3.0.0 are not currently supported. This is a known issue planned to be fixed in the next 2.8 release. > When that version is released, 2.x users should upgrade to that version before beginning a blue-green upgrade to 3.0.
Upgrade Kong Gateway - v3.0.x | Kong Docs
実行イメージ
- 新バージョンの kong を立て旧バージョンの kong と同じ DB に向ける
- 新バージョンの kong から kong migration up コマンドを実行し、DB に対し非破壊的な更新(カラム追加など)を行う
- これで新旧両方のリクエストがさばけるようになるので、新バージョンの kong へリクエストを寄せる
- 動作に問題がなければ旧バージョンの kong に対するリクエストを止める
- 新バージョンの kong から kong migration finish コマンドを実行し破壊的な変更(カラム削除など)を行う(実行後旧バージョンの kong は動かなくなるので落とす)
おわりに
なかなかニッチですが、色々機能があって手元でも動かせるのでぜひ触ってみてください。