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.