Ingress-NGINX is retired. Compare Traefik and Gateway API controllers as replacements, plus a safe migration plan that avoids outages.
A platform team audits its dependencies and finds that the component routing every external request into every cluster is no longer maintained. No new releases, no security fixes, no one to report a CVE to. That is the situation for any team still running the community ingress-nginx controller after its retirement in March 2026.
This is really two decisions bundled into one deadline: which controller do you move to, and do you move to a new API model (Gateway API) at the same time? This post helps you answer both, then gives you a migration plan that avoids an outage.
Three similarly named things exist, and only one of them was retired. The retired one is the community project kubernetes/ingress-nginx. F5's NGINX Ingress Controller is a different, maintained project, and the Ingress API itself is still supported.
| Name | Maintainer | Status |
|---|---|---|
| kubernetes/ingress-nginx | Kubernetes community | Retired |
| nginxinc/kubernetes-ingress | F5 NGINX | Maintained |
| Ingress API | Kubernetes | Frozen, not removed |
Confirm what you run before you plan anything:
kubectl get pods -A \ -l app.kubernetes.io/name=ingress-nginxkubectl get ingressclassIf the first command returns pods, you are on the retired community controller. A chart or image named ingress-nginx almost always means the same.
It was retired because maintaining it safely was no longer sustainable. The Kubernetes Steering and Security Response Committees cited a shortage of maintainers and architectural limits as the reasons, and they warned that running it after end of life leaves you exposed to attack.
Its flexibility was also its weakness. The annotation model allowed raw NGINX configuration to be injected through Kubernetes objects, and that produced a long list of injection-style vulnerabilities. In March 2025, the IngressNightmare set of issues (including CVE-2025-1974) showed how serious that attack surface could be.
Any controller that is no longer patched becomes a permanent risk at the edge of your network, which is why this is a security migration first and a feature migration second. Check the official announcement for the current status and timeline.
You have four realistic paths: another Ingress controller, a Gateway API controller, a cloud provider's managed option, or a vendor-supported bridge. The right one depends on your deadline and your appetite for change.
Gateway and HTTPRoute resources from day one. It is a bigger change, but you only migrate once.Inventory your annotations first, because they are where migrations break. Every nginx.ingress.kubernetes.io/ annotation is behavior you must reproduce in the new controller.
kubectl get ingress -A -o json \ | jq -r '.items[].metadata.annotations // {} | keys[]' \ | grep nginx.ingress | sort | uniq -c | sort -rnThe most-used annotations are usually rewrites, redirects, body size limits, timeouts and IP allow lists. Any configuration-snippet or server-snippet is a red flag, since raw NGINX config has no portable equivalent.
Gateway API splits what Ingress mixed together. A platform team owns the Gateway (listeners, TLS, addresses), and application teams own HTTPRoute resources that attach to it. Here is a minimal pair:
apiVersion: gateway.networking.k8s.io/v1kind: Gatewaymetadata: name: public namespace: gateway-systemspec: gatewayClassName: example-class listeners: - name: https port: 443 protocol: HTTPS tls: mode: Terminate certificateRefs: - name: wildcard-example-net allowedRoutes: namespaces: from: All---apiVersion: gateway.networking.k8s.io/v1kind: HTTPRoutemetadata: name: payment namespace: paymentsspec: parentRefs: - name: public namespace: gateway-system hostnames: ["pay.example.net"] rules: - matches: - path: type: PathPrefix value: / backendRefs: - name: payment-api port: 8080The gatewayClassName depends on your implementation. In production, restrict allowedRoutes to labeled namespaces instead of All.
Common annotations map to standard route features, but some need implementation-specific policy:
| ingress-nginx annotation | Gateway API equivalent |
|---|---|
ssl-redirect |
RequestRedirect filter |
rewrite-target |
URLRewrite filter |
proxy-body-size, timeouts |
Implementation policy |
configuration-snippet |
No equivalent |
The ingress2gateway tool from Kubernetes SIGs can convert many Ingress resources automatically. Treat its output as a first draft and review it by hand.
Run the new controller beside the old one, test with real traffic, then shift traffic gradually. Never replace the controller in place.
Follow these steps:
Host header.Choosing a controller type:
| Factor | Traefik (Ingress mode) | Gateway API native |
|---|---|---|
| Migration effort | Lower | Higher |
| Resource model | Existing Ingress | Gateway and HTTPRoute |
| Best fit | Tight deadline | Planned standardization |
Operational shape:
| Factor | Traefik | Istio or Cilium |
|---|---|---|
| Scope | Edge proxy | Edge plus mesh |
| Added complexity | Low | Higher |
| Future path | Gateway API supported | Gateway API first |
Route propagation speed differs across implementations, but published numbers depend heavily on test setup. Benchmark with your own route counts and deploy frequency if this matters to you.
If you are still on the retired controller, treat it as a security task with a clock on it. The unpatched software is already live at your edge.
References and Further Reading
- Ingress NGINX Statement from Kubernetes Committees - Official retirement announcement
- Gateway API Documentation - Resources, implementations and guides
- ingress2gateway - Conversion tool for Ingress resources
- Traefik Documentation - Ingress and Gateway API providers
No. The retired project is the community kubernetes/ingress-nginx, governed by Kubernetes SIG Network. F5's nginxinc/kubernetes-ingress is a separate codebase with a similar name. Check your Helm chart and image names, because the naming overlap causes frequent mix-ups.
No. The Ingress resource is not being removed, but it is feature-frozen and gets no new capabilities. Active development has moved to Gateway API, which is why newer controllers invest there.
No. Annotation behavior, TLS defaults, rewrite rules and rate limiting differ between controllers, and configuration-snippet style annotations have no direct equivalent. Treat the move as a migration with testing, not a Helm chart swap.
Its annotation model let users inject raw NGINX configuration, which led to a long history of injection-style vulnerabilities, including the critical IngressNightmare issues disclosed in March 2025. The project also lacked enough maintainers to keep up with that attack surface.
Move straight to Gateway API if you already planned to standardize on it or adopt a mesh, because it avoids a second migration. If you have limited time, a controller that supports your existing Ingress resources, such as Traefik, is the lower-risk first step.
Discussion0