Skip to content
Published on

Kubernetesネットワーキングの終焉と復活:2026年3月までに必ず知るべき5つの変化

Authors
  • Name
    Twitter

1. 序論:あなたのクラスターが危険にさらされている

2026年3月、Kubernetesエコシステムで最も広範に使用されてきたインフラコンポーネントの一つが公式に寿命を迎える。Ingress NGINX Controller(kubernetes/ingress-nginx)のEOL(End of Life)だ。

これは単純なバージョンアップグレードやマイナー変更ではない。インターネットに接続されたKubernetesクラスターの約41~50%がIngress NGINXを使用しており、RKE2、IBM Cloud、Alibaba ACKなどの主要プラットフォームでデフォルトのIngressコントローラーとして搭載されている。このコントローラーがセキュリティパッチ、バグ修正、そしていかなるリリースも受けられなくなるということは、すなわち数十万のプロダクションクラスターが保護されない状態で放置されることを意味する。

"In March 2026, Kubernetes will retire Ingress NGINX, a piece of critical infrastructure for about half of cloud native environments... Half of you will be affected. You have two months left to prepare... We cannot overstate the severity of this situation or the importance of beginning migration..."

-- Kat Cosgrove, CNCF Ambassador & DevRel Engineer

本稿では、この移行の本質を5つのコア視点から分析する:

  1. 時限爆弾のカウントダウン -- Ingress NGINXの公式リタイアとその余波
  2. アノテーションの泥沼からの脱出 -- 構造的欠陥とGateway APIの解決策
  3. 役割の分離 -- インフラ管理者と開発者の平和的共存
  4. ベンダーロックインからの脱却 -- ポータビリティの実現
  5. パフォーマンスの飛躍 -- HTTP/3とQUICの本格導入
  ┌─────────────────────────────────────────────────────────────────┐
2026年Kubernetesネットワーキング移行ロードマップ │
  ├──────────┬──────────┬──────────┬──────────┬──────────┬──────────┤
2025.032025.112026.032026.062026.112027+  │          │          │          │          │          │          │
Ingress  │ リタイア │ ■ EOL ■  │ GatewayAKS/GKEIngressNightmare│ 公式     │ セキュリ │ API v1.5 │ 延長サポ │ APICVE 発生 │ 発表     │ ティパッ  (予想)   │ ート終了 │ 残存    │
  │          │          │ チ完全終 │          │          │ 可能性↓ │
GW APIGW API   │ 了       │          │          │          │
  │ v1.2     │ v1.4 GA  │          │          │          │          │
  └──────────┴──────────┴──────────┴──────────┴──────────┴──────────┘
         ▲                    ▲                    ▲
         │                    │                    │
    CVE-2025-1974        コミュニティ支援      クラウドベンダー
    CVSS 9.8             完全終了             延長サポート終了

2. [Takeaway 1] 時限爆弾のカウントダウン:Ingress NGINXの公式リタイア

2.1 何がリタイアするのか:正確な範囲定義

混同を防ぐために明確にすべきことがある。リタイアするのはkubernetes/ingress-nginxコントローラープロジェクトだ。GA(General Availability)状態のIngress API自体(networking.k8s.io/v1)はKubernetesで依然としてサポートされている。しかしIngress APIを実際に動作させる最も大衆的な実装体が消えることになるため、実質的な影響は甚大だ。

  ┌─────────────────────────────────────────────────────────┐
  │                  リタイア範囲の明確化                      │
  │                                                         │
  │  ✗ リタイア対象:  kubernetes/ingress-nginx コントローラー  │
                 (コミュニティメンテナンスプロジェクト)  │                                                         │
  │  ✓ 維持対象:  Ingress API (networking.k8s.io/v1)F5 NGINX Ingress Controller (商用)  │               その他サードパーティIngress実装体            │
  │                                                         │
  │  ★ 新標準:   Gateway API (gateway.networking.k8s.io)  └─────────────────────────────────────────────────────────┘

2.2 なぜ今なのか:構造的問題の蓄積

Ingress NGINXプロジェクトのリタイアは突然の決定ではない。数年にわたり蓄積された構造的問題が臨界点に達した結果だ:

1) メンテナンス人員の枯渇

プロジェクトは長期間にわたりわずか1~2名のボランティアに依存してきた。インターネットに接続されたクラスターの半数に影響を与えるコアインフラが個人の余暇時間に依存するというのは持続可能なモデルではない。

"For a long time, we've considered big companies or end user companies that rely on open source not contributing back to be a moral issue. But now, I think it's very easy to make the argument that not contributing back to open source is, in fact, a security issue. You have to start considering open source contributions as part of your security plan."

-- Kat Cosgrove

2) 手に負えない技術負債

かつて柔軟性として評価されていた機能、特にsnippetsアノテーションを通じた任意のNGINX設定注入機能が、今では手に負えないセキュリティ脆弱性として認識されている。この問題は後で詳しく扱う。

3) IngressNightmare:CVE-2025-1974の衝撃

2025年3月に発見されたCVE-2025-1974(CVSS 9.8)はIngress NGINXの構造的脆弱性を劇的に露呈させた。

2.3 IngressNightmare:史上最悪のKubernetes脆弱性

CVE-2025-1974は単独の脆弱性ではなく、5つの連鎖脆弱性(CVE-2025-1097、CVE-2025-1098、CVE-2025-24513、CVE-2025-24514、CVE-2025-1974)で構成された攻撃チェーンだ。

CVE IDCVSS説明
CVE-2025-245148.8auth-urlアノテーションを通じた設定注入
CVE-2025-10978.8auth-tls-match-cnアノテーションを通じた設定注入
CVE-2025-10988.8mirror-target/mirror-hostアノテーションを通じた設定注入
CVE-2025-245134.8auth-urlファイルパス検証の欠如
CVE-2025-19749.8認証なしのリモートコード実行(Unauthenticated RCE)

攻撃シナリオ:

  攻撃者 (Podネットワークアクセス可能)
  ┌──────────────────────────┐
Admission Webhook       │  ← 認証なしでアクセス可能
    (8443ポート)  └──────────┬───────────────┘
             │ 悪意のあるIngressオブジェクト送信
  ┌──────────────────────────┐
NGINX設定注入            │  ← 任意のNGINX directive挿入
    (CVE-2025-1097/1098/24514活用)  └──────────┬───────────────┘
             │ 操作された設定でRCE達成
  ┌──────────────────────────┐
  │  コントローラーPod掌握    │  ← CVE-2025-1974
    (CVSS 9.8)  └──────────┬───────────────┘
