When Network APIs Graduate, Your Platform Contract Changes
Gateway API v1.6.0 promoted TCPRoute and UDPRoute from v1alpha2 to v1 and deprecated the alpha versions in the same release. The graduation is the easy part. The contract you owe application teams is what actually changes.
Antonio J. del Águila
Knaisoma
Gateway API v1.6.0 shipped on June 30, and the Kubernetes SIG Network community wrote it up on August 3. Two things happened in that release, and most of the attention has gone to the first.
The headline is that TCPRoute and UDPRoute graduated to Standard, moving from v1alpha2 to v1 under GEP-2644 and GEP-2645, led by Nick Young, Ricardo Katz and Zac Nixon. Raw layer 4 routing is now GA in the same API version that has carried HTTP and TLS for several releases. Workloads speaking raw protocols, databases, DNS, VoIP, gaming backends and IoT telemetry, get a stable routing model for the first time.
The second change is quieter and will generate more tickets. Experimental resources moved to a separate API group, gateway.networking.x-k8s.io, carrying an X prefix, so the boundary between experimental and standard lives in the resource name rather than in documentation somebody has to remember.
Both changes are good. Both also move work onto platform teams that the release notes do not describe, because that work is local to your cluster and to your contract with the teams using it.
The deprecation is the actual deadline
Read past the graduation and you find the operational line: v1alpha2 TCPRoute and UDPRoute are deprecated as of v1.6, with removal in a future release.
That is the sentence that belongs in your planning document. A graduation is an invitation you can accept whenever you like. A deprecation with an unscheduled removal is a clock you do not control, and the gap between the two is where migrations get postponed until they become incidents.
The change itself is small. A manifest moves from gateway.networking.k8s.io/v1alpha2 to gateway.networking.k8s.io/v1:
apiVersion: gateway.networking.k8s.io/v1
kind: TCPRoute
metadata:
name: tcp-app
spec:
parentRefs:
- name: example-gateway
sectionName: foo
rules:
- backendRefs:
- name: my-foo-service
port: 6000
The listener it attaches to is equally unremarkable:
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: example-gateway
spec:
gatewayClassName: example-gateway-class
listeners:
- name: foo
protocol: TCP
port: 12345
allowedRoutes:
kinds:
- kind: TCPRoute
A one-line API version bump is not the risk. The risk is that nobody owns the inventory of which manifests still carry v1alpha2, which of them live in repositories the platform team cannot see, and which belong to a service whose owner moved on eighteen months ago. That inventory is a platform responsibility whether or not anyone has claimed it.
Graduation is a contract signal, not a green light
A standard API creates an expectation of shared meaning. That is genuinely valuable: teams express a networking requirement in a vocabulary not tied to one vendor or one locally invented custom resource, and platform documentation stops rotting every time an implementation changes.
It also creates an obligation. To an application team, a TCPRoute looks like a simple declaration: send this traffic to that service on port 6000. To a platform team, the same object touches admission, reconciliation, status reporting, observability, policy boundaries, ownership and recovery. The abstraction hides that complexity from the requester. It does not remove it, it relocates it to you.
So v1 should not be read as safe to use without review. It means the vocabulary is stable enough for broad adoption. Whether your controller, data plane and policy layer implement that vocabulary correctly is a separate question only your environment can answer.
The X prefix makes an old problem visible
The experimental group separation is the more interesting change for anyone who has been running Gateway API for a while.
Before v1.6, an experimental resource and a standard one looked alike in a manifest. The distinction lived in a compatibility table, which is a documentation-shaped answer to a runtime-shaped problem. It fails in the predictable way: somebody copies a working manifest out of a blog post into a production repository, and nobody notices which stability tier it came from.
Moving experimental resources to gateway.networking.x-k8s.io puts the tier in the resource identity. A reviewer scanning a pull request sees x-k8s.io and knows what they are looking at without consulting anything.
That pattern is worth copying well beyond Gateway API. If your platform exposes both supported and provisional interfaces and the difference is recorded only on a wiki page, the difference does not really exist. Encode it where it cannot be skipped.
The trade off you actually have to make
The strongest argument for adopting a standard routing API is portability of intent. The counter-pressure is that a portable model rarely expresses everything a specific implementation can do.
That produces two failure modes worth naming, because both are common and neither announces itself.
The first is false portability. A team assumes a manifest that works in one cluster behaves identically in another. The object is accepted in both, because the schema is the same. The behavior differs, because the controller, policy layer or data plane differ, and that difference surfaces during an incident rather than during review.
The second is accidental fragmentation. A platform adopts the standard API, then accumulates undocumented local conventions: a required annotation, an internal admission rule, a naming pattern, until consumers again need local knowledge to succeed. The manifests look portable. The operating knowledge is not.
The useful response is neither to reject standardization nor to pretend local differences do not exist. Separate the layers explicitly. Document the portable contract first, record implementation-specific behavior alongside it, and when a local extension is genuinely necessary, label it as an extension rather than letting it pass as part of the common API.
Ownership is the failure mode nobody schedules
A route declaration makes a request look simple, and simple requests are where ownership quietly evaporates.
Who may create a TCPRoute? Which backends may it target? What happens when the backend is unavailable? How does the platform tell the requester their route was accepted, rejected or only partially realized? Who gets paged when traffic does not arrive?
These are not implementation details, they are the contract. A platform that exposes a networking abstraction without answering them has shipped a convenient syntax rather than a dependable service.
The failure mode is an ownership vacuum, and it is symmetrical. Application teams believe the platform owns the route because the platform provides the API. Platform engineers believe the application team owns it because they submitted the manifest. Both positions are reasonable. Neither is written down. During an incident both discover that nobody owns the path from declaration to delivered traffic, at the worst possible moment.
A contract that works names this in advance. The application team owns declared intent and the service behind it. The platform team owns the supported implementation, policy enforcement, status semantics and the operational path when the platform itself fails. Anything genuinely shared, incident diagnosis most of all, needs a documented handoff rather than an assumption of goodwill.
Layer 4 breaks assumptions layer 7 let you keep
The graduation of TCPRoute and UDPRoute is a useful forcing function precisely because raw protocols do not carry the same operational assumptions as HTTP.
A platform comfortable with HTTP has years of habits built on request paths, status codes, headers and retries. Almost none of it transfers. A UDP flow to a DNS service or an IoT telemetry endpoint has no status code to alert on, no path to route by and no natural request boundary to trace. Your dashboards, runbooks and troubleshooting instincts were shaped by a protocol you are no longer exclusively serving.
The failure mode here is protocol-shaped confidence: assuming that because the API surface is standardized, the operational story is standardized too. It is not. The API is common. The observability, the policy semantics and the recovery path are yours.
For each route type you intend to support, ask what the platform can actually prove. Can it show the request was accepted? Can it expose the resulting state to whoever submitted it? Can operators separate a configuration failure from a backend failure? Can a security reviewer identify the policy boundary? Can someone remove a bad declaration without making the surrounding traffic path harder to reason about?
Do not confuse API maturity with platform maturity
The same SIG Network update carries the standing reminder that features can be deprecated, removed or replaced as the project develops, and the v1alpha2 deprecation demonstrates it in the same breath as the graduation.
A platform is not mature because it tracks current versions. It is mature when it can explain how change is evaluated, introduced, observed and reversed. The failure mode is version worship: treating a graduated feature as an achievement independent of user outcomes. Teams adopt the new resource because it is new, the old custom path stays because nobody defined the migration boundary, and the result is two interfaces, more onboarding burden and more inconsistency than before.
An assessment you can apply
Score each question as clear, partial or unknown before making a graduated route type part of the default platform offer. An unknown is not a failure of the API. It is a gap in your evidence about your own platform.
- Inventory. Do you know how many
v1alpha2TCPRoute and UDPRoute objects exist, and which team owns each? - Intent. Can an application team state its traffic requirement without knowing controller internals?
- Support. Is the exact behavior supported by your installed implementation, with evidence rather than assumption?
- Policy. Are creation, attachment and destination permissions explicit?
- Status. Can the requester tell whether the route is accepted, rejected or incomplete?
- Ownership. Are application and platform responsibilities written down?
- Diagnosis. Can operators separate declaration, policy, controller and backend failures?
- Recovery. Can a bad declaration be removed or corrected without a larger outage?
- Portability. Are local extensions and limitations visible to consumers?
- Migration. Is there a decision about which existing interfaces remain, change or retire, with a date attached to the
v1alpha2removal?
Mostly clear answers suggest you are ready for a controlled default. Many partials suggest a pilot rather than broad self service. Unknowns in ownership, status or recovery mean adoption should wait until those are closed.
What graduation should actually change
The most consequential change v1.6 should trigger is procedural rather than technical. Treat a standard API as the start of a contract review, not the end of one. Define supported behavior, expose useful status, name ownership, test the failure modes and make local constraints visible. Ask what your platform can prove before treating a declaration as a guarantee.
The right question is not whether you can use TCPRoute. It is what promise you are prepared to make when you offer it. If the answer is precise, observable and recoverable, graduation reduces fragmentation and sharpens the platform boundary. If the answer is only that the resource is now v1, you have adopted a vocabulary without the responsibility that makes it worth anything.
If you are standardizing on Gateway API this year, conformance is the part that gets attention. We help platform teams build the contract underneath it: inventorying the v1alpha2 objects and attaching owners before removal is scheduled, writing the status semantics application teams are entitled to rely on, and proving the failure and removal path per route type before layer 4 traffic makes it urgent. If that is the work in front of you, we are ready to help.
Stay updated
Get insights on engineering transformation delivered to your inbox.
Newsletter coming soon.