
Introduction: A Story About Technical Debt Coming Due
Table of Contents
The migration from k8s ingress api gateway wasn’t on my roadmap until a Monday morning in October 2025, when a Slack message from our platform lead popped up:
We have a problem. Ingress NGINX is officially retiring. No more security patches after March 2026.
I’d seen deprecations before, but this one hit harder. Our entire edge-routing stack every path rewrite, every websocket, every TLS rule ran through Ingress NGINX. It had been the backbone of every cluster we’d deployed for years.
But the announcement wasn’t surprising. The maintainers were burned out. Vulnerabilities kept resurfacing. Snippet injections became a security liability. Kubernetes was moving forward, and Ingress was part of the past.
That morning turned into a migration roadmap that touched every team, every workload, and every deployment pipeline.
This guide is that roadmap, refined and structured so you can apply it long before the 2026 deadline becomes an emergency.
Why the Migration from K8s Ingress API Gateway Can’t Be Delayed
Kubernetes officially announced that Ingress NGINX will retire in March 2026 due to:
- Maintainer burnout
- Persistent security issues
- Architectural limitations
- Fragmentation caused by custom annotations
- Long-standing technical debt
Without security patches after 2026, continuing to run Ingress NGINX means accepting increasing risk exposure something no platform team can ignore.
If your organization is still running Ingress NGINX, this is the moment to start the migration, not the moment to “wait and see.”
What Forced This Migration from K8s Ingress API Gateway
Here’s what got us here:
1. Security liabilities
Custom NGINX directives, snippet injection capabilities, and the annotation-driven model turned into a security minefield.
2. Feature fragmentation
Every provider implemented annotations differently, creating configuration drift and upgrade pain.
3. Rising maintenance cost
Ingress NGINX grew faster than it could be maintained. Upgrades came with regressions. Features stalled.
4. Ecosystem shift
Kubernetes now treats the Gateway API as the long-term traffic management standard.
Choosing the Right Successor to Ingress NGINX
When performing your migration from k8s ingress api gateway, you have several successor options:
1. Gateway API (Recommended)
Gateway API is the official successor to Ingress:
- Clean separation of concerns
- Predictable spec
- Better role delegation
- First-class multi-cluster support
2. Modern Ingress Controllers (Interim Option)
If you need time before embracing Gateway API, consider:
These controllers support both legacy Ingress objects and new Gateway API resources.
Planning Your Migration from K8s Ingress API Gateway
Before writing a single line of YAML:
1. Audit current Ingress usage
Identify all Ingress resources and every annotation you rely on.
2. Build a compatibility matrix
Map annotation-based features to Gateway API equivalents.
3. Stand up a parallel gateway
Do not replace the old controller in place.
4. Start with low-risk services
Migrate internal or low-traffic routes first.
5. Prepare a rollback strategy
Always plan for failure transitions.
The 7-Step Migration Process
Below is the real-world process we followed to complete the migration from k8s ingress api gateway across multiple clusters:
Step 1 – Deploy the new Gateway Controller
Install it side by side with your existing Ingress NGINX.
Step 2 – Create a shadow Gateway
Clone traffic or mirror requests to validate routing behavior.
Step 3 – Convert Ingress resources to HTTPRoute
Translate each annotation and rule to Gateway API equivalents.
Step 4 – Validate feature parity
Things to check:
- TLS termination
- Redirect logic
- Rewrite behavior
- Header management
- Rate limiting
- mTLS or IP whitelisting
Step 5 – Canary the migration
Shift traffic gradually: 10% → 25% → 50% → 100%.
Step 6 – Decommission Ingress NGINX
Only after all services are fully migrated.
Step 7 – Cleanup, document, educate
Update internal docs, remove deprecated configs, and train engineers.
Example Configurations
Before (Ingress NGINX)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- host: myapp.example.com
http:
paths:
- path: /api/(.*)
pathType: Prefix
backend:
service:
name: myapp-svc
port:
number: 80
After (Gateway API)
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: myapp-route
spec:
parentRefs:
- name: prod-gateway
hostnames:
- "myapp.example.com"
rules:
- matches:
- path:
type: PathPrefix
value: "/api/"
backendRefs:
- name: myapp-svc
port: 80
Common Pitfalls
- Believing Gateway API is a drop-in replacement (it’s not).
- Forgetting to validate TLS behavior early.
- Underestimating annotation rewrites.
- Migrating too many services at once.
- Waiting until 2026 when every team will be scrambling.
Summary
The migration from k8s ingress api gateway isn’t just a Kubernetes housekeeping task it’s a strategic move toward security, stability, and maintainability. With Ingress NGINX retiring in March 2026, every organization needs a plan, a timeline, and a phased migration approach.
Start with an audit. Stand up a parallel Gateway. Migrate in waves. Validate everything.
And most importantly:
Don’t wait until the retirement date becomes an outage.
For more articles on topics check out Let’s Talk About DevOps.