Nginx Ingress

Kubernetes Ingress heeft als doel om inkomend verkeer vanaf Internet te routeren naar services gebaseerd op de host en/of het path. Je kunt Ingress dus zien als een gateway (of LoadBalancer) naar applicaties.

Een ‘pod‘ is een verzameling containers die via een ‘service‘ aangeroepen kan worden door gebruik te maken van ‘selectors‘. De ‘Ingress Controller‘ bevat regels die het verkeer naar de juiste ‘service‘ stuurt en zodoende bij de juiste applicatie terecht komt.

Werkend met minikube geeft deze de mogelijkheid om de Ingress addon te gebruiken met:

$ minikube addons enable ingress

Zodra deze addon gereed is zal de Ingress controller te zien zijn als een pod in de kube-system namespace:

$ kubectl get pods -n kube-system

Het resultaat:

NAME                                        READY   STATUS    RESTARTS   AGE
nginx-ingress-controller-7b465d9cf8-5n5j7   1/1     Running   0          2d19h

Nu worden de deployments gemaakt en in het geval van minikube worden deze exposed middels een NodePort. Hierna kunnen de Ingress regels aangemaakt worden.

Bedenk dat in de ‘rules‘ een ‘host‘ aangegeven kan worden, gevolgd door een ‘path‘ en dat deze gebruikt dienen te worden in je browser (of curl command). Zet daarom deze hostname in je /etc/hosts bestand of in je DNS!

Voorbeeld met een simpele hello-app:

$ kubectl run web --image=gcr.io/google-samples/hello-app:1.0 --port=8080
$ kubectl expose deployment web --target-port=8080 --type=NodePort
$ minikube service web --url

Bovenstaande commando’s installeren een web-aaplicatie in een pod en maken deze benaderbaar via een NodePort. De url van de web-service wordt getoond en met ‘curl’ (of via een browser) kan de response verkregen worden:

$ curl http://192.168.99.112:31394
Hello, world!
Version: 1.0.0
Hostname: web-6d4657545d-p967j

We gaan nu een Ingress resource maken die verkeer naar de Ingress service stuurt aan de hand van een hostname genaamd hello-world.info. Maak een bestand genaamd example-ingress.yml met de volgende inhoud:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
   name: example-ingress
   annotations:
     nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: hello-world.info
    http:
      paths:
      - path: /*
        backend:
          serviceName: web
          servicePort: 8080 

Gebruik nu dit bestand om de resource aan te maken:

$ kubectl apply -f example-ingress.yml

Vraag nu het IP adres op van de ingress resource met

$ kubectl get ingress

of, in het geval van een lokale minikube configuratie:

$ minikube ip

Zet dit IP adres nu in je /etc/hosts file met de verwijzing naar hello-world.info. Hierna kan de volgende URL gebruikt worden om via de Ingress resource bij de web-service te komen:

http://hello-world.info

Voor meer voorbeelden, zie de Google pagina: https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/