ServiceAccountトークン窃取
  ┌──────────────────────────┐
  │  全クラスターシークレット │  ← 全ネームスペースの
  │  アクセスおよびクラスター │     Secret閲覧可能
  │  乗っ取り                │
  └──────────────────────────┘

Wiz Researchによると、クラウド環境の約43%がこの脆弱性にさらされており、Fortune 500企業を含む6,500以上のクラスターが脆弱なAdmission Controllerをパブリックインターネットに公開していた。

この事件の核心的教訓は明確だ:アノテーションベースの設定注入というアーキテクチャ自体が根本的なセキュリティ脅威であるということだ。

2.4 EOLタイムラインとプラットフォーム別影響

時点イベント影響
2025年3月IngressNightmare(CVE-2025-1974)発表緊急パッチ配布(v1.12.1、v1.11.5)
2025年11月Ingress NGINX公式リタイア発表コミュニティマイグレーション推奨開始
2026年3月コミュニティサポート完全終了セキュリティパッチ、バグ修正、リリース全面停止
2026年11月AKS Application Routing延長サポート終了Azure管理環境もサポート終了
2026年11月以降全公式/延長サポート終了完全自己責任運用

"Best-effort maintenance will continue until March 2026. Afterward, there will be no further releases, no bugfixes, and no updates to resolve any security vulnerabilities that may be discovered."

-- Tabitha Sable, Kubernetes Security Response Committee

クラウドベンダー別対応状況:

クラウドベンダー対応戦略延長サポート推奨代替手段
Azure (AKS)Application Routing Add-on内ingress-nginxサポート2026年11月まで(セキュリティパッチのみ)Gateway API + NGINX Gateway Fabric
GCP (GKE)GKE Gateway Controller提供ベンダー独自実装への移行推奨GKE Gateway Controller
AWS (EKS)AWS Load Balancer Controller独自実装で既に分離AWS Gateway API Controller
セルフホスト直接マイグレーション必要なし(2026年3月終了)NGINX Gateway Fabric、Envoy Gatewayなど

セルフホスト環境で運用中の組織にとって状況は最も緊急だ。2026年3月以降に発見される全てのセキュリティ脆弱性に対していかなる公式パッチも提供されない。


3. [Takeaway 2] アノテーション(Annotation)の泥沼からの脱出

3.1 アノテーションベース設定の構造的欠陥

Ingress APIの最も根本的な限界は表現力の不足だ。Ingressリソースのspecはホストベースルーティングとパスベースルーティングという最も基礎的な機能のみをサポートする。その結果、実務で必要なほぼ全ての高度な機能は**アノテーション(annotation)**という非構造的メカニズムに依存することになった。

アノテーションの根本的な問題点を分析すると以下の通りだ:

1) 型安全性の欠如

アノテーションは単純なkey: value文字列ペアだ。スキーマ検証がないため、タイプミス、不正な値フォーマット、不正なキー名がデプロイ時点まで発見されない。

# このタイプミスを発見できるだろうか?
metadata:
  annotations:
    # タイプミス: "rewrite-target" → "rewrite-traget"
    nginx.ingress.kubernetes.io/rewrite-traget: /$2
    # 型エラー: 数値であるべきだが文字列を渡している
    nginx.ingress.kubernetes.io/proxy-read-timeout: 'sixhundred'
    # 不正なprefix: "nginx.ingress.kubernetes.io" → "nginx.kubernetes.io"
    nginx.kubernetes.io/ssl-redirect: 'true'

上記3つ全てkubectl apply時にいかなるエラーもなく適用される。問題はランタイムで予期しない動作としてのみ現れ、デバッグに数時間かかる可能性がある。

2) ベンダーロックインの強化

各Ingress Controllerは独自のアノテーションネームスペースを使用する:

# ingress-nginx専用
nginx.ingress.kubernetes.io/canary: 'true'
nginx.ingress.kubernetes.io/canary-weight: '20'

# Traefik専用
traefik.ingress.kubernetes.io/router.middlewares: default-rate-limit@kubernetescrd

# HAProxy専用
haproxy.org/rate-limit-requests: '100'

# AWS ALB専用
alb.ingress.kubernetes.io/target-type: ip

同一の機能(カナリーデプロイ、レート制限など)を実装しながらも完全に異なるアノテーション文法を使用する。一つのコントローラーから別のコントローラーへマイグレーションする際、全てのアノテーションを手作業で変換する必要がある。

3) 監査(Audit)およびガバナンスの不可能性

アノテーションはIngressリソースのメタデータにフラットに列挙される。数十個のアノテーションが付いたIngressオブジェクトからセキュリティに敏感な設定を識別するのは事実上不可能だ。RBACで特定のアノテーションのみ制限することも不可能だ -- アノテーションを書けるなら全てのアノテーションを書ける。

3.2 snippetsアノテーション:設計された脆弱性

アノテーション問題の極端な事例がnginx.ingress.kubernetes.io/configuration-snippetnginx.ingress.kubernetes.io/server-snippetだ。これらのアノテーションは任意のNGINX設定ディレクティブを直接注入できるようにする。

# 危険:任意のNGINX設定注入可能
metadata:
  annotations:
    nginx.ingress.kubernetes.io/configuration-snippet: |
      # 正常な使用意図:カスタムヘッダー追加
      more_set_headers "X-Custom-Header: value";

      # 悪意のある活用:サーバー情報窃取
      # proxy_pass http://internal-service.kube-system.svc.cluster.local;

      # 悪意のある活用:認証バイパス
      # satisfy any;
      # allow all;

この機能はCVE-2023-5043など複数のセキュリティ脆弱性の直接的原因だった。Ingressオブジェクトを作成できる権限さえあれば、事実上NGINXプロセスの全設定を操作できた。これはconfiguration-snippetアノテーションがNGINX設定ファイルのlocationブロックに、server-snippetserverブロックにそのまま挿入されるためだ。

3.3 Gateway APIのアノテーションなしモデル(Annotation-less Model)

Gateway APIはこの問題を構造化されたAPI型で解決する。アノテーションに依存する代わりに、型指定された(Typed)CRDフィールドを通じて設定を表現する。

比較例:HTTPSリダイレクトとパスリライト

既存のIngress + アノテーション方式:

