Blog · October 18, 2026 · 9 min read

Kubernetes Gateway API: The Ingress Successor

Diagram: a gate as the entry to the cluster, behind it routes branch out to several services, marked with three role tags
Graphic: HumanITy

The Kubernetes Gateway API is the successor to Ingress: a family of Kubernetes objects you use to route traffic into the cluster from outside and between services. The core objects GatewayClass, Gateway, and HTTPRoute have been stable since version 1.0 (October 2023), and the current version is 1.6.3. The Kubernetes project now explicitly recommends using Gateway instead of Ingress. Ingress stays available but is no longer being developed. Unlike Ingress, the Gateway API is not built into Kubernetes: you install its object types as CRDs and need a controller that implements them.

I run Kubernetes clusters in production, on k3s with Traefik as the ingress controller, and I wrote the Kubernetes practical guide published by Rheinwerk (2024). In this article I show how the Gateway API is structured, how it differs from Ingress, and why the question of switching became more urgent in 2026. You can find all my articles on Kubernetes collected on the Kubernetes page.

What the Gateway API is

The Kubernetes documentation describes the Gateway API as "a family of API kinds that provide dynamic infrastructure provisioning and advanced traffic routing". The most important idea behind it is the separation of roles. The objects are cut along three roles that exist in many organizations anyway:

Role Responsible for Object
Infrastructure provider the infrastructure, for example a cloud provider's load balancer GatewayClass
Cluster operator entry points, ports, certificates, who may attach which routes Gateway
Application developer routing to their own application HTTPRoute, GRPCRoute, and other routes

A GatewayClass says which controller is responsible, for example Traefik, Envoy Gateway, or a cloud provider's controller. A Gateway is a concrete entry point with listeners, such as HTTPS on port 443 for a domain. Routes attach to a Gateway and describe which traffic goes to which Service. The application team can change its HTTPRoute without touching the Gateway, and the cluster team decides from which namespaces routes may be attached at all.

Gateway API vs Ingress

I explained Ingress in detail in Kubernetes Ingress and Ingress Controllers. It bundles entry point and routing into one object and, by default, only handles host and path. Everything beyond that, such as redirects, rewrites, or weighting between two versions, lives in annotations, and those differ from controller to controller. If you switch controllers, you rewrite the annotations.

Ingress Gateway API
Status stable, but frozen stable (core objects since v1.0), actively developed
Part of Kubernetes yes, built in add-on: CRDs, installed separately
Objects one object for everything GatewayClass, Gateway, routes separated by role
Protocols HTTP and HTTPS HTTP, HTTPS, gRPC, TLS, TCP, UDP (depending on version and controller)
Header matching, weighting, rewrites only via controller annotations part of the standard
Switching controllers rewrite annotations routes stay the same, as long as the new controller supports the features

The documentation is unambiguous about the status of Ingress: "The Ingress API has been frozen." It is generally available and the project has no plans to remove it, but it will not get any further changes. So you do not have to rebuild anything in a hurry. New features, however, only go into the Gateway API.

Which parts are stable

The Gateway API is published in two channels. The Standard channel contains what is considered stable; the Experimental channel contains new features that may still change. For production, use the Standard channel. Key steps in recent versions according to the release notes:

Version Date What moved into the Standard channel
v1.0 October 31, 2023 GatewayClass, Gateway, and HTTPRoute as stable (v1)
v1.1 May 9, 2024 GRPCRoute as stable
v1.4 October 6, 2025 BackendTLSPolicy (TLS from the gateway to the backend), SupportedFeatures (status of which features a controller supports)
v1.5 February 27, 2026 TLSRoute and ListenerSet as v1, CORS filter for HTTPRoute, client certificate validation
v1.6 June 29, 2026 TCPRoute and UDPRoute as stable

Which version you can use depends not only on the CRDs but also on which version your controller supports. That is the point you should check first before any rollout.

A Gateway and an HTTPRoute

Here is a minimal example: a Gateway accepts HTTP on port 80, and an HTTPRoute sends everything under shop.example.com to the Service shop, with 10 percent of requests going to a new version.

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: web
  namespace: infra
spec:
  gatewayClassName: example   # name of your controller's GatewayClass
  listeners:
    - name: http
      protocol: HTTP
      port: 80
      allowedRoutes:
        namespaces:
          from: All
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: shop
  namespace: shop
spec:
  parentRefs:
    - name: web
      namespace: infra
  hostnames:
    - shop.example.com
  rules:
    - matches:
        - path:
            type: PathPrefix
            value: /
      backendRefs:
        - name: shop
          port: 80
          weight: 90
        - name: shop-new
          port: 80
          weight: 10

kubectl get gatewayclass shows you the name of the GatewayClass. Whether the Gateway was accepted is in its status: kubectl describe gateway web -n infra shows under Conditions whether it is Accepted and Programmed, and kubectl describe httproute shop -n shop shows whether the route is attached to the Gateway. If one of these conditions is missing, the cause is almost always a wrong name in parentRefs or allowedRoutes that do not permit the namespace.

