Migrating to the Gateway API by reading the live cluster. No documentation existed — so this is it.
Why migrate
Ingress NGINX works, but the Ingress API is a dead end. Gateway API (now GA) is the Kubernetes-native replacement: better traffic splitting, header-based routing, retries, and timeouts — all without annotations. Envoy Gateway implements it cleanly and is what upstream projects are converging on.
The problem: the migration path is barely documented. Most guides show a fresh install. This is about moving a live cluster with existing Ingress resources.
Concept map
| Ingress NGINX | Gateway API (Envoy Gateway) |
|---|---|
| IngressClass | GatewayClass |
| Ingress | HTTPRoute |
| nginx.ingress.kubernetes.io/… annotations | Native fields in HTTPRoute / filters |
| TLS in spec.tls[] | TLS in Gateway listener |
| nginx.conf snippets | EnvoyProxy custom resource |
Step 1 — audit the cluster
Read all existing Ingresses
Every annotation maps to a Gateway API equivalent (or a workaround). You need to know which ones you're actually using before you can plan the migration.
nginx.ingress.kubernetes.io/rewrite-target → HTTPRoute.filters[].urlRewrite · proxy-connect-timeout → HTTPRoute.timeouts.request · ssl-redirect → Gateway listener with HTTPS and a redirect route.Step 2 — install Envoy Gateway
Then create the GatewayClass and a Gateway per environment (or one shared Gateway). The Gateway is where TLS certs and listeners live.
Step 3 — convert Ingresses to HTTPRoutes
Before (Ingress NGINX)
After (HTTPRoute)
Cutover strategy