# Ingress方式:アノテーションに依存
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: 'true'
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/proxy-read-timeout: '600'
    nginx.ingress.kubernetes.io/proxy-send-timeout: '600'
    nginx.ingress.kubernetes.io/proxy-body-size: '100m'
    nginx.ingress.kubernetes.io/cors-allow-origin: 'https://example.com'
    nginx.ingress.kubernetes.io/cors-allow-methods: 'GET, POST, PUT'
    nginx.ingress.kubernetes.io/cors-allow-headers: 'Content-Type, Authorization'
    nginx.ingress.kubernetes.io/enable-cors: 'true'
    nginx.ingress.kubernetes.io/limit-rps: '100'
    nginx.ingress.kubernetes.io/canary: 'true'
    nginx.ingress.kubernetes.io/canary-weight: '20'
spec:
  ingressClassName: nginx
  tls:
    - hosts:
        - app.example.com
      secretName: app-tls
  rules:
    - host: app.example.com
      http:
        paths:
          - path: /api(/|$)(.*)
            pathType: ImplementationSpecific
            backend:
              service:
                name: api-service
                port:
                  number: 80

Gateway API方式:

# Gateway API方式:構造化されたスペック
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: my-app
spec:
  parentRefs:
    - name: production-gateway
  hostnames:
    - app.example.com
  rules:
    # ルール1:HTTPSリダイレクト(アノテーションなしでスペックで表現)
    - filters:
        - type: RequestRedirect
          requestRedirect:
            scheme: https
            statusCode: 301
      matches:
        - headers:
            - name: X-Forwarded-Proto
              value: http
    # ルール2:APIルーティング
    - matches:
        - path:
            type: PathPrefix
            value: /api
      filters:
        - type: URLRewrite
          urlRewrite:
            path:
              type: ReplacePrefixMatch
              replacePrefixMatch: /
      backendRefs:
        - name: api-service
          port: 80
          weight: 80
        - name: api-service-canary
          port: 80
          weight: 20

コアな差分分析:

側面Ingress + アノテーションGateway API
型安全性なし(文字列key-value)あり(CRDスキーマ検証)
IDEサポートなし自動補完、リアルタイム検証
デプロイ時検証なし(ランタイムエラー)Admission Webhook検証
カナリーデプロイアノテーション(ベンダー依存)backendRefs.weight(標準)
HTTPSリダイレクトアノテーション(ベンダー依存)RequestRedirectフィルター(標準)
パスリライトアノテーション + 正規表現URLRewriteフィルター(標準)
RBAC制御アノテーション単位の制御不可リソース単位のRBAC可能
監査追跡困難CRDレベルで可能

3.4 Policy Attachment:アノテーションの真の代替

Gateway APIのPolicy Attachmentモデルは、アノテーションが担当していた横断的関心事(cross-cutting concerns)を独立したリソースに分離する。

# タイムアウトポリシー:別のリソースとして管理
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: BackendLBPolicy
metadata:
  name: api-timeout-policy
spec:
  targetRefs:
    - group: ''
      kind: Service
      name: api-service
  sessionPersistence:
    sessionName: my-session
    type: Cookie
---
# TLSポリシー:バックエンドTLS設定を別リソースに分離
apiVersion: gateway.networking.k8s.io/v1alpha3
kind: BackendTLSPolicy
metadata:
  name: api-backend-tls
spec:
  targetRefs:
    - group: ''
      kind: Service
      name: api-service
  validation:
    caCertificateRefs:
      - name: backend-ca-cert
        group: ''
        kind: ConfigMap
    hostname: api-internal.example.com

このモデルの利点は明確だ:

  • 関心の分離:ルーティングルール(HTTPRoute)と運用ポリシー(Policy)が独立して管理される
  • 再利用性:一つのポリシーを複数のサービスにアタッチできる
  • RBAC適用:ポリシーリソースに対して別のRBACルールを適用できる
  • 監査容易性:どのポリシーがどの対象に適用されているか明確に追跡できる

4. [Takeaway 3] 役割の分離:インフラ管理者と開発者の平和的共存

4.1 Ingressのガバナンス問題

既存のIngress APIの根本的な設計限界の一つは役割分離の欠如だ。単一のIngressリソース内にインフラ設定(TLS証明書、リスナーポート)とアプリケーションルーティングルール(パスマッチング、バックエンドサービス)が混在している。

# Ingress:インフラとアプリケーション設定が混在
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app
  # 誰がこのアノテーションを管理するのか?インフラチーム?開発チーム?
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: 'true' # インフラ関心事
    nginx.ingress.kubernetes.io/proxy-body-size: '50m' # インフラ関心事
    nginx.ingress.kubernetes.io/rewrite-target: /$1 # アプリケーション関心事
    nginx.ingress.kubernetes.io/canary-weight: '10' # アプリケーション関心事
spec:
  ingressClassName: nginx # インフラ関心事
  tls:
    - hosts:
        - app.example.com
      secretName: production-tls-cert # インフラ関心事(シークレット管理)
  rules:
    - host: app.example.com # 混合関心事
      http:
        paths:
          - path: /api/(.*) # アプリケーション関心事
            pathType: ImplementationSpecific
            backend:
              service:
                name: api-service # アプリケーション関心事
                port:
                  number: 80

この構造では、開発者が自分のルーティングルールを変更するためにインフラ設定が含まれた同じリソースを修正する必要がある。逆に、インフラ管理者がTLS証明書を交換するにはアプリケーションルーティングルールが含まれたリソースにアクセスする必要がある。

4.2 Gateway APIの役割ベースリソース階層

Gateway APIはこの問題を3階層リソースモデルで解決する:

  ┌─────────────────────────────────────────────────────────────┐
Layer 1: GatewayClass  │  ─────────────────────                                      │
  │  担当: Infrastructure Provider (クラウドベンダー、プラットフォームチーム)  │  役割: データプレーン実装体の定義                              │
  │  例: "nginx", "envoy", "gke-l7-global"RBAC: cluster-adminレベル                                   │
  ├─────────────────────────────────────────────────────────────┤
Layer 2: Gateway  │  ─────────────────                                          │
  │  担当: Cluster Operator (プラットフォーム/インフラエンジニア)  │  役割: リスナー、TLSIPアドレス、ポート、許可ネームスペース設定 │
  │  例: 443ポートHTTPSリスナー、ワイルドカード証明書              │
RBAC: namespace-adminレベル(インフラネームスペース)         │
  ├─────────────────────────────────────────────────────────────┤
Layer 3: HTTPRoute / GRPCRoute / TCPRoute  │  ───────────────────────────────────────────                 │
  │  担当: Application Developer (サービス開発者)  │  役割: ルーティングルール、バックエンドサービスマッピング、トラフィックウェイト │
  │  例: /api → api-service、カナリー20%RBAC: namespace-editorレベル(アプリケーションネームスペース) │
  └─────────────────────────────────────────────────────────────┘

