KubernetesのGateway APIは、Kubernetesでのトラフィックルーティングの処理を簡素化し、標準化するために設計されています。Ingressの強化版のようなもので、より良いマナーと豊富な語彙を持っています。

なぜ気にするべきか?

正直に言うと、現在のIngress APIは鉄の梁のように柔軟性がありません。確かに仕事はこなしますが、柔軟性で賞を取ることはありません。一方、Gateway APIはヨガの達人のように柔軟で強力で、なぜ今まで古いやり方をしていたのか不思議に思わせます。

  • より表現力があり拡張可能
  • 関心の分離が向上
  • 高度なトラフィックルーティングシナリオを処理するための標準化された方法
  • マルチテナントクラスターのサポートが向上

コアコンセプト:簡単な紹介

Gateway APIは、トラフィックルーティングを簡単にするためにいくつかの新しいリソースを導入しています:

1. GatewayClass

GatewayClassはゲートウェイの設計図のようなものです。ゲートウェイを実装するコントローラーとグローバル設定を定義します。


apiVersion: gateway.networking.k8s.io/v1beta1
kind: GatewayClass
metadata:
  name: example-gateway-class
spec:
  controllerName: example.com/gateway-controller

2. Gateway

Gatewayリソースは実際のゲートウェイのインスタンスで、特定のポートとプロトコルでリスニングします。


apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
  name: example-gateway
spec:
  gatewayClassName: example-gateway-class
  listeners:
  - name: http
    port: 80
    protocol: HTTP

3. HTTPRoute

HTTPRouteは実際のルーティングルールを定義する場所です。Kubernetesの近所の交通警官のように、さまざまな基準に基づいてリクエストをどこに送るかを指示します。


apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
  name: example-route
spec:
  parentRefs:
  - name: example-gateway
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /api
    backendRefs:
    - name: api-service
      port: 8080

良い点、悪い点、そして「おお、これはすごい!」

Gateway APIが輝く理由と、つまずく可能性のある点を見てみましょう。

良い点

  • 柔軟性:ヘッダー、クエリパラメータ、さらにはHTTPメソッドに基づいてルーティングしたいですか?Gateway APIがサポートします。
  • 標準化:ベンダー固有の注釈はもう不要です!Gateway APIは異なるKubernetes実装間での標準を目指しています。
  • 拡張性:カスタムリソース定義(CRD)により、コアAPIを壊すことなく簡単に拡張できます。

悪い点

  • 学習曲線:Ingressから移行する場合、最初は少し理解するのに時間がかかるかもしれません。
  • 成熟度:現在、まだベータ版です。進化するにつれて変更が予想されます。

「おお、これはすごい!」

最もクールな機能の1つはトラフィックスプリッティングの能力です。新しいバージョンのサービスを段階的に展開したいですか?これを見てください:


apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
  name: canary-route
spec:
  parentRefs:
  - name: example-gateway
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /app
    backendRefs:
    - name: app-v1
      port: 8080
      weight: 90
    - name: app-v2
      port: 8080
      weight: 10

この設定では、トラフィックの90%をv1に、10%をv2に送ります。カナリアデプロイメントのスムーズな航海です!

実際のシナリオ:Gateway APIが輝く場所

Gateway APIがその力を発揮するシナリオを見てみましょう:

1. マルチチームKubernetesクラスター

複数のチームのために共有Kubernetesクラスターを運用していると想像してください。Gateway APIを使用すると:

  • 各チームのために個別のゲートウェイを作成
  • ReferenceGrantを使用して、どのルートがどのゲートウェイにバインドできるかを制御
  • ゲートウェイレベルでチーム固有のポリシーを実装

チーム固有のゲートウェイを設定する方法の簡単な例を示します:


apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
  name: team-a-gateway
  namespace: team-a
spec:
  gatewayClassName: shared-gateway-class
  listeners:
  - name: http
    port: 80
    protocol: HTTP
    allowedRoutes:
      namespaces:
        from: Same
---
apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
  name: team-b-gateway
  namespace: team-b
spec:
  gatewayClassName: shared-gateway-class
  listeners:
  - name: http
    port: 80
    protocol: HTTP
    allowedRoutes:
      namespaces:
        from: Same

2. 高度なトラフィック管理

ヘッダー、クエリパラメータ、さらにはHTTPメソッドに基づいてトラフィックをルーティングする必要がありますか?Gateway APIがサポートします。カスタムヘッダーに基づいてリクエストをルーティングする例を示します:


apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
  name: header-based-route
spec:
  parentRefs:
  - name: example-gateway
  rules:
  - matches:
    - headers:
      - name: X-Version
        value: v2
    backendRefs:
    - name: app-v2
      port: 8080
  - matches:
    - headers:
      - name: X-Version
        value: v1
    backendRefs:
    - name: app-v1
      port: 8080
  - backendRefs:
    - name: app-default
      port: 8080

3. A/Bテストの実装

Gateway APIのトラフィックスプリッティング機能は、A/Bテストに最適です。新機能のA/Bテストを設定する方法を示します:


apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
  name: ab-test-route
spec:
  parentRefs:
  - name: example-gateway
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /feature
    backendRefs:
    - name: feature-a
      port: 8080
      weight: 50
    - name: feature-b
      port: 8080
      weight: 50

注意点とヒント

新しい技術を扱う際には、いくつか注意すべき点があります:

ギャップに注意

すべてのKubernetesディストリビューションがGateway APIをすぐにサポートしているわけではありません。別途インストールが必要な場合があります。インストール手順については、公式Gateway APIリポジトリを確認してください。

バージョンが重要

Gateway APIはまだ進化中です。Kubernetesクラスターと互換性のあるバージョンを使用していることを確認してください。執筆時点では、v0.5.0が最新の安定版です。

コントローラーの互換性

すべてのIngressコントローラーがGateway APIをサポートしているわけではありません。ContourやIstioのような人気のあるオプションは良いサポートを提供していますが、使用するコントローラーのドキュメントを必ず確認してください。

移行パス

Ingressから移行する場合、移行を慎重に計画してください。移行期間中はIngressとGateway APIを並行して実行することを検討してください。

未来は明るい

Gateway APIは一時的なものではありません。Kubernetesでのトラフィックルーティングを処理する標準的な方法になる予定です。成熟するにつれて、次のことが期待されます:

  • サーキットブレーカーやリトライポリシーなどの高度な機能
  • サービスメッシュ技術との統合の向上
  • 非HTTPプロトコルのサポートの向上

まとめ

KubernetesのGateway APIは、試してみるまで必要だと気づかなかったクールな新しいガジェットのようなものです。旧Ingress APIよりも表現力があり、強力で、標準化されています。確かに学習曲線はありますが、その利点は初期の時間投資をはるかに上回ります。

次回、Ingressリソースと注釈の網に絡まったときは、より良い方法があることを思い出してください。Gateway APIは、あなたの一日と共にあなたの正気を救うためにここにあります。

"未来は、そのゲートウェイの美しさを信じる者に属する。" - エレノア・ルーズベルト(おそらく)

ハッピーなルーティングを、そしてあなたのトラフィックが常に家に帰る道を見つけられますように!