- Authors
- Name
- 1. 序論:あなたのクラスターが危険にさらされている
- 2. [Takeaway 1] 時限爆弾のカウントダウン:Ingress NGINXの公式リタイア
- 3. [Takeaway 2] アノテーション(Annotation)の泥沼からの脱出
- 4. [Takeaway 3] 役割の分離:インフラ管理者と開発者の平和的共存
- 5. [Takeaway 4] ベンダーロックインを打ち破るポータビリティの実現
- 6. [Takeaway 5] パフォーマンスの飛躍:HTTP/3とQUICの本格導入
- 7. 実戦マイグレーションガイド
- 8. 総合マイグレーションチェックリスト
- 9. 結論:今こそ行動すべき時だ
- 10. 参考資料
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つのコア視点から分析する:
- 時限爆弾のカウントダウン -- Ingress NGINXの公式リタイアとその余波
- アノテーションの泥沼からの脱出 -- 構造的欠陥とGateway APIの解決策
- 役割の分離 -- インフラ管理者と開発者の平和的共存
- ベンダーロックインからの脱却 -- ポータビリティの実現
- パフォーマンスの飛躍 -- HTTP/3とQUICの本格導入
┌─────────────────────────────────────────────────────────────────┐
│ 2026年Kubernetesネットワーキング移行ロードマップ │
├──────────┬──────────┬──────────┬──────────┬──────────┬──────────┤
│ 2025.03 │ 2025.11 │ 2026.03 │ 2026.06 │ 2026.11 │ 2027+ │
│ │ │ │ │ │ │
│ Ingress │ リタイア │ ■ EOL ■ │ Gateway │ AKS/GKE │ Ingress │
│ Nightmare│ 公式 │ セキュリ │ API v1.5 │ 延長サポ │ API │
│ CVE 発生 │ 発表 │ ティパッ │ (予想) │ ート終了 │ 残存 │
│ │ │ チ完全終 │ │ │ 可能性↓ │
│ GW API │ GW 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 ID | CVSS | 説明 |
|---|---|---|
| CVE-2025-24514 | 8.8 | auth-urlアノテーションを通じた設定注入 |
| CVE-2025-1097 | 8.8 | auth-tls-match-cnアノテーションを通じた設定注入 |
| CVE-2025-1098 | 8.8 | mirror-target/mirror-hostアノテーションを通じた設定注入 |
| CVE-2025-24513 | 4.8 | auth-urlファイルパス検証の欠如 |
| CVE-2025-1974 | 9.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-snippetとnginx.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-snippetがserverブロックにそのまま挿入されるためだ。
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 (プラットフォーム/インフラエンジニア) │
│ 役割: リスナー、TLS、IPアドレス、ポート、許可ネームスペース設定 │
│ 例: 443ポートHTTPSリスナー、ワイルドカード証明書 │
│ RBAC: namespace-adminレベル(インフラネームスペース) │
├─────────────────────────────────────────────────────────────┤
│ Layer 3: HTTPRoute / GRPCRoute / TCPRoute │
│ ─────────────────────────────────────────── │
│ 担当: Application Developer (サービス開発者) │
│ 役割: ルーティングルール、バックエンドサービスマッピング、トラフィックウェイト │
│ 例: /api → api-service、カナリー20% │
│ RBAC: namespace-editorレベル(アプリケーションネームスペース) │
└─────────────────────────────────────────────────────────────┘
役割別責任マトリクス:
| 役割 | リソース | 責任範囲 | RBAC例 |
|---|---|---|---|
| Infrastructure Provider | GatewayClass | データプレーン実装体の登録、パラメータ定義 | ClusterRole: gatewayclass-admin |
| Cluster Operator | Gateway, ReferenceGrant | リスナー設定、TLS証明書管理、ネームスペースアクセス制御 | Role: gateway-admin (infra-ns) |
| Application Developer | HTTPRoute, 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) | 改善効果 |
|---|---|---|---|
| トランスポート層 | TCP | UDP + QUIC | カーネル依存性の低減 |
| 接続確立 | TCP 3-way handshake + TLS handshake (2~3 RTT) | QUIC 0-RTT / 1-RTT | 最大67%レイテンシ低減 |
| HOL Blocking | TCPレベルで発生 | ストリームレベルで隔離 | 並列処理効率の向上 |
| 接続マイグレーション | 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デフォルト使用 |
| LibreSSL | 3.6.0+サポート | OpenBSDプロジェクト |
| QuicTLS | OpenSSL + QUICパッチ | OpenSSLフォーク、QUIC API追加 |
| OpenSSL | 未サポート(3.x基準) | 今後サポート予定 |
NGINX Gateway FabricはデフォルトでBoringSSLを使用してビルドされるため、別途のSSLライブラリ交換なしにHTTP/3を使用できる。
2) ファイアウォールおよびネットワーク設定
┌─────────────────────────────────────────────────────────┐
│ HTTP/3ネットワーク要件 │
│ │
│ インバウンドルールにUDP 443の追加が必須: │
│ │
│ 既存(HTTP/2のみ): │
│ ┌──────────────────────────────────────┐ │
│ │ TCP 80 ← HTTP │ │
│ │ TCP 443 ← HTTPS (TLS over TCP) │ │
│ └──────────────────────────────────────┘ │
│ │
│ HTTP/3追加後: │
│ ┌──────────────────────────────────────┐ │
│ │ TCP 80 ← HTTP │ │
│ │ TCP 443 ← HTTPS (TLS over TCP) │ │
│ │ UDP 443 ← QUIC (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: インベントリおよび評価(1~2週間) │
│ ├─ 全Ingressリソースのリスト化 │
│ ├─ 使用中のアノテーション分類 │
│ ├─ snippets使用有無の把握(セキュリティリスク優先除去) │
│ └─ 依存性マッピング(cert-manager、external-dnsなど) │
│ │
│ Phase 2: Gateway APIインフラ構築(1~2週間) │
│ ├─ Gateway API CRDインストール │
│ ├─ NGINX Gateway Fabricまたは代替コントローラーデプロイ │
│ ├─ GatewayClass、Gatewayリソース作成 │
│ └─ 非プロダクション環境で検証 │
│ │
│ Phase 3: 段階的ルーティング移行(2~4週間) │
│ ├─ ingress2gatewayツールで初期変換 │
│ ├─ 手動レビューおよびアノテーション → フィルター/ポリシー変換 │
│ ├─ サービスごとの順次移行(非クリティカル → クリティカル) │
│ └─ 並行運用(Ingress + Gateway API)期間 │
│ │
│ Phase 4: 完全移行およびクリーンアップ(1~2週間) │
│ ├─ 全トラフィックが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-snippet、server-snippet | 除去またはCustom Filter | 即時 |
| 標準代替可能 | ssl-redirect、rewrite-target | RequestRedirect、URLRewriteフィルター | 高 |
| Policy代替可能 | proxy-read-timeout、proxy-body-size | Policy Attachment | 中 |
| 機能別代替 | canary、canary-weight | backendRefs.weight | 中 |
| 実装依存 | upstream-hash-by、affinity | 実装別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 API | Gateway API | 備考 |
|---|---|---|---|
| ホストベースルーティング | spec.rules[].host | spec.hostnames | 同等 |
| パスベースルーティング | spec.rules[].http.paths | spec.rules[].matches[].path | Gateway APIがより柔軟 |
| TLS終端 | spec.tls | Gateway.listeners[].tls | 役割分離(Gatewayで管理) |
| HTTPSリダイレクト | アノテーション(ベンダー依存) | RequestRedirectフィルター(標準) | Gateway API優位 |
| URLリライト | アノテーション(ベンダー依存) | URLRewriteフィルター(標準) | Gateway API優位 |
| カナリーデプロイ | アノテーション(ベンダー依存) | backendRefs.weight(標準) | Gateway API優位 |
| ヘッダーマッチング | 未サポート(アノテーション限定) | spec.rules[].matches[].headers | Gateway 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優位 |
| クロスネームスペース | 未サポート | ReferenceGrant | Gateway 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つのコア変化と対応方向
| # | 変化 | コアメッセージ | 即時アクション |
|---|---|---|---|
| 1 | Ingress NGINX EOL | 2026年3月以降セキュリティパッチなし | マイグレーション計画策定着手 |
| 2 | アノテーション脱却 | 構造的欠陥がセキュリティ脆弱性に直結 | snippets使用の即時除去 |
| 3 | 役割分離 | GatewayClass/Gateway/Route 3階層モデル | RBACポリシーの再設計 |
| 4 | ベンダーポータビリティ | Conformance Testベースの標準化 | マルチクラウド戦略の再検討 |
| 5 | HTTP/3 & QUIC | UDPベース次世代プロトコル | ファイアウォール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. 参考資料
公式ドキュメントおよび発表
- Ingress NGINX Retirement: What You Need to Know | Kubernetes Blog
- Gateway API v1.2: WebSockets, Timeouts, Retries, and More | Kubernetes Blog
- Gateway API v1.4: New Features | Kubernetes Blog
- Gateway API Official Documentation
- Gateway API Conformance
- Ingress-nginx CVE-2025-1974: What You Need to Know | Kubernetes Blog
NGINX Gateway Fabric
- F5 NGINX Gateway Fabric Documentation
- NGINX Gateway Fabric GitHub
- What's New in F5 NGINX Gateway Fabric 2.3.0
- Gateway Architecture | NGINX Documentation
- Gateway API Compatibility | NGINX Documentation
セキュリティおよびCVE
- IngressNightmare: CVE-2025-1974 | Wiz Blog
- Detecting and Mitigating IngressNightmare | Sysdig
- IngressNightmare CVE-2025-1974 | FortiGuard Labs
マイグレーションガイド
- Migrating from Ingress | Gateway API Documentation
- Migrating from Ingress-NGINX | Gateway API Documentation
- ingress2gateway GitHub
- Introducing ingress2gateway | Kubernetes Blog
クラウドベンダー
- AKS Application Routing Add-on Ingress-NGINX Update | AKS Engineering Blog
- The End of an Era: Transitioning Away from Ingress NGINX | Google Open Source Blog