Installatie Nginx Ingress

Een Ingress Controller kan gebruikt worden om inkomende (http/https) aanvragen naar de juiste resources te sturen. Met behulp van een manifest kan een domainnaam voorzien zijn van een path dat gevolgd wordt op de Ingress Resource.

Ingress Controller

Op de Raspberry Pi Kubernetes Cluster dient een ARM-versie geïnstalleerd te worden en die is beschikbaar in een GIT-repository:

https://github.com/kubernetes/ingress-nginx

Installatie instructie op de Raspberry Pi cluster:

Ter controle kunnen we de pods uit de ingress-nginx namespace opvragen:

$ kubectl get namespaces | grep ingress
 ingress-nginx     Active   24h

$ kubectl get pods -n ingress-nginx
NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-gkkss        0/1     Completed   0          4m14s
ingress-nginx-admission-patch-gvtl9         0/1     Completed   1          4m14s
ingress-nginx-controller-55bc4f5576-wkdk4   1/1     Running     0          4m14s

Het aantal controllers is uiteraard te ‘scalen’, bijvoorbeeld naar 2 replica’s:

$ kubectl scale deployment/ingress-nginx-controller -n ingress-nginx --replicas=2

Ingress Resources

Een Ingress Resource kan bijvoorbeeld aangeven dat een aanvraag voor een domainnaam naar één specifieke pod gestuurd moet worden, of gebaseerd op de URL van de aanvraag, naar verschillende pods. De Ingress resource wordt aangemaakt met een definition bestand, bijvoorbeeld:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
   name: nginx-ingress
   namespace: default
   annotations:
     nginx.ingress.kubernetes.io/rewrite-target: /
spec:
   rules:
   - host: hello-world.info
     http:
       paths:
       - path: /
         pathType: ImplementationSpecific
         backend:
           service:
             name: nginx-service
             port:
               number: 80  

Dit geeft aan dat een http-aanvraag (TCP-port 80) met domain ‘hello-world.info’ in de URL, naar de service gestuurd moet worden met de naam ‘nginx-service’. Ter controle:

$ kubectl get ingress -n default
NAME           HOSTS              ADDRESS   PORTS   AGE
nginx-ingress  hello-world.info             80      3d20h

Om verschillende applicaties te benaderen met behulp van een URL-aanroep, kunnen we de volgende Ingress aanmaken:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
   name: nginx-ingress
   namespace: default
spec:
   rules:
   - host: hello-world.info
     http:
       paths:
       - path: /v1
         pathType: Prefix
         backend:
           service:
             name: app-v1
             port:
               number: 80
       - path: /v2
         pathType: Prefix
         backend:
           service:
             name: app-v2
             port:
               number: 80  

Hier wordt http://hello-world.info/v1 gestuurd naar de service met de naam app-v1 en http://hello-world.info/v2 gestuurd naar de service met de naam app-v2. Mocht de URL nu niet volgens één van de rules aangeroepen worden, dan wordt er standaard naar de ‘default-http-backend‘ gestuurd.