Ingress vervangen door Gateway API (Kubernetes)

Praktische migratie van Ingress naar Gateway API: CRDs, GatewayClass, Gateway, HTTPRoute en een checklist.

De Kubernetes Gateway API vervangt het klassieke Ingress model met een explicietere, role-oriented API. In de praktijk wordt routing beter uit te drukken, ownership duidelijker, en cross-namespace relaties zijn gecontroleerd mogelijk.

Deze gids houdt de migratie bewust incrementeel: eerst parallel aan je bestaande Ingress, daarna per host/path omzetten.

Gateway API CRD relaties

Gateway API CRD relaties

Kort:

  • GatewayClass beschrijft welke controller de Gateways implementeert.
  • Gateway is je entrypoint: listeners, (TLS) termination en policy.
  • HTTPRoute vervangt host/path regels van Ingress en koppelt aan een Gateway via parentRefs.
  • ReferenceGrant is nodig als je routes/services cross-namespace wilt refereren.

1) Installeer Gateway API CRDs

Dit is non-destructief: bestaande Ingress traffic blijft gewoon werken.

kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.1.0/standard-install.yaml
kubectl get crd | grep gateway.networking.k8s.io

Verwachte CRDs:

gatewayclasses.gateway.networking.k8s.io
gateways.gateway.networking.k8s.io
httproutes.gateway.networking.k8s.io
referencegrants.gateway.networking.k8s.io

2) Definieer een GatewayClass

GatewayClass is conceptueel de opvolger van IngressClass. Koppel deze expliciet aan je controller.

apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
  name: nginx-gateway
spec:
  controllerName: k8s.nginx.org/nginx-gateway-controller

Gebruik je een andere controller (bijv. Envoy, HAProxy, cloud-LB controller), dan verandert alleen controllerName.

3) Maak een Gateway (listeners, later TLS)

Begin met HTTP. Voeg TLS pas toe als je routes attached en working zijn.

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: edge-gateway
  namespace: edge
spec:
  gatewayClassName: nginx-gateway
  listeners:
    - name: http
      protocol: HTTP
      port: 80
      allowedRoutes:
        namespaces:
          from: All

4) Converteer Ingress naar HTTPRoute

Host/path regels blijven herkenbaar, maar de koppeling naar de Gateway gebeurt via parentRefs.

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: app-route
  namespace: app
spec:
  parentRefs:
    - name: edge-gateway
      namespace: edge
  hostnames:
    - app.example.com
  rules:
    - matches:
        - path:
            type: PathPrefix
            value: /
      backendRefs:
        - name: app-service
          port: 80

5) Valideer status en verkeer

Check of de Gateway ready is en de route attached is. Pas daarna DNS of je edge/LB config aan.

kubectl get gateway -n edge
kubectl get httproute -n app

Voorbeeld output:

NAME           CLASS          ADDRESS       PROGRAMMED   AGE
edge-gateway   nginx-gateway  203.0.113.10   True         2m

NAME        HOSTNAMES           AGE
app-route   app.example.com     2m

Migratie checklist

  • Installeer Gateway API CRDs en je controller parallel aan Ingress.
  • Maak GatewayClass en per omgeving een Gateway.
  • Converteer Ingress regels naar HTTPRoute in kleine batches (per host/path).
  • Verplaats DNS/traffic incrementeel (canary indien mogelijk).
  • Verwijder legacy Ingress pas als traffic stabiel is en observability groen blijft.