Installatie Nginx Ingress

Een Ingress Controller kan gebruikt worden om inkomende (http/https) aanvragen naar de juiste resources te sturen. Met behulp van een ConfigMap kan de aanvraag van 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

Je kunt de static-versie ‘pullen’ met git en dan het image-bestand voor de ARM-processor aanpassen naar:

quay.io/kubernetes-ingress-controller/nginx-ingress-controller-arm:0.16.2

Het mandatory-bestand zal alle controller aanmaken, inclusief service-accounts, bindings en RBAC. Apply nu de aangepaste mandatory.yaml file:

$ kubectl apply -f nginx-ingress-controller-mandatory.yml

Vervolgens dienen de services aangemaakt worden voor http en https. Een voorbeeldbestand vind je ook in de repo, in de directory ‘baremetal’ en wordt dan toegevoegd De inhoud van het services-bestand:

apiVersion: v1
kind: Service
metadata:
   name: ingress-nginx
   namespace: ingress-nginx
   labels:
     app.kubernetes.io/name: ingress-nginx
     app.kubernetes.io/part-of: ingress-nginx
spec:
  type: NodePort
  ports:
    - name: http
      port: 80
      nodePort: 30080
      targetPort: 80
      protocol: TCP
    - name: https
      port: 443
      nodePort: 30443
      targetPort: 443
      protocol: TCP
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx 

Apply deze service met het volgende commando:

$ kubectl apply -f nginx-ingress-controller-svc.yml

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 | grep ingress
 nginx-ingress-controller-68554bcf57-24rxh   1/1     Running   0          24h
 nginx-ingress-controller-68554bcf57-j6w7j   1/1     Running   0          24h
 nginx-ingress-controller-68554bcf57-vmqs8   1/1     Running   0          24h

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

$ kubectl scale deployment/nginx-ingress-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: extensions/v1beta1
kind: Ingress
metadata:
   name: test-ingress
   namespace: production
spec:
   rules:
   - host: hello-world.info 
     http:
       paths:
       - backend:
           serviceName: nginx-service
           servicePort: 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
NAME           HOSTS              ADDRESS   PORTS   AGE
test-ingress   hello-world.info             80      3d20h

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

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
   name: test-ingress
   namespace: production
spec:
   rules:
   - host: hello-world.info 
     http:
       paths:
       - path: /v1
         backend:
           serviceName: app-v1
           servicePort: 80
       - path: /v2
         backend:
           serviceName: app-v2
           servicePort: 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.