Een Kubernetes-Ingress regelt het routeren van HTTP- en HTTPS-verkeer van buiten je Kubernetes-cluster naar services binnen je cluster. Om gebruik te maken van een Ingress, gebruik je een 'Ingress Controller'. Hiervoor wordt meestal gebruik gemaakt van een reverse proxy web server.
In deze handleiding laten we aan de hand van een demo zien hoe je gebruik maakt van een Ingress binnen je Kubernetes-cluster met behulp van een Nginx Ingress Controller. Optioneel laten we zien hoe je je configuratie zodanig aanpast dat je het originele IP-adres van website bezoekers kunt zien in je logs.
Voor de stappen in deze handleiding heb je een domeinnaam nodig in hetzelfde TransIP-account als het account waarin je Kubernetes-cluster is opgenomen.
Stap 1
Optioneel: In deze handleiding richten we ons op het gebruik van een .yaml-object om de Nginx Ingress Controller aan te maken. Hoewel het verder buiten de scope van deze handleiding valt, is het echter ook mogelijk om de officiële Helm Chart te deployen:
helm upgrade --install ingress-nginx ingress-nginx --repo https://kubernetes.github.io/ingress-nginx --namespace ingress-nginx --create-namespace
De in stap 3 van dit artikel besproken wijzigingen zijn niet automatisch toegepast op deze Helm Chart. Mocht je die wijzigingen willen toevoegen, update dan eerst de Helm Chart zoals uitgelegd in deze handleiding.
Controleer in het TransIP-controlepaneel welke versie van Kubernetes je cluster gebruikt.
Controleer vervolgens op de Nginx Ingress Github-pagina wat de meest actuele versie van de Nginx Ingress Controller is die de Kubernetes-versie in het controlepaneel ondersteunt en noteer het versienummer.
Stap 2
Download het Nginx Ingress Controller .yaml-object https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.0/deploy/static/provider/cloud/deploy.yaml en vervang 1.8.0 indien nodig door het versienummer uit stap 1, bijvoorbeeld in Linux met het commando:
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.0/deploy/static/provider/cloud/deploy.yaml
Stap 3 - optioneel
Standaard laten je logbestanden het IP-adres zien van de TransIP-load balancer en niet die van de bezoeker/gebruiker. Om het IP-adres van de bezoeker/gebruiker te zien maak je voor je load balancer gebruik van het proxy-protocol. Hoe dit werkt hangt af van het type Ingress Controller dat je gebruikt, maar voor een Nginx Ingress Controller doe je dit met een paar kleine toevoegingen aan het zojuist gedownloade object.
Open het object, bijvoorbeeld:
nano deploy.yaml
Zoek naar het stukje code waarin je 'kind: ConfigMap' ziet en voeg daar twee regels aan toe (in bold in de code hieronder):
- use-proxy-protocol: "true"
-
proxy-real-ip-cidr: "89.41.168.0/26"
De optie proxy-real-ip-cidr is een beveiligingsmaatregel die je setup beschermt tegen IP-spoofing.
Het resultaat ziet er als volgt uit:
--- apiVersion: v1 data: allow-snippet-annotations: "true" use-proxy-protocol: "true" proxy-real-ip-cidr: "89.41.168.0/26" kind: ConfigMap metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx app.kubernetes.io/version: 1.8.0 name: ingress-nginx-controller namespace: ingress-nginx ---
In hetzelfde bestand is ook een service van het type LoadBalancer terug te vinden, in versie 1.8.0 vind je die direct onder de code hierboven. Voeg onder 'metadata:' een annotatie toe voor het gebruik van het proxy-protocol (in bold in de code hieronder). Voeg onder ‘Spec:’ eveneens de optie ‘externalTrafficPolicy: Local’ toe (indien nog niet aanwezig).
Om de code iets overzichtelijker te houden hebben we het grootste deel van de code onder 'spec:' afgekort tot ...
--- apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/transip-loadbalancer-protocol: "proxy" labels: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx app.kubernetes.io/version: 1.8.0 name: ingress-nginx-controller namespace: ingress-nginx spec: externalTrafficPolicy: Local ... type: LoadBalancer ---
Sla je wijzigingen op en sluit het bestand (ctrl + x > y > enter).
Stap 4
Pas nu het object toe op je cluster om de Nginx Ingress Controller te installeren. Er wordt automatisch een namespace aangemaakt met de naam ingress-nginx (als die niet al bestaat).
kubectl apply -f deploy.yaml
Je krijgt een bevestiging te zien van alle componenten die nu worden aangemaakt:
namespace/ingress-nginx created serviceaccount/ingress-nginx created serviceaccount/ingress-nginx-admission created role.rbac.authorization.k8s.io/ingress-nginx created role.rbac.authorization.k8s.io/ingress-nginx-admission created clusterrole.rbac.authorization.k8s.io/ingress-nginx created clusterrolerole.rbac.authorization.k8s.io/ingress-nginx-admission created rolebinding.rbac.authorization.k8s.io/ingress-nginx created rolebinding.authorization.k8s.io/ingress-nginx-admission created clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created clusterrolebinding.authorization.k8s.io/ingress-nginx-admission created configmap/ingress-nginx-controller created service/ingress-nginx-controller created service/ingress-nginx-controller-admission created deployment.apps/ingress-nginx-controller created job.batch/ingress-nginx-admission-create created job.batch/ingress-nginx-admission-patch created ingressclasss.networking.k8s.io/nginx created validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created
Update je het object in de toekomst, bijvoorbeeld naar een nieuwe versie van de Nginx-Controller? Gebruik dan opnieuw het commando kubectl apply -f <bestandsnaam> om de wijzigingen door te voeren. Waar nodig worden de benodigde componenten dan automatisch opnieuw aangemaakt door Kubernetes. Vergeet niet stap 3 te herhalen indien je die nu ook doorlopen hebt.
Stap 5
Er is o.a. een service aangemaakt van het type LoadBalancer. Vraag het publieke IP-adres op met het commando:
kubectl get service ingress-nginx-controller --namespace=ingress-nginx
De output ziet er uit zoals hieronder. Het kan een paar minuten duren voor je onder 'EXTERNAL-IP' het adres terugziet.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx-controller LoadBalancer 10.84.210.96 86-105-246-98.haip.transip.net 80:32643/TCP,443:32118/TCP 24h
In het TransIP-controlepaneel vind je bij je cluster onder het tabblad 'Load Balancers' het IPv4- en IPv6-adres terug van je load balancer.
Maak nu voor een domein in je TransIP-account een DNS-record aan voor het adres van de load balancer. Je kunt hiervoor een A- en AAAA-record aanmaken (het AAAA-record is optioneel), of een CNAME-record als volgt:
Hier maken we gebruik van het subdomein 'ingress' maar je bent vrij om dit naar wens aan te passen. Het is echter belangrijk dat je een (sub)domein verwijst naar de load balancer omdat voor het aanmaken van een Ingress resource (de routing regel) dit een vereiste is en het gebruik van een IP-adres niet werkt.
Stap 6
Maak een simpele demo web server en bijbehorende service aan:
kubectl create deployment demo --image=httpd --port=80
kubectl expose deployment demo
Uiteraard ben je ook vrij om in plaats van deze demo een eigen use case hier in te zetten, bijvoorbeeld door een eigen .yaml-object te gebruiken met daarin de definitie van je deployment, eventuele services etc.
Stap 7
Maak nu een Ingress Resource aan en vervang '<je(sub)domein>' door het domein dat je in stap 5 gebruikte, bijvoorbeeld ingress.voorbeeld.nl/=demo:80.
kubectl create ingress demo --class=nginx --rule <je(sub)domein>/=demo:80
Ga nu in een internet browser naar het betreffende subdomein, bijvoorbeeld ingress.voorbeeld.nl. Je krijgt dan de melding 'It works!' te zien.
Optioneel: Heb je stap 3 gevolgd? Dan wil je ongetwijfeld controleren of je inderdaad jouw IP-adres in je logs terugziet. Dit kun je controleren door eerst de naam van je Nginx Controller-pod te achterhalen met het commando:
kubectl get pods -n ingress-nginx
De toevoeging -n ingress-nginx geeft aan dat je pods in de namespace ingress-nginx wil opvragen. In plaats van -n ingress-nginx kun je ook --name-space=ingress-nginx gebruiken.
De output ziet er als volgt uit:
NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-82557 0/1 Completed 0 2h
ingress-nginx-admission-patch-mflqc 0/1 Completed 0 2h
ingress-nginx-controller-7d98bbddbd-svc5j 1/1 Running 0 2h
Kopieer de naam van de ingress-nginx-controller (hier ingress-nginx-controller-7d98bbddbd-svc5j) en voer nu het volgende commando uit waarbij je ingress-nginx-controller-7d98bbddbd-svc5j vervangt door de naam van jouw controller:
kubectl logs ingress-nginx-controller-7d98bbddbd-svc5j -n ingress-nginx --tail=10
De toevoeging --tail=10 zorgt ervoor dat je de laatste 10 regels uit de logs te zien krijgt. Mocht je het gehele logbestand willen zien, laat dan deze toevoeging weg.
Dit brengt ons bij het eind van deze handleiding over het configureren van een Nginx Ingress Controller in Kubernetes. In een toekomstige update/nieuw artikel gaan we dieper in op het routeren van verkeer naar verschillende services met behulp van een Nginx Ingress Controller.