
In de traditionele Kubernetes omgevingen worden Services en Ingressen gebruikt en ingesteld door de ontwikkelaar van de bijbehorende applicatie/deployment om hiermee hun applicatie te ‘exposen’ aan de gebruikers. Met de Gateway API is er meer mogelijk dan met Ingress, vandaar hier een uitleg.
Roles/Personas
Via de personas zijn er verschillende rollen (roles) gedefinieerd:
- Infrastructure provider
- Cluster operator
- Application Admin
- Application Developer
Een gebruiker van een Kubernetes cluster kan 1 of meer van bovenstaande rollen toegekend krijgen.
Resources
Gateway API kent de volgende resources:
- GatewayClass – Infrastructure Provider role
- Gateway – Cluster Operator role
- Routes – Application Developers role
De gateway resource wordt gebruikt om verkeer naar een service te sturen en dit kan ingesteld worden middels een GatewayClass voor verschillende gateway resources. In de routes wordt bepaald hoe een gateway een service gebruikt. Routes zijn o.a. GRPCRoutes, HTTPRoutes, etc.
De Kubernetes Gateway API CRD’s dienen aanwezig te zijn in het cluster. Installeer deze evt. met:
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.0/standard-install.yaml
Vervolgens kan de Infrastructure Provider de GatewayClass(es) aanmaken. Hiervoor is een Kubernetes Gateway Controller nodig die door de Infrastructure Provider toegevoegd dient te worden aan het cluster.
Als gateway controller kan bijvoorbeeld Istio of NGINX gebruikt worden. Kijk hier voor een complete lijst van ondersteunde controllers.
Voor het aanmaken van loadbalancer services dient dat uiteraard ondersteund te worden door het cluster, in een ‘on-premise’ cluster zou dat met MetalLB kunnen.
Nadat dit allemaal aanwezig en geconfigureerd is in het cluster, kunnen de Cluster Operators de gateways en de Application Developers de routes aanmaken voor hun applicaties.
Gateway
Een gateway voor http verkeer naar een voorbeeld applicatie die gebruik maakt van de istio gatewayclass:
apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: go-app-gateway namespace: go-app spec: gatewayClassName: istio listeners: - name: http protocol: HTTP port: 80
HTTPRoute
Een route voor ‘traffic shifting’ voor een zgn. ‘canary’ test waarbij 80% van het verkeer gerouteerd wordt naar versie v1 van de applicatie en 20% van het verkeer gerouteerd wordt naar v2 van de applicatie:
apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: go-app-httproute namespace: go-app spec: parentRefs: - name: go-app-gateway hostnames: - "go-app.digitalinfo.local" rules: - backendRefs: - group: "" kind: Service name: go-app-svc-v1 port: 80 weight: 80 - group: "" kind: Service name: go-app-svc-v2 port: 80 weight: 20