【Envoy Gateway】Gateway Namespace Mode を試してみた¶
本記事では、Envoy Gateway における"Gateway Namespace Mode"について、公式ドキュメントの例を基に紹介します。
Envoy Gateway の標準のデプロイモードでは、Envoy Proxy に関連するリソース(Deployment, Service 等)は、Envoy Gateway コントローラーと同じ Namespace(通常 envoy-gateway-system
)に作成されます。
これに対し、Gateway Namespace Mode
は、これらのデータプレーンリソースを各 Gateway リソースが定義された Namespace に配置することにより、リソース分離とマルチテナンシーの強化を実現する機能です。
本記事の内容:
- Gateway Namespace Mode の概要と利点
- 標準デプロイモードとの相違点
- Gateway Namespace Mode の設定手順
- 実際のデプロイ例を通じた動作検証
留意事項: Gateway Namespace Mode は、本記事執筆時点(v1.4.0)においてアルファ版の機能です。実稼働環境での利用は、ベータ版以降のリリースを待つことが推奨されます。最新情報やフィードバックについては、公式 GitHub issues をご参照ください。また、現時点では Merged Gateways との併用はサポートされていません。
Gateway Namespace Mode の概要¶
Gateway Namespace Mode の主要な特徴は次の通りです。
- データプレーンリソースの分離: Envoy Proxy の Deployment, Service, ServiceAccount といったデータプレーンリソースが、Gateway リソースと同一の Namespace に作成されます。これにより、テナントやチーム単位でのリソース分離が明確になります。
- 認証方式の変更:
- 標準モードでは、インフラストラクチャとコントロールプレーン間で mTLS (相互 TLS 認証) が使用されます。
- Gateway Namespace Mode では、サーバーサイド TLS および JWT (JSON Web Token) 検証へと移行しています。
- 具体的には、projected service account JWT token を利用し、有効期間が短く、対象オーディエンスが限定されたトークンが Pod に自動的にマウントされます。
- JWT 検証により、認可されたプロキシのみが xDS サーバーに接続可能であることを保証します。
- Gateway の Namespace で実行される Pod には CA 証明書のみが利用可能となり、クライアント証明書はマウントされません。Envoy Proxy は引き続き CA 証明書を使用してサーバー証明書を検証します。
設定手順¶
Gateway Namespace Mode を有効化するには、Envoy Gateway の Helm チャートの値を変更します。
- Helm Values の設定:
provider.kubernetes.deploy.type
フィールドをGatewayNamespace
に設定します。 - Helm コマンドによるインストール例: 次のコマンドでも Gateway Namespace Mode を有効にしてインストール可能です。
RBAC 設定¶
Gateway Namespace Mode を使用する場合、Envoy Gateway は異なる Namespace 間でリソースを作成・管理するために追加の RBAC (Role-Based Access Control) 権限を必要とします。これらの RBAC リソース (ClusterRole, ClusterRoleBinding) は、Gateway Namespace Mode を有効にして Helm チャートをインストールする際に自動的に作成されます。
例えば、次のような ClusterRole が作成され、ServiceAccount, Service, Deployment 等のリソースに対する create
, get
, delete
などの権限が付与されます。
特定の Namespace のみを監視対象とする設定 (EnvoyGateway.provider.kubernetes.watch.namespaces
や EnvoyGateway.provider.kubernetes.watch.namespaceSelector
) を行っている場合、Envoy Gateway は指定された Namespace の Gateway API リソースのみを監視し、インフラ管理に必要な Role をそれらの Namespace に作成します。
公式の例を試す¶
公式ドキュメントに記載されている例を参考に、Gateway Namespace Mode の動作を検証します。この例では、team-a
と team-b
という 2 つの異なる Namespace に Gateway をデプロイします。
テスト用 Namespace の作成¶
まず、テスト用の Namespace を作成します。
サンプルマニフェストの適用¶
次に、公式ドキュメントで提供されているサンプルマニフェストを適用します。これにより、team-a
および team-b
の各 Namespace に、バックエンドの Deployment、Gateway、そしてそれぞれの HTTPRoute が作成されます。
リソースの確認¶
各リソースが正しくデプロイされたかを確認します。
-
Gateway の確認:
PROGRAMMED
がTrue
であることを確認します。
-
HTTPRoute の確認:
-
Pod の確認: Gateway Namespace Mode の特徴として、Envoy Proxy の Pod が各 Gateway の Namespace (
team-a
,team-b
) に作成されます。envoy-team-a-gateway-a-...
やenvoy-team-b-gateway-b-...
といった名称の Pod がそれぞれの Namespace に存在し、READY 2/2
となっていることを確認します。
-
Service の確認: 同様に、Envoy Proxy の Service も各 Namespace に作成されます。
動作テスト¶
最後に、実際にリクエストを送信し、ルーティングが機能しているかを確認します。
-
外部 IP の取得: まず、各 Gateway Service の外部 IP アドレスを取得します。
-
team-a へのリクエスト:
team-a
の Gateway (ポート8080
) を経由して、www.team-a.com
へのリクエストを送信します。期待されるレスポンス例:
レスポンス内の
"namespace": "team-a"
および"pod": "team-a-backend-..."
から、team-a
のバックエンドにルーティングされたことが確認できます。
- team-b へのリクエスト:
team-b
の Gateway (ポート8081
) を経由して、www.team-b.com
へのリクエストを送信します。期待されるレスポンス例:同様に、"namespace": "team-b"
からteam-b
のバックエンドにルーティングされたことが確認できます。
以上の手順により、Gateway Namespace Mode が正しく機能し、各 Namespace の Gateway がそれぞれのデータプレーンリソースを保持し、独立して動作していることが確認できました。
ClusterIP での動作確認¶
Gateway Namespace Mode では、Envoy Proxy の Service が各 Gateway の Namespace に作成されますが、ClusterIP タイプの Service でも動かせます。 デフォルトの Service タイプは LoadBalancer となっており、外部 IP アドレスが割り当てられます。 ClusterIP にすることで外部 IP を持たない Service となり、Kubernetes クラスタ内での通信に限定されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 |
|
先ほど検証で使用した公式のマニフェストを元に、新しく EnvoyProxy リソースを作成し、GatewayClass に EnvoyProxy を紐付けています。 この EnvoyProxy リソースを作成することで、Envoy Proxy の Service が ClusterIP タイプで作成されます。 ここでは、複数の namespace を跨いで 1 つの EnvoyProxy リソースを使っていますが、各 namespace 毎に EnvoyProxy リソースを作成可能です。
それぞれの Gateway に対してリクエストを送り、通信ができることを確認します。
ここでは実行結果の記述を省略しますが、上記のコマンドを実行すると公式例と同様のレスポンスが得られます。
結論¶
Envoy Gateway の Gateway Namespace Mode は、データプレーンリソースを Gateway ごとに分離することにより、マルチテナンシー環境における分離性と管理性を向上させる機能です。認証メカニズムも JWT ベースに移行し、セキュリティ面も考慮されています。
現時点ではアルファ版ですが、今後の発展が期待される機能の 1 つです。実稼働環境での利用に際しては慎重な検討を行い、公式ドキュメントや GitHub issue で最新情報を確認することを推奨します。
参照資料: