Skip to main content

Ingress Is Ending. We Migrated to Gateway API, and K3s's Traefik Only Got Us Halfway

Why "Ingress to Gateway API" Matters Right Now

If you've started looking into K3s Gateway API migration, you're not alone. In November 2025, Kubernetes SIG Network and the Security Response Committee announced that best-effort maintenance of Ingress NGINX would end in March 2026 (Kubernetes official blog). After that date, there will be no new releases, no bug fixes, and no security patches. Existing deployments won't stop working overnight, but deciding on a migration path now has become the pragmatic move.

The officially named successor is Gateway API. It reached General Availability in October 2023 and was positioned as the successor to Ingress (Kubernetes official blog: Gateway API GA). Unlike the Ingress era, where behavior depended on vendor-specific annotations, features like weighted routing and role separation are built directly into the API specification.

K3s users have one thing going for them: Traefik ships by default. It's tempting to assume that "a K3s cluster running Traefik is already Gateway API-ready." Hands-on experience shows it isn't that simple. Whether you keep chasing these networking spec changes manually, or hand that burden to a managed K3s offering like Kubo, is a question worth sitting with by the end of this article.

section01

The Myth That K3s's Built-in Traefik Is "Already Migrated"

Here's the short version: having Traefik installed in K3s doesn't mean Gateway API is ready to use. Traefik's official documentation states that using Gateway API requires separately installing the Gateway API CRDs (from the standard channel) plus Traefik's RBAC configuration (Traefik official documentation). If you installed Traefik via its Helm chart, CRDs and RBAC are managed automatically — but K3s's built-in Traefik (the simplified, non-Helm-managed setup) doesn't give you that for free.

In other words, there's a real gap between "Traefik supports Gateway API" and "Gateway API works out of the box on K3s": the CRD installation step. Many teams hit this first, seeing errors like "no GatewayClass exists" or "the Gateway resource never reaches Programmed."

section02

What Happened When We Upgraded K3s — Traefik v40's Breaking Change

There's a second practical trap. K3s's 1.36 line bumped the Traefik Helm chart to the v40 series, and the latest v1.36.5+k3s1 ships Traefik 3.7.13 (SUSE official documentation: K3s v1.36 release notes). Chart v40.0.0 includes a breaking change tied to the ingress-nginx migration path: the provider name changed from kubernetesIngressNginx to kubernetesIngressNGINX (Traefik Helm Chart v40.0.0 release notes).

If your environment translates ingress-nginx annotations for Traefik, this single upgrade can produce a scenario where "nothing in your config changed, but routing silently breaks one day." Because the timing of a Gateway API migration often coincides with a K3s version bump, the two need to be planned together rather than treated as separate projects.

Chasing down breaking changes buried in minor version bumps, one by one, is a quietly exhausting job for an infrastructure team. Kubo's AI-Driven Deployment lets you issue deployment instructions in natural language with these version-to-version differences already accounted for, while Captain UI keeps the actual changes visible.

section03

Canary Releases Don't Carry Over the Way They Did Under Ingress

Teams running canary releases through Ingress NGINX annotations (like canary-weight) hit another stumbling block during Gateway API migration. HTTPRoute supports weighted routing natively as part of the spec, but it's a fundamentally different way of writing things than Ingress annotations. Datadog's engineering blog makes the same point: Gateway API "moves configuration out of custom annotations and into core resources" like HTTPRoute, which is exactly why existing annotation-based setups can't be converted one-to-one (Datadog official blog).

There's also a K3s/Traefik-specific wrinkle: Traefik has long had its own TraefikService CRD, predating Gateway API, for weighted load balancing and mirroring (Traefik official documentation: TraefikService). Progressive delivery tools like Argo Rollouts integrate with TraefikService to automatically adjust canary weights (Argo Rollouts official documentation).

What actually happens is this: your existing canary setup runs on the combination of TraefikService and IngressRoute (Traefik's own CRDs), but migrating to Gateway API means rewriting it against a different object model — HTTPRoute. Gateway API isn't missing a feature here; the type of resource you need to replace simply changes, and that's the part worth planning for.

section04

Keeping cert-manager Certificate Renewal in Sync

If you're running cert-manager on K3s, we've covered before on this blog how ServiceLB can steal the port needed for the HTTP-01 challenge, stalling automatic certificate renewal. Switching routing over to Gateway API changes which resource triggers certificate issuance — from Ingress to HTTPRoute/Gateway — so you need to re-verify which resource your cert-manager Certificate is actually watching during the migration. While Ingress and HTTPRoute run in parallel, TLS settings often end up applied to only one of them, leaving the newer route without working TLS.

Kubo ships cert-manager plus Let's Encrypt as standard, alongside Prometheus and Grafana monitoring, with this kind of certificate-consistency checking already built into day-to-day operations.

Migrate in Parallel, Not All at Once

Kong's migration guide recommends not finishing the Ingress-to-Gateway-API move in one shot, but moving in stages instead. Concretely: use a tool like ingress2gateway to convert existing Ingress manifests into Gateway/HTTPRoute resources, confirm the new Gateway reaches the Programmed condition, and then cut over a subset of resources at a time (Kong official migration guide). The advice to verify incrementally rather than delete everything at once applies just as much in a K3s environment.

On K3s, there's an added wrinkle: K3s version upgrades and Traefik version upgrades move together. A realistic sequence looks like: (1) confirm your current K3s/Traefik version and the corresponding Gateway API version, (2) install the Gateway API CRDs and RBAC, (3) convert a subset of Ingress resources to HTTPRoute and run them in parallel, and (4) finish verifying canary and certificate behavior before cutting over in stages.

section05

Summary

Because K3s ships with Traefik by default, it's easy to assume the move to Gateway API will be just as easy. In practice, there are several K3s-specific issues to work through: installing additional CRDs, breaking changes to Traefik that come bundled with K3s version bumps, a different object model for canary releases, and keeping certificate-issuance resources in sync. With the Ingress-nginx retirement forcing the timeline, now is the moment to get ahead of these pitfalls.

Managing this kind of migration — and keeping up with K3s version changes in general — by hand is no small burden for an infrastructure team. Kubo is a managed Kubernetes service built on K3s; its AI-Driven Deployment and Captain UI let you push through configuration changes like this safely, using natural-language instructions and a visualized management console. It's worth considering as an option that keeps the full feature set of EKS/AKS-grade Kubernetes while taking on the operational complexity for you.

Networking changes like a Gateway API migration carry real risk when you're experimenting directly in production. Kubo runs on Pure Kubernetes and integrates GitOps (ArgoCD/Flux) as standard, so even a staged rollout to HTTPRoute can live inside your existing Git-based workflow. If you want the full capability of Kubernetes while cutting K3s operating costs, Kubo's pricing page has a cost comparison against AWS EKS and Azure AKS.

If you feel like you no longer have the bandwidth to track every K3s version detail and validate every networking change by hand, get in touch about adopting Kubo.

Related articles

← Back to all posts