役割別責任マトリクス:

役割リソース責任範囲RBAC例
Infrastructure ProviderGatewayClassデータプレーン実装体の登録、パラメータ定義ClusterRole: gatewayclass-admin
Cluster OperatorGateway, ReferenceGrantリスナー設定、TLS証明書管理、ネームスペースアクセス制御Role: gateway-admin (infra-ns)
Application DeveloperHTTPRoute, GRPCRouteルーティングルール定義、バックエンドサービスマッピング、トラフィック分配Role: route-editor (app-ns)

4.3 実戦RBAC構成例

ステップ1:Infrastructure Provider -- GatewayClass定義

# インフラプロバイダーが定義するGatewayClass
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: nginx-gateway-fabric
spec:
  controllerName: gateway.nginx.org/nginx-gateway-controller
  parametersRef:
    group: gateway.nginx.org
    kind: NginxProxy
    name: production-proxy-config

ステップ2:Cluster Operator -- Gateway設定

# クラスターオペレーターが管理するGateway
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: production-gateway
  namespace: gateway-infra # インフラ専用ネームスペース
spec:
  gatewayClassName: nginx-gateway-fabric
  listeners:
    - name: https
      protocol: HTTPS
      port: 443
      tls:
        mode: Terminate
        certificateRefs:
          - name: wildcard-tls-cert
            kind: Secret
      allowedRoutes:
        namespaces:
          from: Selector
          selector:
            matchLabels:
              gateway-access: 'true' # 許可されたネームスペースのみ
    - name: http
      protocol: HTTP
      port: 80
      allowedRoutes:
        namespaces:
          from: Same
---
# クロスネームスペース参照許可
apiVersion: gateway.networking.k8s.io/v1beta1
kind: ReferenceGrant
metadata:
  name: allow-gateway-to-app-secrets
  namespace: app-team-a
spec:
  from:
    - group: gateway.networking.k8s.io
      kind: Gateway
      namespace: gateway-infra
  to:
    - group: ''
      kind: Service

ステップ3:Application Developer -- HTTPRoute定義

# 開発者が自分のネームスペースで管理するHTTPRoute
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: api-routes
  namespace: app-team-a # アプリケーションネームスペース
spec:
  parentRefs:
    - name: production-gateway
      namespace: gateway-infra # インフラネームスペースのGateway参照
      sectionName: https
  hostnames:
    - api.example.com
  rules:
    - matches:
        - path:
            type: PathPrefix
            value: /v1
      backendRefs:
        - name: api-v1
          port: 8080
          weight: 80
        - name: api-v2
          port: 8080
          weight: 20 # カナリーデプロイ:20%のトラフィックをv2へ

RBACポリシー例:

# 開発者用Role:HTTPRouteのみ作成/修正可能
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: route-editor
  namespace: app-team-a
rules:
  - apiGroups: ['gateway.networking.k8s.io']
    resources: ['httproutes', 'grpcroutes']
    verbs: ['get', 'list', 'watch', 'create', 'update', 'patch', 'delete']
  - apiGroups: ['gateway.networking.k8s.io']
    resources: ['gateways']
    verbs: ['get', 'list'] # Gatewayは閲覧のみ可能
---
# インフラオペレーター用Role:Gateway管理可能、Route作成不可
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: gateway-admin
  namespace: gateway-infra
rules:
  - apiGroups: ['gateway.networking.k8s.io']
    resources: ['gateways', 'referencegrants']
    verbs: ['get', 'list', 'watch', 'create', 'update', 'patch', 'delete']
  - apiGroups: ['']
    resources: ['secrets']
    verbs: ['get', 'list', 'watch', 'create', 'update']

この構造が提供する実質的な価値は以下の通りだ:

  • 開発者の自律性:開発者はインフラチームの承認なしに自分のネームスペースでルーティングルールを自由に変更できる
  • インフラの安全性:開発者がTLS証明書、リスナーポート、許可ネームスペースなどのインフラ設定を誤って変更するリスクが根本的に遮断される
  • クロスネームスペースセキュリティReferenceGrantを通じて他のネームスペースのリソース参照を明示的に許可する必要があるため、不正アクセスが防止される
  • セルフサービスガバナンス:プラットフォームチームはallowedRoutesを通じてどのネームスペースがGatewayを使用できるか制御し、開発チームはその範囲内で自由に運用する

5. [Takeaway 4] ベンダーロックインを打ち破るポータビリティの実現

5.1 ポータビリティ問題の本質

Ingress APIがベンダーポータビリティを提供できない理由はシンプルだ:標準スペックが貧弱すぎるためだ。Ingress APIのspecはホストマッチング、パスマッチング、TLS終端という最小限の機能のみ定義する。実務で必要な全ての高度な機能(カナリーデプロイ、レート制限、ヘッダー操作、タイムアウト、リトライなど)はアノテーションを通じて各ベンダーが独自に実装する。

結果的に、Ingressリソースを記述した瞬間に特定のコントローラーに依存することになる。これは"Write once, run anywhere"というKubernetesの理想と正面から衝突する。

  ┌─────────────────────────────────────────────────────────────┐
Ingress APIのポータビリティ限界              │
  │                                                             │
Ingress spec (標準)         アノテーション (非標準)  │  ┌───────────────────┐   ┌──────────────────────────────┐   │
  │  │ host: app.com     │   │ nginx.ingress.k8s.io/...     │   │
  │  │ path: /api        │   │ traefik.ingress.k8s.io/...   │   │
  │  │ tls: cert         │   │ alb.ingress.k8s.io/...       │   │
  │  │                   │   │ haproxy.org/...               │   │
 (ポータブル) (ポータブルでない - ベンダー依存) │   │
  │  └───────────────────┘   └──────────────────────────────┘   │
20%                        80%  │    実際の設定の20%のみが       残り80%はベンダー固有          │
  │    ポータブル                 アノテーションに依存            │
  └─────────────────────────────────────────────────────────────┘

5.2 Gateway APIのポータビリティ戦略

Gateway APIは機能を**3つのサポートレベル(Support Level)**に階層化してポータビリティと拡張性を同時に確保する:

サポートレベル説明ポータビリティ適合性テスト
Core全ての実装が必ずサポートすべきコア機能完全ポータブル必須通過
Extendedポータブルだが全ての実装がサポートするとは限らない機能条件付きポータブル選択的通過
Implementation-specificベンダー固有の拡張機能ポータブルでない対象外

