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.