Gateway API: HTTPRoute în Kubernetes (kubectl)

Obiecte Kubernetes (manifeste YAML) Gateway API v1.0+ (gateway.networking.k8s.io/v1)

Regulile de rutare HTTP din Gateway API: după domeniu, cale sau antete, cerere trimisă către unul sau mai multe Service-uri.

Sintaxă comandă
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute

Ce face Gateway API: HTTPRoute

HTTPRoute se atașează la un Gateway prin parentRefs și spune ce se întâmplă cu cererile HTTP: pentru ce domenii (hostnames), ce căi sau antete se potrivesc (matches) și către ce Service-uri merg (backendRefs). Ruta stă de obicei în namespace-ul aplicației, lângă Service.

Lucruri pentru care la Ingress aveai nevoie de adnotări specifice fiecărui controller sunt aici câmpuri standard: împărțirea traficului pe procente (weight, util la lansări canary), redirecționarea HTTP spre HTTPS, rescrierea căii sau adăugarea de antete (filters).

Parametri

Parametru Descriere
spec.parentRefs Gateway-ul (și opțional listenerul, prin sectionName) la care se atașează ruta.
spec.hostnames Domeniile pentru care se aplică ruta.
rules[].matches Condiții: path (PathPrefix, Exact), headers, queryParams, method.
rules[].backendRefs Service-urile țintă, cu port și opțional weight.
rules[].filters RequestRedirect, URLRewrite, RequestHeaderModifier etc.

Exemple

Exemplul 1: Site și API pe același domeniu

Cererile care încep cu /api merg la API, restul la frontend. Ruta se atașează la listenerul https al Gateway-ului public.

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: magazin
  namespace: magazin
spec:
  parentRefs:
    - name: public
      namespace: infra
      sectionName: https
  hostnames:
    - magazin.exemplu.ro
  rules:
    - matches:
        - path:
            type: PathPrefix
            value: /api
      backendRefs:
        - name: magazin-api
          port: 3000
    - backendRefs:
        - name: magazin-web
          port: 80

Exemplul 2: Lansare canary: 10% din trafic pe versiunea nouă

Ponderile sunt relative: 90 și 10 înseamnă 90% și 10% din cereri.

rules:
  - matches:
      - path:
          type: PathPrefix
          value: /api
    backendRefs:
      - name: magazin-api-v1
        port: 3000
        weight: 90
      - name: magazin-api-v2
        port: 3000
        weight: 10

Exemplul 3: Redirecționare HTTP spre HTTPS și verificare

O rută separată pe listenerul http răspunde cu 301 către adresa HTTPS.

kubectl apply -f - <<'EOF'
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: magazin-redirect
  namespace: magazin
spec:
  parentRefs:
    - name: public
      namespace: infra
      sectionName: http
  hostnames: ["magazin.exemplu.ro"]
  rules:
    - filters:
        - type: RequestRedirect
          requestRedirect:
            scheme: https
            statusCode: 301
EOF
kubectl get httproute -n magazin

Ieșire în terminal

httproute.gateway.networking.k8s.io/magazin-redirect created
NAME               HOSTNAMES                AGE
magazin            ["magazin.exemplu.ro"]   12m
magazin-redirect   ["magazin.exemplu.ro"]   3s

Greșeli frecvente

  • Trimiterea către un Service din alt namespace fără ReferenceGrant: din motive de securitate, Gateway API refuză referințele între namespace-uri până când namespace-ul țintă le permite explicit.
  • Neverificarea stării rutei: kubectl describe httproute arată în Status condițiile Accepted și ResolvedRefs, care explică de ce o rută nu funcționează (Gateway inexistent, Service greșit, port lipsă).

Comenzi înrudite

  • Gateway API: Gateway și GatewayClass: Punctul de intrare în cluster din Gateway API, succesorul lui Ingress: definește porturile, protocoalele și certificatele TLS.
  • Obiectul ReplicaSet: Menține în funcțiune un număr fix de Pod-uri identice; este creat și gestionat automat de Deployment.