Kubernetes Ingress → Gateway API Migration (Production Playbook)

2026-03-24 · software

Kubernetes Ingress → Gateway API Migration (Production Playbook)

Date: 2026-03-24
Category: knowledge
Scope: Practical migration pattern for teams moving from Ingress to Gateway API with minimal outage risk and predictable rollback.


1) Why migrate now

Kubernetes documents Ingress as stable but frozen and recommends Gateway API for new work. In practice, this means:

Gateway API gives three big operational wins:

  1. Role separation (infra/operator/app responsibilities are explicit).
  2. Portable features (less provider annotation lock-in).
  3. Richer routing model (header matching, weighting, mirrors, policy attachment patterns).

2) The model shift (mental rewrite from Ingress)

Think in layers:

This is the key migration mindset:


3) Pre-migration checks (don’t skip)

3.1 Controller conformance reality check

Before any manifest conversion, verify your chosen controller’s supported features/profile. Gateway API has:

If your current Ingress depends on controller annotations, map each one to:

3.2 CRD/channel strategy

Use Standard channel CRDs for production default unless you explicitly need experimental features. Read release notes before bumping and avoid downgrading CRDs.

3.3 Inventory risky Ingress patterns

Flag these early:


4) Safe migration plan (waves)

Wave A — Install and prove control plane

  1. Install Gateway API CRDs and controller.
  2. Create GatewayClass + baseline Gateway listeners.
  3. Confirm status conditions become Accepted/Programmed (controller-specific wording may vary).

No production traffic shift yet.

Wave B — Shadow convert manifests

Use ingress2gateway as a starting point, not final truth:

Wave C — Canary host/path cutover

Wave D — Bulk migration by risk tier

Order recommendation:

  1. stateless internal tools,
  2. low-revenue external endpoints,
  3. critical public APIs,
  4. last: weird legacy routes with annotation debt.

Wave E — Decommission Ingress objects

Only after steady-state burn-in (e.g., 7+ days, incident-free), delete retired Ingress resources and legacy annotation policies.


5) High-impact pitfalls and fixes

5.1 Cross-namespace references break unexpectedly

Gateway API requires explicit trust for cross-namespace references via ReferenceGrant in the target namespace (for example cert Secret refs or backend refs). Without this, references stay unresolved.

5.2 “It applied” does not mean “it routes”

Always check status conditions (ResolvedRefs, Accepted, implementation conditions). A syntactically valid object can still be non-functional due to unsupported kinds/features.

5.3 TLS assumptions from Ingress carry over incorrectly

Gateway API separates:

Treat terminate/re-encrypt explicitly; do not assume old controller defaults still apply.

5.4 Multi-team RBAC not redesigned

If you keep broad write access to Gateway objects, you lose much of the role-oriented safety model. Split ownership:

5.5 Experimental creep in production

Experimental channel fields can change incompatibly in minor updates. If you must use them, isolate by environment and document upgrade runbooks.


6) Minimal conversion example

Ingress-era intent:

Gateway API shape:

  1. Gateway listener on HTTPS:443 with hostname: api.example.com and certificateRefs.
  2. HTTPRoute with rules matching /v1 and /v2, each backendRef to respective Service.

The important operational difference: listener infra and route logic are independently governable.


7) Observability acceptance checklist

Before declaring migration complete:


8) Opinionated defaults


9) Bottom line

Gateway API migration is easiest when treated as a governance + operability upgrade, not a YAML syntax rewrite.

If you only auto-convert manifests, you’ll keep legacy coupling. If you redesign ownership boundaries and reference safety (ReferenceGrant, RBAC, status checks), you get the real payoff: cleaner multi-team traffic ops with fewer controller-specific surprises.


References