Post

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.