The weighting in backendRefs is exactly the kind of feature you would need a controller annotation for with Ingress. Here it is part of the standard.

Why the question is more urgent in 2026: the end of ingress-nginx

Many clusters use ingress-nginx, the Kubernetes community's ingress controller. In November 2025, SIG Network and the Security Response Committee announced its retirement: best-effort maintenance until March 2026, then no more releases, no bug fixes, and no updates for security vulnerabilities. The repository is now archived. Existing installations keep running, but just like with the archived Kubernetes Dashboard, nobody fixes new vulnerabilities any more.

The project itself recommends two paths: switch to the Gateway API, which it calls "the modern replacement for Ingress", or, if you must stay with Ingress, use a different ingress controller. So if you run ingress-nginx, you have to change something anyway. Then it is worth checking whether to go straight to the Gateway API instead of only swapping the controller.

For translating existing Ingress objects there is ingress2gateway, a tool from the Gateway API project (currently v1.2.0). It translates Ingress objects and some provider-specific resources into Gateway API objects. It explicitly does not just copy annotations over; you have to check yourself what is hidden in them in your setup. The result is a starting point, not a finished manifest.

Gateway API with k3s and Traefik

k3s ships with Traefik v3, and Traefik supports the Gateway API as an option. According to the k3s documentation, you enable it with a HelmChartConfig:

apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
  name: traefik
  namespace: kube-system
spec:
  valuesContent: |-
    providers:
      kubernetesGateway:
        enabled: true

The documentation names two limitations (as of October 14, 2026): the bundled Traefik is compatible with Gateway API v1.4, and for experimental resources such as TCPRoute you need the experimental CRDs of that version plus the option providers.kubernetesGateway.experimentalChannel=true in the Traefik values. And before the k3s releases of April 2026, the Gateway API CRDs were removed if Traefik was disabled after having been enabled. If you run an older k3s version, do not disable Traefik while Gateway resources exist in the cluster. The standalone Traefik documentation lists support for Gateway API v1.6.3 for the current Traefik version. Which Traefik version is inside your k3s is listed in the release notes of your k3s version.

When you should switch

My assessment, consistent with what I wrote in the Ingress article:

  • You run ingress-nginx: plan the switch now. Consider the Gateway API as the target, especially if you use many annotations.
  • New cluster with several teams: start with the Gateway API. The separation between Gateway and routes pays off as soon as more than one team maintains routes.
  • One application, one domain, TLS, a maintained controller: Ingress is still enough. You do not have to rebuild anything as long as annotations do not get in your way.

Frequently asked questions

Does the Gateway API replace Ingress?

Yes, it is designed as the successor, and the Kubernetes project recommends Gateway instead of Ingress. Ingress is not being removed, though: it is frozen, stays stable and available, and just does not get new features.

Is the Gateway API included in Kubernetes?

Not built in. The object types are CRDs that you install, and a controller such as Traefik, Envoy Gateway, or your cloud provider's controller implements them. Some distributions and controllers ship the CRDs.

Is the Gateway API production ready?

The core objects GatewayClass, Gateway, and HTTPRoute have been stable since v1.0 in October 2023, GRPCRoute since v1.1, TLSRoute since v1.5, and TCPRoute and UDPRoute since v1.6. For production, use the Standard channel and check which version your controller supports.

What happens to ingress-nginx?

ingress-nginx is retired: since March 2026 there have been no releases and no security updates, and the repository is archived. Existing installations keep running but should be moved to a different controller or to the Gateway API.

What is the difference between Gateway and GatewayClass?

The GatewayClass defines which controller is responsible, comparable to the IngressClass. The Gateway is a concrete entry point of that controller with ports, protocols, and certificates. The applications' routes then attach to a Gateway.

Where to go next

If you are missing the basics, read Kubernetes Ingress and Ingress Controllers and Kubernetes Service Types Explained first, because the Gateway API also routes to Services, never directly to pods. If you want to control traffic not only into the cluster but also inside it, continue with Kubernetes Network Policy Explained.

If you are facing this decision and want a second opinion on your cluster, for example as a cluster review, my page Kubernetes Expert: Consulting and Operations shows what I offer.

I explain Ingress and Services in detail in my Kubernetes Practical Guide (Rheinwerk Computing). The full specification is on the Gateway API project website, and the Kubernetes project's overview is in the Gateway API documentation.

Kevin Welter

Kevin Welter

Developer, IT architect, author of technical books (Kubernetes, cloud infrastructures) and speaker. Runs his business with an AI workforce of fourteen AI employees and shows solo business owners in his community how to hire their first AI employee.

More about AI employees

Kubernetes from the basics to a production-ready cluster

Get the book