GKEでGateway APIを使う
はじめに
AKSが日本リージョンでいつまでたってもGateway APIをサポートしないという悲しみにくれていたところ、さすがのGKEはGateway APIをサポートしているので、こちらを使うことにしました。
Gateway APIとは
Gateway APIは、Kubernetesのサービスネットワーキングのための新しいAPIです。従来のIngress APIの問題点を解決し、より表現力豊かで柔軟なトラフィック管理を可能にします。
Ingressの問題点
従来のIngress APIには以下のような問題がありました:
- 拡張性の限界: アノテーションに頼った拡張が多く、標準化されていない
- 役割分担の不明確: インフラ管理者とアプリ開発者の責任範囲が曖昧
- 機能不足: 高度なルーティング、重み付けトラフィック分散などが標準でサポートされていない
Istioによる解決とその課題
Istioは上記の問題を解決しましたが、以下のような新たな課題がありました:
- 複雑性: 導入・運用が複雑で学習コストが高い
- リソース消費: サイドカープロキシによるオーバーヘッド
- ベンダーロックイン: Istio固有の設定やAPIへの依存
Gateway APIはこれらの問題を標準化されたKubernetes APIとして解決します。
Gateway APIの構成
Gateway APIは役割ごとに分離された3つの主要なリソースで構成されています:
1. GatewayClass
- 役割: インフラストラクチャプロバイダーの設定
- 管理者: クラスタ管理者
- 用途: どのコントローラー(GKE、Istio、Nginxなど)を使用するかを定義
2. Gateway
- 役割: トラフィックのエントリーポイント
- 管理者: インフラ管理者
- 用途: リスナー(ポート、プロトコル)の設定
3. HTTPRoute / TCPRoute / etc.
- 役割: トラフィックルーティングルール
- 管理者: アプリケーション開発者
- 用途: サービスへのトラフィック振り分けロジック
この役割分担により、インフラとアプリケーションの関心事を明確に分離できます。
GKEでの設定方法
GKEでGateway APIを有効にするには、以下の手順を実行します。
1. クラスタでGateway APIを有効化
1
2
3
gcloud container clusters update CLUSTER_NAME \
--gateway-api=standard \
--region=REGION
2. GatewayClassの確認
GKEでは自動的にGatewayClassが作成されます:
1
kubectl get gatewayclass
3. Gatewayの作成
1
2
3
4
5
6
7
8
9
10
11
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: external-http
namespace: default
spec:
gatewayClassName: gke-l7-global-external-managed
listeners:
- name: http
protocol: HTTP
port: 80
4. HTTPRouteの作成
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
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: my-app-route
namespace: default
spec:
parentRefs:
- name: external-http
hostnames:
- "example.com"
rules:
- matches:
- path:
type: PathPrefix
value: /api
backendRefs:
- name: api-service
port: 8080
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: web-service
port: 80
動作確認
Gatewayの状態確認
1
2
kubectl get gateway external-http
kubectl describe gateway external-http
GatewayのステータスでIPアドレスを確認できます。
HTTPRouteの確認
1
2
kubectl get httproute my-app-route
kubectl describe httproute my-app-route
疎通確認
1
curl -H "Host: example.com" http://GATEWAY_IP/api
まとめ
Gateway APIを使用することで:
- 標準化: Kubernetes標準のAPIで高度なトラフィック管理が可能
- 役割分離: インフラとアプリケーションの責任範囲が明確
- 移植性: ベンダーロックインなしで異なるプロバイダー間で設定を移行可能
AKSの日本リージョンサポートを待つ間、GKEで快適にGateway APIを活用できます。
This post is licensed under
CC BY 4.0
by the author.