Ingress-Nginx pensioneras i mars 2026: Så här går du över till Gateway API och Cilium Gateway

Den här artikeln ger plattformteam en konkret migrationshandbok.

Anders Johansson

Anders Johansson

Platform Engineer

Texten är automatiskt översatt för din bekvämlighet, du kan läsa texten på:

.

TL;DR

Med utfasningen av Ingress-Nginx är en migrering från Ingress-Nginx till Gateway API med Cilium och en delad gateway-modell ett sätt att lösa ingress till ditt kluster, där du byter lite komplexitet mot renare, effektivare och mer standardiserad ingresshantering.

Varför utforska Gateway API:

Gateway API adresserar dessa frågor genom att erbjuda:

Gateway API på Cilium, hanterat åt dig

Starta Talos-baserade kluster med Cilium och Gateway API redo dag ett. Få ett hanterat kontrollplan och flexibel blocklagring, så att du kan fokusera på dina arbetslaster i stället för grundinfrastrukturen.



Upptäck Kubernetes on-demand

Låt oss börja

Förutsättningar

Installation av Gateway API CRDs

Innan du påbörjar migreringen behöver du installera Gateway API-CRD:erna. Vi använder den senaste Gateway API v1.4.0:

# Install standard Gateway API CRDs
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.4.0/config/crd/standard/gateway.networking.k8s.io_gatewayclasses.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.4.0/config/crd/standard/gateway.networking.k8s.io_gateways.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.4.0/config/crd/standard/gateway.networking.k8s.io_httproutes.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.4.0/config/crd/standard/gateway.networking.k8s.io_referencegrants.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.4.0/config/crd/standard/gateway.networking.k8s.io_grpcroutes.yaml

# Install experimental CRDs (optional, for TLS routes)
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.4.0/config/crd/experimental/gateway.networking.k8s.io_tlsroutes.yaml

Nödvändig Cilium-konfiguration

För att aktivera stöd för Gateway API i Cilium måste flera viktiga funktioner konfigureras:

Väsentliga Cilium-funktioner

# Cilium configuration for Gateway API
gatewayAPI:
  enabled: true           # Enable Gateway API support

kubeProxyReplacement: true # Required for Gateway API

l2announcements:
  enabled: true           # Enable L2 announcements for LoadBalancer services

externalIPs:
  enabled: true           # Allow external IP assignment

# Important for clusters with many services
k8sClientRateLimit:
  burst: 40               # Adjust based on cluster size
  qps: 20                 # Adjust based on cluster size

Konfiguration av IP-pool för lastbalanserare

Definiera en IP-pool för LoadBalancer-tjänster:

apiVersion: cilium.io/v2alpha1
kind: CiliumLoadBalancerIPPool
metadata:
  name: "ipv4-pool"
spec:
  blocks:
    - start: "Start Address"
      stop: "Stop Address"

Policy för L2-annonsering

Konfigurera L2-annonsering för ditt nätverksgränssnitt:

apiVersion: "cilium.io/v2alpha1"
kind: CiliumL2AnnouncementPolicy
metadata:
  name: l2-announcement
spec:
  interfaces:
    - eth0  # Replace with your network interface name
  externalIPs: true
  loadBalancerIPs: true

Delad vs icke-delad Gateway

Att använda den icke-delade gatewayen replikerar samma mönster som ingress-nginx. I princip en gateway, httproute och ett grant för TLS-certifikatet. Och en gateway innebär också att man använder en IP-adress ur poolen. Det finns visserligen användningsfall för att använda en separat Gateway för din arbetslast, men i det här blogginlägget fokuserar vi på den delade Gatewayen.

Icke-delad Gateway

I det traditionella tillvägagångssättet har varje tjänst eller applikation sin egen Gateway-resurs:

FördelarNackdelar
Fullständig isolering mellan tjänsterHögre resursförbrukning (flera Gateway-instanser)
Individuell konfiguration per tjänstDuplicerad hantering av TLS-certifikat
Enklare felsökning (en gateway per tjänst)Mer komplex distribution av certifikat
Inga beroenden mellan namespacesÖkad driftmässig overhead
Förbrukning av IP-adresser

Exempel

# Individual gateway per service
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: podinfo-gateway
  namespace: podinfo
spec:
  gatewayClassName: cilium
  listeners:
  - hostname: podinfo.fdqn
    name: http
    port: 80
    protocol: HTTP

Delad Gateway

Så låt oss utforska den delade Gatewayen.