Core機能(完全ポータブル):

# このHTTPRouteはどのGateway API実装でも同一に動作する
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: portable-route
spec:
  parentRefs:
    - name: my-gateway
  hostnames:
    - app.example.com
  rules:
    - matches:
        - path:
            type: PathPrefix # Core:パスマッチング
            value: /api
        - headers: # Core:ヘッダーマッチング
            - name: X-Version
              value: v2
      filters:
        - type: RequestHeaderModifier # Core:ヘッダー操作
          requestHeaderModifier:
            add:
              - name: X-Gateway
                value: production
      backendRefs:
        - name: api-service
          port: 8080

Extended機能(ポータブルだが実装の確認が必要):

# Extended機能:ほとんどの実装がサポートするが確認が必要
rules:
  - filters:
      - type: RequestRedirect # Extended:HTTPリダイレクト
        requestRedirect:
          scheme: https
          statusCode: 301
      - type: URLRewrite # Extended:URLリライト
        urlRewrite:
          path:
            type: ReplacePrefixMatch
            replacePrefixMatch: /v2
    backendRefs:
      - name: api-v1
        port: 8080
        weight: 90 # Extended:トラフィックウェイト(カナリー)
      - name: api-v2
        port: 8080
        weight: 10

5.3 Conformance Test:ポータビリティの保証書

Gateway APIのポータビリティは単なる約束ではなく、**Conformance Test(適合性テスト)**という具体的な検証メカニズムで裏付けられている。

各実装はGateway APIプロジェクトが提供する標準化されたテストスイートを通過する必要がある。このテストは実際にGatewayとRouteを作成し、トラフィックを送信して、API仕様と同一に動作するか検証する。

  ┌─────────────────────────────────────────────────────────────┐
Conformance Testプロセス  │                                                             │
1. Gateway APIテストスイート実行                              │
  │     └─> 標準Gateway/HTTPRouteリソースのデプロイ  │                                                             │
2. 実際のトラフィック送信および動作検証                       │
  │     └─> パスマッチング、ヘッダーフィルタリング、リダイレクトなど │
  │                                                             │
3. 結果レポート生成                                         │
  │     └─> Core 100%、Extended featuresリスト                   │
  │                                                             │
4. 公式認証(Conformance Profile)  │     └─> Gateway API公式実装リスト登録                         │
  └─────────────────────────────────────────────────────────────┘

主要実装別Conformance状況:

実装Core適合性Extended機能備考
NGINX Gateway Fabric通過HTTPルーティング、TLS、URLリライト、ウェイトベース分配NGINXデータプレーン
Envoy Gateway通過全Extended機能サポートEnvoy Proxyデータプレーン
GKE Gateway Controller通過GCPネイティブ統合Google Cloud専用
Istio通過サービスメッシュ統合Istioデータプレーン
Contour通過EnvoyベースVMwareサポート
Traefik通過ミドルウェア統合v3+サポート

5.4 実質的ポータビリティシナリオ:マルチクラウドマイグレーション

Conformance Testが保証するポータビリティはマルチクラウド運用で実質的な価値を発揮する:

  ┌──────────────────┐     ┌──────────────────┐
AWS EKS        │     │   Azure AKS  │                  │     │                  │
GatewayClass:   │     │  GatewayClass:  │  aws-gateway     │     │  azure-gateway   │
    (実装変更)  (実装変更)  │                  │     │                  │
Gateway: ───────┼─────┼─ Gateway: ──────┐│
    (最小修正)  (最小修正)      ││
  │                  │     │                  ││
HTTPRoute: ─────┼─────┼─ HTTPRoute: ────┘│
    (同一再利用)  (同一再利用)  └──────────────────┘     └──────────────────┘
           │                        │
           └───────┬────────────────┘
        同一のHTTPRouteマニフェストを
        GatewayClassのみ変更して再利用

既存のIngress方式ではAWS ALB Ingress ControllerからGKE Ingress Controllerへ移動する際に全てのアノテーションを書き直す必要があった。Gateway APIではGatewayClassのみ変更すれば残りのリソース(Gateway、HTTPRoute)はCore/Extended機能の範囲内でそのまま再利用できる。


6. [Takeaway 5] パフォーマンスの飛躍:HTTP/3とQUICの本格導入

6.1 なぜHTTP/3か:TCPの構造的限界

HTTP/2はマルチプレクシングを通じて同一TCP接続で複数のストリームを同時に処理できるようにした。しかしTCPプロトコル自体のHead-of-Line(HOL)Blocking問題を解決できなかった。

  HTTP/2 over TCPのHead-of-Line Blocking問題:

  TCP接続
  ┌─────────────────────────────────────────────────┐
Stream 1: [パケット1][パケット2][  損失  ][パケット4]Stream 2: [パケットA][パケットB]  ← 待機   [パケットD]     │  ← ブロッキング!
Stream 3: [パケットX][パケットY]  ← 待機   [パケットZ]     │  ← ブロッキング!
  └─────────────────────────────────────────────────┘
               パケット3損失時 → 全ストリームが待機

  HTTP/3 over QUICの独立ストリーム:

  QUIC接続
  ┌─────────────────────────────────────────────────┐
Stream 1: [パケット1][パケット2][  損失  ][パケット4]      │  ← このストリームのみ影響
Stream 2: [パケットA][パケットB][パケットC]   [パケットD]      │  ← 正常進行!
Stream 3: [パケットX][パケットY][パケットZ]               │  ← 正常進行!
  └─────────────────────────────────────────────────┘
               パケット3損失時 → Stream 1のみ影響

HTTP/3はTCPの代わりに**QUIC(Quick UDP Internet Connections)**プロトコルを使用する。QUICはUDP上に構築され、各ストリームが独立して配信される。一つのストリームでパケット損失が発生しても他のストリームに影響を与えない。

6.2 HTTP/3のコアパフォーマンス利点

特性HTTP/2 (TCP)HTTP/3 (QUIC)改善効果
トランスポート層TCPUDP + QUICカーネル依存性の低減
接続確立TCP 3-way handshake + TLS handshake (2~3 RTT)QUIC 0-RTT / 1-RTT最大67%レイテンシ低減
HOL BlockingTCPレベルで発生ストリームレベルで隔離並列処理効率の向上
接続マイグレーションIP/ポート変更時に再接続が必要Connection IDベースで維持モバイル環境の安定性
暗号化TLSは選択的TLS 1.3必須(内蔵)デフォルト暗号化保証
パケット損失復旧接続全体に影響個別ストリーム独立復旧損失許容ネットワークの性能向上

