Hulpartikel overzicht

Hulpartikel

Een Nginx Ingress Controller configureren in Kubernetes

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.

cp k8s version

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: "85.10.123.123/32,85.10.123.124/32,85.10.123.125/32"
    De optie proxy-real-ip-cidr is een beveiligingsmaatregel die je setup beschermt tegen IP-spoofing.
    Vervang hier de IP-adressen door die van je Load Balancer. Let op dat het toevoegen van een IP-range verplicht is (/32 voor individuele IP's) en je geen spaties toevoegt na de komma.
    Je vindt de IP-adressen van je load balancer terug in het TransIP-controlepaneel. Navigeer naar je cluster, vervolgens het tabblad 'Load Balancers' > klik op de naam van de betreffende load balancer.
    cp k8s loadbalancer ips

Het resultaat ziet er als volgt uit:

---
apiVersion: v1
data:
  allow-snippet-annotations: "true"
  use-proxy-protocol: "true"proxy-real-ip-cidr: "85.10.123.123/32,85.10.123.124/32,85.10.123.125/32"
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).

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:

cp k8s loadbalancer dns

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.

 

Heb je ook een goed idee?

Stuur jouw idee in! Met genoeg stemmen komt jouw idee op onze wishlist!

Heeft dit artikel je geholpen?

Maak een account aan of log in om een beoordeling achter te laten.

Reacties

Maak een account aan of log in om een reactie te plaatsen.

Kom je er niet uit?

Ontvang persoonlijke hulp van onze supporters

Neem contact op