FördelarNackdelar
Minskad resursförbrukning (en enda Gateway-instans)Beroenden mellan namespaces
Centraliserad hantering av TLS-certifikatKräver ytterligare RBAC-konfiguration
Konsekventa säkerhetspolicyerMer komplex initial uppsättning
Förenklad drift och övervakningPotentiell enskild felpunkt
Förbättrad säkerhet genom val av namespace
Förbrukning av IP-adresser

Exempel

# Shared gateway serving multiple services
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: shared-gateway
  namespace: gateway-system
spec:
  gatewayClassName: cilium
  listeners:
    - name: https
      port: 443
      protocol: HTTPS
      tls:
        certificateRefs:
          - kind: Secret
            name: domain-wildcard-tls
            namespace: cert-manager
      allowedRoutes:
        namespaces:
          from: Selector
          selector:
            matchLabels:
              gateway.networking.k8s.io/allowed: "true"

Migreringssteg

Steg 1: Förbered den delade gateway-infrastrukturen

Skapa namnrymden gateway-system och distribuera den delade gatewayen:

# Namespace with proper labeling
apiVersion: v1
kind: Namespace
metadata:
  name: gateway-system
  labels:
    app.kubernetes.io/name: shared-gateway
    app.kubernetes.io/component: networking

Steg 2: Konfigurera certifikatåtkomst

Konfigurera ReferenceGrant så att gatewayen kan komma åt TLS-certifikat:

apiVersion: gateway.networking.k8s.io/v1beta1
kind: ReferenceGrant
metadata:
  name: shared-gateway-cert-access
  namespace: cert-manager
spec:
  from:
  - group: gateway.networking.k8s.io
    kind: Gateway
    namespace: gateway-system
  to:
  - group: ""
    kind: Secret
    name: domain-wildcard-tls

Steg 3: Migrera enskilda tjänster

För varje tjänst, följ detta migrationsmönster:

Före (nginx-ingress):

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: podinfo
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
spec:
  rules:
  - host: podinfo.fqdn
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: podinfo
            port:
              number: 9898

Efter (Gateway API med gemensam gateway):

  1. Märk namnrymden:
    apiVersion: v1
    kind: Namespace
    metadata:
      name: podinfo
      labels:
        gateway.networking.k8s.io/allowed: "true"  # Enable shared gateway access
    
  2. Skapa HTTPRoute:
    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
      name: podinfo
      namespace: podinfo
    spec:
      hostnames:
      - podinfo.fqdn
      parentRefs:
      - name: shared-gateway
        namespace: gateway-system
      rules:
      - backendRefs:
        - name: podinfo
          port: 9898
    
  3. Skapa ReferenceGrant för åtkomst mellan namnrymder:
    apiVersion: gateway.networking.k8s.io/v1beta1
    kind: ReferenceGrant
    metadata:
      name: podinfo-to-shared-gateway
      namespace: gateway-system
    spec:
      from:
      - group: gateway.networking.k8s.io
        kind: HTTPRoute
        namespace: podinfo
      to:
      - group: gateway.networking.k8s.io
        kind: Gateway
        name: shared-gateway
    
  4. Ta bort Nginx Ingress
    kubectl delete your_ingress -n your_namespace
    

Säkerhetsförbättringar

Det delade gateway-upplägget medför flera säkerhetsförbättringar:

Namespace-baserad åtkomstkontroll

Endast namespaces som uttryckligen är märkta med gateway.networking.k8s.io/allowed: "true" kan skapa HTTPRoutes som refererar till den delade gatewayn.

Direkt certifikathantering

Gatewayn har direkt åtkomst till certifikat från cert-manager-namespacet.

RBAC-integration

Korrekt ServiceAccount- och RBAC-policyer säkerställer att endast auktoriserade komponenter kan hantera gatewayresurser.

Vilka är fördelarna?

  1. Resurseffektivitet: Att utnyttja Ciliums möjligheter och minimera resurspåslag är alltid bra. Mer eBPF åt folket!
  2. Förbättrad säkerhet: Namespace-baserad åtkomstkontroll och direkt integration med cert-manager
  3. Driftsmässig enkelhet: Färre resurser att övervaka och underhålla
  4. Standardefterlevnad: I linje med Kubernetes-communityns inriktning

Tankar om prestanda

Det delade gateway-upplägget visar förbättrad prestanda genom:

Länkar

Avveckling av Ingress Nginx

Gateway API

Cilium Gateway

Redo att testa detta i ett riktigt kluster?

Safespring on-demand Kubernetes låter dig provköra Gateway API och Cilium i en hanterad miljö där Talos, observabilitet och lagring redan finns på plats. Perfekt för att pilottesta din Ingress-Nginx-migrering innan du rullar ut den i produktion.



Upptäck Kubernetes on-demand