Gateway API
Gateway API
NodePort na každou aplikaci se nedá udržet: skončíte tím, že si pamatujete, že e-shop je na 30080 a wiki na 30081. Chcete jeden HTTP vstupní bod, který směruje podle jména hosta a cesty.
Kubernetes na to má dvě odpovědi. Ingress je ta stará – stabilní, ale zmrazená: každý controller si ji rozšířil vlastními anotacemi, takže rewrite pravidlo pro nginx neznamená pro Traefik nic. Gateway API je náhrada: tatáž úloha vyjádřená skutečnými typovanými objekty, a veškerý vývoj teď probíhá tam.
Tři objekty, tři vlastníci
| Objekt | Odpovídá na | Obvykle vlastní |
|---|---|---|
| GatewayClass | která implementace to obslouží? | správce clusteru, instaluje se s controllerem |
| Gateway | kudy provoz vstupuje – porty, protokoly, TLS | platform tým |
| HTTPRoute | které požadavky na kterou Service | aplikační tým |
To rozdělení je hlavní přínos. U Ingressu jeden objekt míchal infrastrukturu
s aplikací, takže buď vývojáři editovali sdílenou infrastrukturu, nebo se
z platform týmu stala fronta na tikety. Tady tým vlastní svou HTTPRoute
a připojí ji ke Gateway, kterou smí použít – a Gateway přes allowedRoutes
rozhoduje, kdo se smí připojit.
Objekty
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: web-gw
spec:
gatewayClassName: nginx
listeners:
- name: http
protocol: HTTP
port: 80
allowedRoutes:
namespaces:
from: All
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: shop
spec:
parentRefs:
- name: web-gw
hostnames: ["shop.k8s.lab"]
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: shop-svc
port: 80
HTTPRoute se ke Gateway připojí sama přes parentRefs – route ukazuje nahoru,
Gateway své routy nevyjmenovává. Právě díky tomu může tým přidat routu, aniž by
sahal na sdílenou konfiguraci.
Co Ingress vyjádřit neuměl
- Rozdělení provozu – dva
backendRefss vahami, takže canary 90/10 je běžné pole, ne anotace. - Shoda podle hlaviček, metody a query – nejen podle hosta a cesty.
- Přepisování hlaviček a redirecty jako typované filtry.
- Další protokoly –
TCPRoute,GRPCRoute,TLSRoute. - Směrování napříč namespacy s výslovným modelem oprávnění.
backendRefs: # canary, žádné anotace
- name: shop-v1
port: 80
weight: 90
- name: shop-v2
port: 80
weight: 10
Pořád to jsou dva kusy
Objekty jsou jen data. Musí být nainstalovaný controller, který je čte a provozuje proxy – NGINX Gateway Fabric, Envoy Gateway, Traefik, Cilium nebo cloudový load balancer. A na rozdíl od Ingressu nejsou CRD součástí Kubernetes: nejdřív instalujete CRD Gateway API, pak controller. Lab 15 dělá obojí.
Gateway bez controlleru zůstane PROGRAMMED: False a neteče přes ni nic – stejné
tiché selhání jako u Ingressu bez controlleru, jen vám to aspoň řekne stavové
pole.
A samotný controller jsou dvě věci, což je dobré vědět, než ho půjdete hledat:
| Kde žije | Typ Service | |
|---|---|---|
| Řídicí rovina | namespace, do kterého jste chart nainstalovali | ClusterIP – mluví jen se svými agenty |
| Datová rovina (vlastní proxy) | vzniká na každou Gateway, v jejím namespace | to, co jste nastavili: NodePort nebo LoadBalancer |
Dokud tedy nevytvoříte Gateway, žádná proxy neexistuje – a když ji vytvoříte, neobjeví se vedle controlleru. Hledat NodePort v namespace controlleru a najít tam ClusterIP je u téhle implementace nejčastější falešný poplach.
Kudy sem provoz přiteče
Controller potřebuje vlastní vstupní bod. V cloudu je to LoadBalancer Service,
v tomhle clusteru NodePort – prohlížeč tedy mluví na http://worker01:<nodeport>
s hlavičkou Host:.
Má se ještě učit Ingress?
Potkáte ho – je v každém existujícím clusteru a nikam se neruší. Nová práce ale patří na Gateway API a většina controllerů umí během migrace číst obojí.