6.3 NGINX Gateway FabricでのHTTP/3サポート

NGINXはv1.25.0からQUICとHTTP/3を公式サポートしており、NGINX Gateway Fabricを通じてKubernetes環境でHTTP/3を活用できる。

HTTP/3有効化のためのNginxProxy設定:

apiVersion: gateway.nginx.org/v1alpha1
kind: NginxProxy
metadata:
  name: http3-enabled-proxy
spec:
  config:
    http:
      http3: true
      http3MaxConcurrentStreams: 128
      altSvcHeader: true # Alt-Svcヘッダー自動追加

GatewayでのHTTP/3リスナー構成:

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: http3-gateway
  namespace: gateway-infra
spec:
  gatewayClassName: nginx-gateway-fabric
  listeners:
    # HTTPS (TCP) + HTTP/3 (UDP) 同時リスニング
    - name: https-tcp
      protocol: HTTPS
      port: 443
      tls:
        mode: Terminate
        certificateRefs:
          - name: wildcard-tls-cert
    - name: https-udp
      protocol: HTTPS # HTTP/3はHTTPSプロトコルで宣言
      port: 443 # 同一ポート、UDPでQUIC処理
      tls:
        mode: Terminate
        certificateRefs:
          - name: wildcard-tls-cert

ServiceでのUDPポート公開:

apiVersion: v1
kind: Service
metadata:
  name: nginx-gateway-fabric
  namespace: gateway-infra
spec:
  type: LoadBalancer
  ports:
    - name: https-tcp
      port: 443
      targetPort: 443
      protocol: TCP
    - name: https-udp
      port: 443
      targetPort: 443
      protocol: UDP # QUICのためのUDPポート必須

6.4 HTTP/3導入時の注意事項

HTTP/3導入時に必ず確認すべき技術的要件と注意事項がある:

1) SSLライブラリ要件

QUICプロトコルサポートにはQUIC互換SSLライブラリが必要だ。標準OpenSSLはQUIC APIをサポートしないため(OpenSSL 3.x基準)、以下の代替手段のいずれかを使用する必要がある:

SSLライブラリQUICサポート備考
BoringSSLネイティブサポートGoogle開発、NGINX Gateway Fabricデフォルト使用
LibreSSL3.6.0+サポートOpenBSDプロジェクト
QuicTLSOpenSSL + QUICパッチOpenSSLフォーク、QUIC API追加
OpenSSL未サポート(3.x基準)今後サポート予定

NGINX Gateway FabricはデフォルトでBoringSSLを使用してビルドされるため、別途のSSLライブラリ交換なしにHTTP/3を使用できる。

2) ファイアウォールおよびネットワーク設定

  ┌─────────────────────────────────────────────────────────┐
HTTP/3ネットワーク要件                       │
  │                                                         │
  │  インバウンドルールにUDP 443の追加が必須:                 │
  │                                                         │
  │  既存(HTTP/2のみ):                                    │
  │  ┌──────────────────────────────────────┐               │
  │  │ TCP 80HTTP                     │               │
  │  │ TCP 443HTTPS (TLS over TCP)     │               │
  │  └──────────────────────────────────────┘               │
  │                                                         │
HTTP/3追加後:                                          │
  │  ┌──────────────────────────────────────┐               │
  │  │ TCP 80HTTP                     │               │
  │  │ TCP 443HTTPS (TLS over TCP)     │               │
  │  │ UDP 443QUIC (HTTP/3 over UDP)   │  ← 追加必須   │
  │  └──────────────────────────────────────┘               │
  │                                                         │
  │  注意:多くの企業ファイアウォールとクラウドセキュリティ     │
  │  グループはUDP 443をデフォルトでブロックしている。          │
  └─────────────────────────────────────────────────────────┘
  • クラウドセキュリティグループ:AWS Security Group、Azure NSG、GCP Firewall RulesでUDP 443インバウンドを明示的に許可する必要がある
  • CDN/WAF互換性:一部のCDNやWAFがQUICトラフィックをブロックしたり正しく処理できない場合がある
  • ロードバランサーサポート:クラウドロードバランサーがUDPトラフィックを正しくルーティングするか確認する必要がある。AWS NLB、Azure Load Balancer、GCP Network Load BalancerはUDPをサポートする

3) Alt-Svcヘッダーを通じた段階的移行

HTTP/3の導入は段階的に進めることができる。サーバーはHTTP/2レスポンスにAlt-Svcヘッダーを含めてクライアントにHTTP/3の使用可能を通知する:

Alt-Svc: h3=":443"; ma=86400

クライアント(ブラウザ)はこのヘッダーを受け取った後、次のリクエストからHTTP/3を試みる。失敗時は自動的にHTTP/2にフォールバックする。2025年基準でChrome 87+、Firefox 88+、Safari 14+など全ブラウザの95%以上がHTTP/3をサポートしている。

4) eBPFを活用したQUIC接続マイグレーション

Linux 5.7+カーネルではeBPFを活用したQUICパケットルーティングをサポートする。これによりQUICのConnection Migration機能を活用でき、クライアントのネットワークが変更されても(Wi-FiからLTEへの切り替えなど)接続が維持される。

# nginx.confでeBPFベースのQUICルーティング有効化
quic_bpf on;  # Linux 5.7+ 必須

7. 実戦マイグレーションガイド

7.1 マイグレーション戦略概要

Ingress NGINXからGateway APIへのマイグレーションは一度に完了するBig Bang方式ではなく、**段階的移行(Progressive Migration)**が推奨される。

  ┌──────────────────────────────────────────────────────────────┐
  │              段階的マイグレーション戦略                        │
  │                                                              │
Phase 1: インベントリおよび評価(12週間)                  │
  │  ├─ 全Ingressリソースのリスト化                               │
  │  ├─ 使用中のアノテーション分類                                │
  │  ├─ snippets使用有無の把握(セキュリティリスク優先除去)      │
  │  └─ 依存性マッピング(cert-manager、external-dnsなど)       │
  │                                                              │
Phase 2: Gateway APIインフラ構築(12週間)                 │
  │  ├─ Gateway API CRDインストール                              │
  │  ├─ NGINX Gateway Fabricまたは代替コントローラーデプロイ  │  ├─ GatewayClass、Gatewayリソース作成  │  └─ 非プロダクション環境で検証                                │
  │                                                              │
