Winkelwagen

    Sorry, we konden geen resultaten vinden voor jouw zoekopdracht.

    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.

     

    Kom je er niet uit?

    Ontvang persoonlijke hulp van onze supporters

    Neem contact op