
Navigating the ingress-NGINX Retirement: Migration Paths for Production Clusters
Cloud Platform EngineeringSummary
The ingress-nginx community controller reached end-of-life in March 2026. The Kubernetes Ingress API itself remains supported — only this specific controller implementation is retiring. Running ingress-nginx past EOL means operating on unpatched CVEs with no upstream support or feature updates. Migration is not optional.
Pre-requisites
- Inventory all ingress-nginx resources and custom
nginx.ingress.kubernetes.io/*annotations in your cluster - Identify which annotations have no direct equivalent in target controller (these require manual rework)
- Run
kubectl get ingress --all-namespacesto scope the migration surface area - Test both paths in a non-production environment before production rollout
Migration Paths
Path A: Lift-and-Shift to Alternative Ingress Controller
The lower-effort path. Migrate to an actively maintained Ingress controller while keeping your existing Ingress YAML resources.
Recommended controller: Envoy-based alternatives (e.g., Contour)
- Install the target controller in parallel with ingress-nginx
- Audit all
nginx.ingress.kubernetes.io/*annotations — these are controller-specific and will break silently on a different controller - Translate annotations to the target controller’s equivalents using the controller’s migration documentation
- Test routing behavior in staging
- Shift traffic incrementally using canary or blue/green patterns
- Remove ingress-nginx after validation
Trade-off: Keeps the existing Ingress API surface. No Gateway API benefit — you remain on a feature-frozen API specification with no upstream roadmap.
Path B: Gateway API Adoption
The higher-effort path with the strongest long-term position. The Kubernetes Gateway API is the upstream-backed successor to the Ingress API — role-oriented, actively developed, with advanced routing capabilities built into the core spec.
- Install a Gateway API-compatible controller (Envoy Gateway, Istio Gateway, Cilium, others)
- Use the
ingress2gatewayCLI tool to translate existing Ingress resources to Gateway API equivalents:ingress2gateway print --namespace <ns> - Review translated output — complex nginx annotations will require manual Gateway API equivalents (HTTPRoute filters, middleware chains)
- Deploy Gateway API resources alongside existing Ingress resources
- Validate routing parity in staging
- Incrementally shift traffic and remove Ingress resources
Trade-off: Higher migration effort, more objects to manage (GatewayClass, Gateway, HTTPRoute vs. single Ingress). Benefits: active upstream development, role separation between infra operators and application developers, advanced routing without annotations.
The Trap
Don’t assume annotation compatibility. The most common failure mode in ingress-nginx migrations is treating nginx.ingress.kubernetes.io/* annotations as portable. They’re not — they’re implementation details of the nginx controller. Every annotation in production must be audited and mapped to the target controller’s feature set before cutover. Silent routing failures after migration almost always trace back to untranslated annotations.
Cited References
- CNCF: Navigating the ingress-NGINX Retirement
- Kubernetes Gateway API documentation
- ingress2gateway migration tool
Source: CNCF Blog
Content created with AI assistance and reviewed for accuracy.
Join the conversation
Stack Insiders is our free community for readers who want to go deeper — share resources, ask questions, and connect with others across every vertical we cover.
Join Stack Insiders →