Phase 3: 段階的ルーティング移行(24週間)                  │
  │  ├─ ingress2gatewayツールで初期変換                           │
  │  ├─ 手動レビューおよびアノテーション → フィルター/ポリシー変換 │
  │  ├─ サービスごとの順次移行(非クリティカル → クリティカル)    │
  │  └─ 並行運用(Ingress + Gateway API)期間                    │
  │                                                              │
Phase 4: 完全移行およびクリーンアップ(12週間)            │
  │  ├─ 全トラフィックがGateway API経由であることの確認            │
  │  ├─ Ingressリソースの除去  │  ├─ ingress-nginxコントローラーの除去                         │
  │  └─ モニタリングおよびアラートの再設定                        │
  └──────────────────────────────────────────────────────────────┘

7.2 Phase 1:インベントリ収集

全Ingressリソースクエリ:

# 全ネームスペースのIngressリソース一覧
kubectl get ingress -A -o wide

# 使用中のアノテーション全抽出
kubectl get ingress -A -o json | \
  jq -r '.items[].metadata.annotations // {} | keys[]' | \
  sort | uniq -c | sort -rn

# snippetsアノテーション使用有無の緊急確認(セキュリティリスク)
kubectl get ingress -A -o json | \
  jq -r '.items[] | select(.metadata.annotations["nginx.ingress.kubernetes.io/configuration-snippet"] != null or .metadata.annotations["nginx.ingress.kubernetes.io/server-snippet"] != null) | .metadata.namespace + "/" + .metadata.name'

# IngressClass確認
kubectl get ingressclass

アノテーション分類チェックリスト:

分類アノテーション例Gateway API代替緊急度
セキュリティリスクconfiguration-snippetserver-snippet除去またはCustom Filter即時
標準代替可能ssl-redirectrewrite-targetRequestRedirectURLRewriteフィルター
Policy代替可能proxy-read-timeoutproxy-body-sizePolicy Attachment
機能別代替canarycanary-weightbackendRefs.weight
実装依存upstream-hash-byaffinity実装別CRD確認

7.3 Phase 2:ingress2gatewayツール活用

ingress2gatewayはKubernetes SIG-Networkが公式提供するマイグレーションツールだ。

インストール:

# Go環境がある場合
go install github.com/kubernetes-sigs/ingress2gateway@latest

# またはGitHub Releasesからバイナリダウンロード
# https://github.com/kubernetes-sigs/ingress2gateway/releases

基本的な使い方:

# クラスターのIngressリソースを自動変換
ingress2gateway print --all-namespaces

# 特定のネームスペースのみ変換
ingress2gateway print --namespace production

# ファイルベースの変換
ingress2gateway print --input-file ingress-resources.yaml

# ingress-nginxプロバイダー指定(アノテーション変換サポート)
ingress2gateway print --providers ingress-nginx --all-namespaces

# 結果をファイルに保存
ingress2gateway print --providers ingress-nginx --all-namespaces > gateway-resources.yaml

変換例:

入力(Ingress):

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-app
  namespace: production
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: 'true'
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  ingressClassName: nginx
  tls:
    - hosts:
        - app.example.com
      secretName: app-tls
  rules:
    - host: app.example.com
      http:
        paths:
          - path: /api(/|$)(.*)
            pathType: ImplementationSpecific
            backend:
              service:
                name: api-service
                port:
                  number: 80

出力(Gateway API):

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: nginx
  namespace: production
spec:
  gatewayClassName: nginx
  listeners:
    - name: app-example-com-https
      hostname: app.example.com
      port: 443
      protocol: HTTPS
      tls:
        certificateRefs:
          - name: app-tls
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: example-app
  namespace: production
spec:
  parentRefs:
    - name: nginx
  hostnames:
    - app.example.com
  rules:
    - matches:
        - path:
            type: PathPrefix
            value: /api
      filters:
        - type: URLRewrite
          urlRewrite:
            path:
              type: ReplacePrefixMatch
              replacePrefixMatch: /
      backendRefs:
        - name: api-service
          port: 80

重要注意事項: ingress2gateway出発点に過ぎず、全てのアノテーションを完全に変換するわけではない。特に実装固有の機能(snippets、カスタムLuaスクリプトなど)は手動で再設計する必要がある。変換結果を必ずレビューし、非プロダクション環境で十分にテストしてから適用すること。

7.4 Phase 3:NGINX Gateway Fabricデプロイ

Helmを使用したインストール:

# Gateway API CRDインストール
kubectl kustomize \
  "https://github.com/kubernetes-sigs/gateway-api/config/crd?ref=v1.2.1" \
  | kubectl apply -f -

# NGINX Gateway Fabricインストール
helm install ngf oci://ghcr.io/nginx/charts/nginx-gateway-fabric \
  --create-namespace \
  --namespace nginx-gateway \
  --set service.type=LoadBalancer

GatewayClass確認:

# インストール後GatewayClass確認
kubectl get gatewayclass
# NAME            CONTROLLER                                    ACCEPTED
# nginx           gateway.nginx.org/nginx-gateway-controller     True

Gateway作成および検証:

# Gatewayリソース適用
kubectl apply -f gateway.yaml

# Gatewayステータス確認
kubectl get gateway -n gateway-infra
# NAME                  CLASS   ADDRESS         PROGRAMMED   AGE
# production-gateway    nginx   203.0.113.10    True         5m

# HTTPRoute適用
kubectl apply -f httproute.yaml

# HTTPRouteステータス確認
kubectl get httproute -n app-team-a
# NAME          HOSTNAMES           AGE
# api-routes    ["api.example.com"] 2m

# 実際のトラフィックテスト
curl -H "Host: api.example.com" https://203.0.113.10/v1/health

7.5 Ingress vs Gateway API機能比較総合表

