Ingress and the Gateway API
Ingress is HTTP routing into the cluster: one external entry point that sends requests to different Services by hostname and path, terminating TLS along the way. It exists so you do not provision a separate cloud load balancer for every service.
Ingress is also showing its age. The Gateway API is its successor — a richer, role-oriented model that is now the recommended direction for new routing. This topic covers both, and when to use which.
The Ingress Object
An Ingress is a set of HTTP routing rules: for this host and this path prefix, send traffic to that Service. One Ingress can front many Services behind a single external IP, which is the whole point — host- and path-based virtual hosting without a load balancer per service.
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: site spec: ingressClassName: nginx rules: - host: shop.example.com http: paths: - path: /api pathType: Prefix backend: service: name: orders port: number: 80
Ingress Controllers
The Ingress object is just data; nothing happens until an Ingress controller is running to read it and configure an actual proxy. NGINX, HAProxy, Traefik, and cloud-native controllers are common choices. The ingressClassName field picks which controller handles a given Ingress, so multiple controllers can coexist. Forgetting to install a controller is the classic "my Ingress does nothing" mistake.
TLS termination is configured on the Ingress by referencing a Secret that holds the certificate and key. The controller terminates HTTPS at the edge and forwards plain HTTP to the backend Services — though most setups pair this with cert-manager to issue and renew certificates automatically.
The Limits of Ingress
Ingress was scoped narrowly to HTTP host/path routing, so anything beyond that — header-based routing, traffic splitting for canaries, gRPC, TCP/UDP — was bolted on through controller-specific annotations. Those annotations are not portable: an Ingress tuned for NGINX does not behave the same on another controller. The model also blurs roles, mixing infrastructure concerns and application routing in one object owned by one team.
The Gateway API
The Gateway API replaces annotation-soup with first-class, portable resources and a clean separation of roles. A GatewayClass and Gateway are owned by the platform or infrastructure team (the listeners, IPs, and TLS), while HTTPRoute (and TCPRoute, gRPCRoute) are owned by application teams and attach to a Gateway. Header matching, traffic splitting, and cross-namespace routing are built in, not annotations.
For new clusters the Gateway API is the recommended path; Ingress remains widely deployed and fully supported, so you will meet both for years. The practical guidance: learn Ingress because it is everywhere, and prefer the Gateway API for anything new that needs more than basic host/path routing.
Ingress — simple host/path HTTP routing, one object, advanced features via non-portable annotations. Ubiquitous and supported.
Gateway API — role-separated, portable resources (Gateway + HTTPRoute) with header matching and traffic splitting built in. The recommended direction for new routing.
- Creating an Ingress with no controller installed and wondering why nothing routes.
- Relying on controller-specific annotations and assuming the Ingress is portable to another controller.
- Pushing non-HTTP traffic (raw TCP, databases) through Ingress, which is designed for HTTP.
- Hand-managing TLS certificates instead of automating issuance and renewal with cert-manager.
- Starting a brand-new cluster on Ingress for advanced routing instead of evaluating the Gateway API first.
- Install and verify an Ingress controller before creating Ingress objects; set
ingressClassNameexplicitly. - Automate certificates with cert-manager rather than rotating Secrets by hand.
- Front many Services with one Ingress (or Gateway) instead of a LoadBalancer per service.
- Prefer the Gateway API for new routing that needs header matching, traffic splitting, or clean team boundaries.
- Treat annotation-based Ingress features as controller lock-in and document them as such.
Knowledge Check
You created an Ingress but no traffic is routed. What is the most common reason?
- No Ingress controller is installed to read the Ingress and configure a proxy
- A separate LoadBalancer Service is required for every single host and path rule
- The Ingress object must live in the kube-system namespace to route
- Ingress routing only works once the Gateway API is also enabled
What is the main structural improvement of the Gateway API over Ingress?
- Role separation and portable resources — Gateway (platform) vs HTTPRoute (app teams) — with features built in, not via annotations
- It removes the need for any controller, since the kube-apiserver itself programs the proxies and routes traffic directly to backend Pods
- It runs entirely on the control plane with no data-plane proxy at all
- It supports only a single backend Service per Gateway object
Why are advanced Ingress features often non-portable across controllers?
- They are expressed as controller-specific annotations rather than standard fields
- Each Ingress object is pinned to one specific node and cannot move
- Every Ingress controller defines its own mutually incompatible apiVersion for the object
- TLS Secrets are stored in a controller-specific proprietary format
You got correct