Gateway API

Gateway API Logo

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