機能Ingress APIGateway API備考
ホストベースルーティングspec.rules[].hostspec.hostnames同等
パスベースルーティングspec.rules[].http.pathsspec.rules[].matches[].pathGateway APIがより柔軟
TLS終端spec.tlsGateway.listeners[].tls役割分離(Gatewayで管理)
HTTPSリダイレクトアノテーション(ベンダー依存)RequestRedirectフィルター(標準)Gateway API優位
URLリライトアノテーション(ベンダー依存)URLRewriteフィルター(標準)Gateway API優位
カナリーデプロイアノテーション(ベンダー依存)backendRefs.weight(標準)Gateway API優位
ヘッダーマッチング未サポート(アノテーション限定)spec.rules[].matches[].headersGateway API優位
ヘッダー操作アノテーション(ベンダー依存)RequestHeaderModifierフィルターGateway API優位
トラフィックミラーリングアノテーション(ベンダー依存)RequestMirrorフィルター(Extended)Gateway API優位
タイムアウトアノテーション(ベンダー依存)HTTPRoute timeouts(v1.2+)Gateway API優位
リトライアノテーション(ベンダー依存)HTTPRoute retry(v1.2+)Gateway API優位
gRPCルーティング未サポート(アノテーション限定)GRPCRoute(GA)Gateway API優位
TCP/UDPルーティング未サポートTCPRoute、UDPRoute(Experimental)Gateway API優位
役割ベース分離未サポートGatewayClass/Gateway/Route分離Gateway API優位
クロスネームスペース未サポートReferenceGrantGateway API優位
ベンダーポータビリティ低(アノテーション依存)高(Conformance Test)Gateway API優位
バックエンドTLSアノテーション(ベンダー依存)BackendTLSPolicy(v1.4 GA)Gateway API優位
WebSocketアノテーション(ベンダー依存)標準サポート(v1.2+)Gateway API優位

8. 総合マイグレーションチェックリスト

以下はIngress NGINXからGateway APIへの移行のための包括的なチェックリストだ。組織の状況に合わせて活用してほしい。

8.1 評価段階

  • 全クラスターのIngressリソース数とネームスペースマッピング完了
  • 使用中のIngress NGINXアノテーション全数調査完了
  • configuration-snippet / server-snippet使用有無の確認およびセキュリティリスク評価
  • ingress-nginxコントローラーバージョン確認(CVE-2025-1974パッチ適用有無)
  • cert-manager、external-dnsなど連携システム依存性の把握
  • 現在のトラフィックパターンおよびルーティングルールの文書化

8.2 計画段階

  • 対象Gateway API実装の選定(NGINX Gateway Fabric、Envoy Gatewayなど)
  • GatewayClass/Gateway/Route役割分離ポリシーの策定
  • ネームスペース戦略の設計(インフラ用、アプリケーション用)
  • RBACポリシーの設計(インフラチーム vs 開発チームの権限分離)
  • マイグレーション順序の決定(非クリティカルサービス優先)
  • ロールバック計画の策定
  • HTTP/3導入有無の決定

8.3 実行段階

  • Gateway API CRDインストール(gateway.networking.k8s.io
  • Gateway API実装コントローラーのデプロイ
  • GatewayClassリソースの作成およびステータス確認(ACCEPTED: True
  • Gatewayリソースの作成およびIPアドレス割り当て確認(PROGRAMMED: True
  • ingress2gatewayツールで初期変換実行
  • 変換結果の手動レビューおよび不足機能の補完
  • 非プロダクション環境で変換されたHTTPRouteのテスト
  • DNS重み付けベースでトラフィックを段階的に移行
  • プロダクション環境の移行およびモニタリング

8.4 検証段階

  • 全ルーティングパスの正常レスポンス確認
  • TLS証明書の終端および更新の正常動作確認
  • カナリー/重み付けベースデプロイの動作確認
  • ヘッダーベースルーティングの動作確認
  • エラーページおよびデフォルトバックエンドの動作確認
  • モニタリングおよびアラートの正常動作確認
  • 負荷テスト実施およびパフォーマンスベースライン比較

8.5 クリーンアップ段階

  • 既存のIngressリソース除去
  • ingress-nginxコントローラーDeployment/DaemonSet除去
  • ingress-nginx関連ConfigMap、ServiceAccount、RBACリソースのクリーンアップ
  • ingress-nginx Service(LoadBalancer)除去およびIPアドレス回収
  • Helmリリースのクリーンアップ(該当する場合)
  • CI/CDパイプラインでIngress関連マニフェスト除去またはGateway APIへの置換
  • IaC(Terraform、Pulumiなど)でingress-nginxモジュール除去
  • チーム教育および運用ドキュメントの更新

9. 結論:今こそ行動すべき時だ

Ingress NGINXのリタイアは、単に一つのコントローラーが消える出来事ではない。これはKubernetesネットワーキングパラダイム全体の転換点だ。

要約:5つのコア変化と対応方向

#変化コアメッセージ即時アクション
1Ingress NGINX EOL2026年3月以降セキュリティパッチなしマイグレーション計画策定着手
2アノテーション脱却構造的欠陥がセキュリティ脆弱性に直結snippets使用の即時除去
3役割分離GatewayClass/Gateway/Route 3階層モデルRBACポリシーの再設計
4ベンダーポータビリティConformance Testベースの標準化マルチクラウド戦略の再検討
5HTTP/3 & QUICUDPベース次世代プロトコルファイアウォールUDP 443開放検討

今すぐ実行すべき3つのアクション:

1. インベントリ収集(今日)

# 今すぐ実行してください
kubectl get ingress -A -o json | \
  jq -r '[.items[] | {
    namespace: .metadata.namespace,
    name: .metadata.name,
    annotations: (.metadata.annotations // {} | keys | length),
    has_snippets: ((.metadata.annotations // {}) |
      has("nginx.ingress.kubernetes.io/configuration-snippet") or
      has("nginx.ingress.kubernetes.io/server-snippet"))
  }]'

2. ingress2gatewayツール実行(今週中)

go install github.com/kubernetes-sigs/ingress2gateway@latest
ingress2gateway print --providers ingress-nginx -A > gateway-migration.yaml

3. NGINX Gateway Fabricテスト環境構築(今月中)

# 非プロダクションクラスターでテスト
kubectl kustomize \
  "https://github.com/kubernetes-sigs/gateway-api/config/crd?ref=v1.2.1" \
  | kubectl apply -f -

helm install ngf oci://ghcr.io/nginx/charts/nginx-gateway-fabric \
  --create-namespace --namespace nginx-gateway

Kubernetesコミュニティが10年かけて積み上げた経験と教訓がGateway APIという新しい標準に凝縮されている。アノテーションの泥沼から脱出し、型安全なAPIへ、単一リソースの混在から役割ベース分離へ、ベンダーロックインからポータビリティの自由へ進むべき時だ。

2026年3月というデッドラインは脅威ではなく機会だ。 この移行を通じて、より安全で、より柔軟で、より標準化されたネットワーキングインフラを構築できる。今すぐ始めよう。


10. 参考資料

公式ドキュメントおよび発表

NGINX Gateway Fabric

セキュリティおよびCVE

マイグレーションガイド

クラウドベンダー

HTTP/3およびQUIC