On June 30, 2026, Gateway API v1.6.0 graduated TCPRoute and UDPRoute to the Standard channel as v1 — and deprecated the v1alpha2 versions every early adopter's manifests still reference. If you installed the experimental CRDs any time in the last two years, the migration is one line per manifest:
# before
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: TCPRoute
# after
apiVersion: gateway.networking.k8s.io/v1
kind: TCPRouteThat verdict rests on three claims: something is already broken today (not just deprecated), removal actually happens to stragglers (there is precedent — it happened to TLSRoute in this same release), and there is a runbook that gets a fleet from the old channel to the new one without a flag day. This post delivers all three, in that order.
The 1.5 vs 1.6 case study: this already happened once
Gateway API ships two CRD bundles: a Standard channel of GA resources and an Experimental channel for incubating ones. Here is what each bundle contained across the last two releases:
| Resource | v1.5 Standard (Feb 2026) | v1.5 Experimental | v1.6 Standard (Jun 2026) | v1.6 Experimental |
|---|---|---|---|---|
| Gateway, HTTPRoute, GRPCRoute, ReferenceGrant, BackendTLSPolicy | Yes | — | Yes | — |
| TLSRoute | New: v1 | v1alpha2 only | v1 | Removed |
| TCPRoute, UDPRoute | No | v1alpha2 | New: v1 | v1alpha2 (deprecated) |
| ListenerSet | New | — | Yes | — |
| XBackend, XMesh | Did not exist | — | — | New: x-k8s.io/v1alpha1 |
Two rows in that table deserve a pause. First, the TLSRoute row is the precedent that makes the TCPRoute row credible: in 1.5, TLSRoute graduated to v1 while its v1alpha2 survived only in the experimental bundle — and in 1.6, the project followed through and deleted TLSRoute v1alpha2 from the experimental bundle entirely. Deprecation-then-removal is not a threat here; it is a demonstrated two-release cadence, and TCPRoute/UDPRoute just entered stage one of it.
Second, a correction worth stating plainly because the early coverage blurred it: nothing about GRPCRoute changes in 1.6. GRPCRoute has been a Standard-channel GA resource since v1.1. If your fleet only ever installed the standard bundle and routes HTTP and gRPC, this release asks nothing of you. The migration debt belongs specifically to fleets that adopted TCPRoute, UDPRoute, or TLSRoute through the experimental channel — which is to say, everyone who needed L4 routing before June.
Already broken today: the standard-channel skew
"Deprecated, removal in a future release" sounds like a problem for later. For one common configuration, it is a problem for now. A 1.6 Standard-channel install serves v1 TCPRoute/UDPRoute only — there is no v1alpha2 in that bundle at all. Anything still watching the old version fails immediately, and at least one major controller does exactly that: the AWS Load Balancer Controller's gateway watches look for TCPRoute under gateway.networking.k8s.io/v1alpha2, get back no matches for kind "TCPRoute" in version "gateway.networking.k8s.io/v1alpha2", and — worse than the error — silently disable the NLBGatewayAPI feature because CRD detection only checks for the old kinds. Your NLB-backed L4 routes stop reconciling with no alarm beyond a controller log line.
The full skew matrix, so you can locate your own fleet:
| Cluster CRDs | Controller watches | Result |
|---|---|---|
1.6 Standard (v1 only) | v1 | Works |
1.6 Standard (v1 only) | v1alpha2 | Broken today — watch fails, features may silently disable |
1.6 Experimental (v1 + deprecated v1alpha2) | either | Works, with deprecation warnings on v1alpha2 |
Pre-1.6 Experimental (v1alpha2 only) | v1 | Broken — nothing serves v1 yet |
The ecosystem is mid-migration and the skew is visible in public: Istio had to patch its traffic-shifting docs to the new apiVersion, Traefik's latest provider targets spec v1.6.1 while its v3.7 line targets v1.5.1, and at least one Rust client library still advertises v1.5.1 support with zero 1.6 tracking. Day-one 1.6 conformance reports exist for Agentgateway, Airlock Microgateway, GKE Gateway, kgateway, NGINX Gateway Fabric, and Traefik — check your controller against that list before you touch your CRDs, because the controller is the long pole, not the manifests.
The x-k8s.io exile: experiments get their own API group
The second half of 1.6 is structural. Until now, experimental resources lived in the same gateway.networking.k8s.io group as stable ones, distinguished only by a v1alpha2-style version string — which is exactly why a graduation looked like a rename inside your own manifests. TCPRoute and UDPRoute are the last resources to graduate under that scheme. Going forward, new experimental APIs live in a separate group, gateway.networking.x-k8s.io, with an X prefix on the kind name — and they graduate by being renamed into the standard group and dropping the prefix, the way XMesh is expected to become Mesh.
The first resident is XBackend (x-k8s.io/v1alpha1, GEP-4894): a Gateway API-native decorator for Service and other backend types, built on the ideas in the upstream EndpointSelector KEP. Its first capability is telling: ExternalHostname destinations — egress to an external host like an AI provider API — which are deliberately ruled out of Service-backed routing because of confused-deputy attacks, and offered here as an explicit opt-in Extended feature. The release notes name cluster-hosted agentic workloads as the motivating egress use case, with session persistence, retries, and TLS origination queued to move into XBackend next. And the warning is in bold in the announcement: experimental means the behavior can change — do not assume production readiness.
The operator policy follows directly: pin experimental CRDs separately from Standard ones, never mix x-k8s.io resources into the same Helm chart or Kustomize base as your v1 routes, and budget for a rename at graduation. The group split is the project telling you, at the API level, which half of your manifests carries a future rename — believe it.
While you are touching manifests: 1.6 tightens validation too
A CRD upgrade that only renamed things would be a quiet week. 1.6 also ships CEL-enforced validation cleanups that reject manifests previous versions accepted, so expect a few stored manifests to fail kubectl apply for reasons unrelated to any rename:
- HTTPRoute retries now require unique
retry.codesandretry.attempts >= 1. - Repeated
CORS-type filters on one route are disallowed, and CORS documentation now keys behavior offallowCredentials. - BackendTLSPolicy can now combine with other route types instead of standing alone.
None of these is load-bearing for the migration, but all of them surface in the same kubectl apply run — grep your route manifests for retry and CORS blocks while you are already editing them.
The migration runbook
Ordered, executable, no flag day required:
- Audit.
grep -rn "gateway.networking.k8s.io/v1alpha2" --include="*.yaml" .across every repo, Helm chart, and Kustomize base that renders Gateway API resources. Count TLSRoute hits separately — those are already past deprecation. - Check the controller first. Confirm your Gateway implementation ships 1.6 support (day-one conformance: Agentgateway, Airlock, GKE Gateway, kgateway, NGINX Gateway Fabric, Traefik). If it only watches
v1alpha2, upgrading cluster CRDs before the controller reproduces the AWS-LB-controller failure above. Controller first, CRDs second. - Upgrade CRDs to 1.6. Install the bundle you intend to live on. Prefer Standard if nothing you run still needs experimental-only resources; otherwise Experimental, which serves both
v1and deprecatedv1alpha2during the transition. - Convert manifests. For basic TCPRoute/UDPRoute shapes this is the one-line
apiVersionbump from the top of this post — same fields, same semantics. Verify any extended fields (timeout filter values, BackendTLSPolicy attachments) against thev1godoc rather than assuming parity. - Canary one listener. Gateways need a TCP/UDP listener with
allowedRoutespermitting the route kind; convert one route, confirm its status conditions goAccepted: True/Programmed: True, and watch traffic before converting the rest. - Delete every
v1alpha2reference. TLSRoute's arc in this release is the schedule: deprecated-in-experimental one release, removed the next. Leave nov1alpha2string behind for the removal release to find.
Verify after: every converted route shows Accepted and Programmed true, controller logs show no no matches for kind errors, and a repeat of the step-1 grep returns empty.
The falsifiable version of this post's claim: if a future 1.7 or 1.8 release removes TCPRoute/UDPRoute v1alpha2 the way 1.6 removed TLSRoute's, fleets that ran this runbook change nothing and fleets that did not get a fleet-wide apply failure. That is what "on death row" means — the sentence is passed, only the date is pending.
Bex.co is the open-source, AI-native Render alternative — push a git repo, get a running HTTPS service on machines you own. Star the repo on GitHub or deploy your first app today.
Sources
- Kubernetes Blog, "Gateway API v1.6: TCPRoute and UDPRoute Graduate to Standard" (Aug 3, 2026, Modebadze/Katz): v1.6.0 released June 30 2026,
v1graduation,v1alpha2deprecation and future removal, x-k8s.io group split, XBackend egress/CEL notes, day-one conformance list. - kubernetes-sigs/gateway-api v1.6.0 release notes: TCPRoute GA (#4920), UDPRoute GA (#4923), HTTPRoute retry validation (#4907), BackendTLSPolicy union (#4745), CORS cleanups (#4639, #4663), ListenerSet conformance.
- kubernetes-sigs/gateway-api releases page: v1.5 TLSRoute/ListenerSet Standard graduation, TLSRoute
v1alpha2confined to experimental in 1.5 and removed in 1.6; TLSRoute CEL requires Kubernetes 1.31+. - kubernetes-sigs/aws-load-balancer-controller issue #4829:
v1alpha2TCPRoute watch failure on 1.6 standard clusters, silentNLBGatewayAPIdisable. - Istio istio.io PR #17471: TCPRoute
apiVersionfix for Gateway API v1.6.0 docs. - Traefik docs: provider support for spec v1.5.1 (v3.7.0) through v1.6.1 (latest); experimental-channel TCPRoute note.
- DEV/dev.to, "Gateway API v1.6 promotes TCPRoute and UDPRoute to Standard" (Aug 2026): v1alpha2 deprecation countdown framing.
- Gateway API standard-install vs experimental-install channel contents (pre-1.6: GatewayClass/Gateway/HTTPRoute/GRPCRoute/ReferenceGrant/BackendTLSPolicy standard; TCPRoute/TLSRoute/UDPRoute experimental).



