Winkelwagen

/ .nl-domeinnaam

Jouw .nl voor slechts € 0,49.

Domeinnaam checken
E-mail

/ Security

/ Hostingpakket keuzehulp

Weet je niet zeker welk hostingpakket de beste
keus is voor jouw website? Met onze keuzehulp
kom je er wel uit.

Direct naar de keuzehulp

/ OpenStack

/ Probeer Public Cloud uit

Gratis 1 maand aan de slag met Public Cloud?

Vraag proefperiode aan

/ TransIP Blog

Website templates kiezen voor jouw website

Lees de blogpost
Knowledge Base

    Sorry, we konden geen resultaten vinden voor jouw zoekopdracht.

    Traefik installeren en gebruiken met Kubernetes

    zou je deze tekst naar het Engels kunnen vertalen en daarbij de code en URLs intact kunnen laten? merci :) ```

    Helm Charts worden regelmatig geüpdated waardoor namen en posities van variabelen kunnen veranderen. Hierdoor kunnen wij niet garanderen dat elk artikel altijd volledig up to date is. Mocht je merken dat bepaalde informatie niet meer klopt, dan vernemen we dat graag van je. 

    Officiële Traefik Helm-repository

     

    Traefik is een populaire open-source reverse proxy en load balancer, ontworpen voor microservices en containerized applicaties. Traefik kan automatisch de services ontdekken die in een Kubernetes-cluster draaien en het verkeer naar deze services routeren met behulp van verschillende load balancing-algoritmes.

    Traefik opereert voor andere services binnen je cluster. Met Traefik kun je meerdere applicaties op een Kubernetes-cluster hosten waarvan het verkeer verloopt via Traefik. Traefik kan dan als één enkele loadbalancer functioneren voor al deze applicaties en bovendien Let's Encrypt SSL-certificaten verstrekken.

    In deze handleiding laten we zien hoe je Traefik installeert en gebruikt. Hierbij maken we gebruik van een eigen (sub)domeinnaam (optioneel) om Traefik aan te koppelen en beveiligen die met een SSL-certificaat. Om in te loggen op het Traefik-dashboard stellen we een gebruikersnaam- en wachtwoord in.

    Voor deze handleiding heb je nodig:

     

     

    Traefik installeren

     

    Stap 1

    Voeg de officiele Traefik repository toe en update je Helm-repositories om die te kunnen gebruiken:

    helm repo add traefik https://helm.traefik.io/traefik
    helm repo update

     

    Stap 2

    Traefik kan Let's Encrypt certificaten genereren voor applicaties die via Traefik communiceren. In deze handleiding gaan we ervan uit dat je dit ook voor jouw use case wil gebruiken. Hiervoor gebruik je een acme dns challenge provider. Via onze API ondersteunen wij deze optie. Let wel dat de provider die je kiest deze functionaliteit moet ondersteunen en dat de domeinen die je gebruikt zijn geregistreerd bij die provider in het account dat je voor deze handleiding gebruikt.

    Maak een directory aan waarin je je TransIP API key gaat opslaan, bijvoorbeeld:

    mkdir transip

    Maak vervolgens een bestand in de zojuist aangemaakte directory met daarin een private key van jouw account voor de TransIP API, bijvoorbeeld:

    cat << EOF > transip/transip.key
    -----BEGIN PRIVATE KEY-----
    MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQDKoaYJtbVnJw58
    PYGH8WIJ7ZjWd2lke0IbMV+dNGs=
    -----END PRIVATE KEY-----
    EOF

    In dit voorbeeld is maar een klein fragment van een private key opgenomen. Jouw private key zal een stuk langer zijn.


     

    Stap 3

    Maak een namespace aan voor Traefik binnen je cluster:

    kubectl create ns traefik

     

    Stap 4

    Genereer een secret op basis van jouw API Private Key die door Traefik gebruikt kan worden om met de TransIP API te communiceren. Vervang hier eventueel de volgende gegevens:

    • -n traefik: Gebruik de naam van de namespace die je in stap 3 hebt aangemaakt.
    • transip/transip.key: Verander naar de directory en bestandsnaam die je in stap 2 hebt aangemaakt.
    kubectl create -n traefik secret generic transip-key --from-file transip/transip.key

     

    Stap 5

    Over secrets gesproken: als je Traefik configureert om via het publieke internet beschikbaar te zijn, zit daar standaard geen wachtwoord en/of gebruikersnaam op. Hiervoor maken we nog een secret aan met daarin een gebruikersnaam en wachtwoord om in te loggen in het Traefik-dashboard. 

    Genereer met htpasswd een gebruikersnaam en wachtwoord:

    htpasswd -nb <gebruikersnaam> <wachtwoord> >> htpasswd.txt

    De inhoud van het htpasswd.txt-bestand ziet er ongeveer als volgt uit:

    demogebruiker:$2a$13$2QBmxHS5a1hWU9aeyJ.DPNWRFjXcNRNTjcu56QTLhZS.y

    Gebruik je Windows om deze stappen te doorlopen? Gebruik dan onze htpasswd tool en genereer een htpasswd gebruikersnaam en wachtwoord. Sla de output op in een bestand in de folder waarin je de commando's in deze handleiding doorloopt, bijvoorbeeld c:\Users\Administrator\kubernetes\htpasswd.txt

    Genereer vervolgens de secret op basis van de inhoud van het zojuist aangemaakte bestand:

    kubectl create secret generic traefik-dashboard-basicauth --from-file=users=htpasswd.txt -n traefik

     

    Stap 6

    Voor de installatie van Traefik gebruik je in de volgende stap de officiële Helm Chart. In een aanvullende .yaml-bestand maak je een paar aanpassingen; maak hiervoor een .yaml bestand aan, bijvoorbeeld:

    nano traefik.yaml

    Geef het bestand de inhoud hieronder, waarbij je een aantal waardes aanpast:

    • example@transip.nl: Verander naar jouw e-mailadres
    • jouwaccount: Verander jouwaccount naar de naam van jouw TransIP-account.
    • /transip/transip.key: Verander (indien nodig) naar de directory en bestandsnaam die je in stap 2 hebt aangemaakt.
    • traefik.transip.nl: Verander naar het (sub)domein waar je Traefik aan wil koppelen.
    deployment:
      initContainers:
        - name: volume-permissions
          image: busybox:latest
          command: ["sh", "-c", "touch /data/acme.json; chmod -v 600 /data/acme.json"]
          volumeMounts:
          - mountPath: /data
            name: data
    podSecurityContext:
      fsGroup: 65532
      fsGroupChangePolicy: "OnRootMismatch"
    additionalArguments:
      - "--certificatesresolvers.myresolver.acme.email=example@transip.nl"
      - "--certificatesresolvers.myresolver.acme.dnschallenge.provider=transip"
      - "--certificatesresolvers.myresolver.acme.dnschallenge.delaybeforecheck=120"
      - "--certificatesresolvers.myresolver.acme.storage=/data/acme.json"
      - "--providers.kubernetescrd.namespaces="
    env:
      - name: TRANSIP_ACCOUNT_NAME
        value: jouwaccount
      - name: TRANSIP_PRIVATE_KEY_PATH
        value: /transip/transip.key
    volumes:
      - name: transip-key
        mountPath: "/transip"
        type: secret
    persistence:
      enabled: true
      size: 128Mi
    ports:
      websecure:
        tls:
          enabled: true
        expose:
          default: true
        exposedPort: 443
    ingressRoute:
      dashboard:
        enabled: true
        entryPoints:
          - websecure
        matchRule: Host(`traefik.transip.nl`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))
        tls:
          certResolver: myresolver
        middlewares:
          - name: "dashboard-auth"
            namespace: "traefik"
    extraObjects:
      - apiVersion: traefik.io/v1alpha1
        kind: Middleware
        metadata:
          name: dashboard-auth
          namespace: traefik
        spec:
          basicAuth:
            secret: "traefik-dashboard-basicauth"
    podAnnotations:
      prometheus.io/port: "8082"
      prometheus.io/scrape: "true"
    providers:
      kubernetesIngress:
        publishedService:
          enabled: true
    priorityClassName: "system-cluster-critical"
    image:
      registry: docker.io
      repository: traefik
    tolerations:
      - key: "CriticalAddonsOnly"
        operator: "Exists"
      - key: "node-role.kubernetes.io/control-plane"
        operator: "Exists"
        effect: "NoSchedule"
      - key: "node-role.kubernetes.io/master"
        operator: "Exists"
        effect: "NoSchedule"

    Toelichting op code

    Voor een volledig overzicht van de beschikbare opties, zie de officiële Helm-chart. In a nutshell komen de verschillende onderdelen op het volgende neer:

    • deployment.initcontainers: Traefik is out-of-the-box geconfigureerd om geen rechten te hebben om SSL-certificaten weg te schrijven in het standaard daarvoor bedoelde bestand /data/acme.json. Dit onderdeel zorgt ervoor dat Traefik lees- en schrijfrechten krijgt door met een chmod-commando de rechten aan te passen.
    • podsecuritycontext: Zorgt ervoor dat ieder volume de juiste eigenaar heeft (65532)
    • additionalArguments: De opgegeven waardes geven op naar welk mailadres meldingen m.b.t. het genereren van SSL-certificaten worden gestuurd, dat je TransIP's systemen (via onze API) gebruikt om Let's Encrypt-certificaten te generereren, hoe vaak ze vernieuwd worden, waar ze opgeslagen worden, en dat Traefik alle namespaces in de gaten houdt en kan gebruiken.
    • env: Informatie met betrekking tot jouw TransIP API-gegevens (uit stap 2 en 4).
    • volumes: Hier configureer je aanvullende volumes (een soort van schijf); in dit geval het volume /transip om je API-gegevens in op te slaan.
    • persistence: Controleert of je het volume dat gebruikt wordt om de SSL-certificaten in op te slaan (/data) bewaard als je je Traefik-installatie verwijdert. In dit .yaml-bestand is deze optie ingeschakeld. 
    • ports: De configuratie mbt het gebruik van Traefik via SSL (of het gebruikt kan worden, op welke poort, etc).
    • ingressRoute: Een IngressRoute zorgt ervoor dat binnenkomende netwerkverzoeken bij de juiste services terecht komen. 
    • extraObjects: Voeg aanvullende onderdelen toe aan je Traefik setup. In deze setup voeg je een Middleware toe die ervoor zorgt dat als je in je browser naar het Traefik-dashboard gaat je een vraag om een wachtwoord krijgt zoals vastgelegd in de traefik-dashboard-basicauth secret (die je in stap 5 hebt aangemaakt).
    • podAnnotations: aanvullende labels om aan de Traefik-pod te koppelen, in dit geval om het gebruik van Prometheus i.c.m. Traefik mogelijk te maken.
    • providers: Schakel de optie in voor Traefik om Kubernetes Ingress resources te ontdekken. Standaard staat deze optie aan in de officiële Helm Chart. We hebben hem hier toch opgenomen, mocht Traefik op een latere datum besluiten deze optie standaard uit te zetten.
    • priorityClassName: Stelt een priority class in voor Traefik. Stel dat Kubernetes om wat voor reden dan ook moet kiezen welke Pods het voorrang geeft bij het aanmaken daarvan, dan krijgt een Pod met priority voorrang.
    • image: Welke image gebruikt wordt voor het aanmaken van de Traefik-deployment. 
    • tolerations: Bepaalde pods mogen niet op een node met een taint worden geplaatst (i.e. gescheduled), tenzij de pod een 'toleration' heeft voor die specifieke taint, zie ons artikel over taints & tolerations.
     
     

     

    Stap 7

    Installeer de Traefik Helm Chart met het commando hieronder.

    helm install -f traefik.yaml traefik traefik/traefik -n traefik
    • helm install: Installeert de Helm Chart.
    • -f traefik.yaml: Het bestand uit stap 5 waarmee we de installatie aanpassen.
    • traefik: De naam van de Helm 'release', te controleren met het commando 'helm list'.
    • traefik/traefik: Respectievelijk de naam van de repository en te installeren Helm Chart.
    • -n traefik: De namespace waarin de Helm release wordt geïnstalleerd, zie stap 3.

    Je krijgt nu een bevestiging te zien die er ongeveer als volgt uit ziet:

    NAME: traefik
    LAST DEPLOYED: Wed Feb 12 09:22:05 2025
    NAMESPACE: traefik
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    NOTES:
    traefik with docker.io/traefik:v3.3.3 has been deployed successfully on traefik namespace !
    🚨 When enabling persistence for certificates, permissions on acme.json can be
    lost when Traefik restarts. You can ensure correct permissions with an
    initContainer. See https://github.com/traefik/traefik-helm-chart/blob/master/EXAMPLES.md#use-traefik-native-lets-encrypt-integration-without-cert-manager

    De waarschuwing kun je negeren: dit issue heb je getackeld in het begin van het traefik.yaml-bestand dat je in de vorige stap hebt aangemaakt. 

    Traefik is nu succesvol aangemaakt, maar.. hoe kom je nu verder? Dat brengt ons nu eerst bij de Traefik-dashboard, zie de volgende paragraaf.


     

    De Traefik-dashboard

     

    Traefik komt met een webinterface waarmee je inzage krijgt in de status van je Kubernetes-cluster en het verkeer dat door je cluster verwerkt wordt. Het toont informatie over de routers en services die gebruikt worden om verkeer te verwerken en de gebruikte loadbalancing algoritmes. Het dashboard geeft je ook de mogelijkheid om logs en metrics te bekijken die door Traefik gegenereerd worden. Het dashboard is dus een handige tool voor het monitoren en troubleshooten van Traefik.

     

    Stap1

    Om gebruik te maken van het Traefik dashboard achterhaal je eerst het externe IP-adres van je Traefik-LoadBalancer (automatisch aangemaakt):

    kubectl get svc -n traefik

    In de output zie je onder ‘external-IP’ een adres dat lijkt op: 86-105-245-108.haip.transip.net. Noteer de getallen en zet de streepjes om in punten, oftewel: 86.105.245.108. 


     

    Stap 2

    Wil je Traefik aan een (sub)domein koppelen? Maak dan eerst een A-record aan voor je domeinnaam, zie deze handleiding, bijvoorbeeld met de naam ‘traefik’ en geef die als waarde het IP-adres uit de vorige stap.


     

    Stap 3

    Aan het begin van dit artikel hebben we je verteld dat je de TransIP-api gebruikt en daar een key voor nodig hebt. Bij het aanmaken van de API-key heb je een optie gekregen om de key enkel te kunnen gebruiken voor whitelisted IP-adressen. Indien je hiervoor gekozen hebt, voeg dan ook het IP-adres uit stap 1 toe aan het IP-adres aan je API-whitelist, zie nogmaals onze API-handleiding

     

    Het kan even duren voor de DNS- en API-wijzigingen zijn opgepikt. Wanneer deze verwerkt zijn, kunt je  de Traefik dashboard bekijken in een browser vanaf je subdomein, bijvoorbeeld https://traefik.voorbeeld.nl/dashboard/ of anders rechtstreeks via het IP-adres op https://<ip-adres>:/dashboard/. Wanneer om een gebruikersnaam en wachtwoord wordt gevraagd, gebruik je die uit stap 5 van het vorige onderdeel.


     

    Je configuratie aanpassen

     

    Het is wenselijk om het publieke IP-adres van je load balancer te behouden wanneer je wijzigingen doorvoert op de configuratie van Traefik. Verwijder daarom bij wijzigingen waar mogelijk niet je gehele Traefik-installatie, maar voer eventuele wijzigingen door in traefik.yaml en update je Helm-installatie met:

    helm upgrade -f traefik.yaml traefik traefik/traefik -n traefik

     

    Voorbeeld van het gebruik van Traefik

     

    Je kunt nu Traefik gebruiken voor andere deployments en bijvoorbeeld automatisch SSL-certificaten laten genereren. Hieronder laten we de inhoud zien van drie .yaml-bestanden als voorbeeld van hoe een dergelijke setup er uit kan zien. Let wel dat je deze niet één op één overneemt en wel de configuratie aanpast waar nodig voor jouw use case (zoals bijvoorbeeld het domein nginx.voorbeeld.nl)

     

    Nginx-deployment en service:

    In het voorbeeld hieronder configureer je een eenvoudige Nginx-setup die blootgesteld wordt op pod 80 (zie de middleware iets verderop).

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
      namespace: nginx
      labels:
        app: nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
            - name: nginx
              image: nginx:stable-alpine
              ports:
                - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      namespace: nginx
    spec:
      selector:
        app: nginx
      ports:
        - name: http
          port: 80
          targetPort: 80

     

    Middleware:

    Traefik ondersteunt een zogeheten ‘redirectScheme’ waarmee je eenvoudig verkeer naar https kunt doorsturen. 

    apiVersion: traefik.io/v1alpha1
    kind: Middleware
    metadata:
      name: redirect-to-https
      namespace: nginx
    spec:
      redirectScheme:
        scheme: https
        permanent: true

     

    IngressRoute:

    Je hebt twee IngressRoutes nodig in deze demo setup. De eerste route luistert op de websecure entry point (oftewel HTTPS-verkeer) en gebruikt de ACME-resolver met de naam ‘myresolver’ (uit het eerste deel van deze handleiding) om een certificaat te verkrijgen (indien nodig) en verkeer door te sturen naar de Nginx-service.

    apiVersion: traefik.io/v1alpha1
    kind: IngressRoute
    metadata:
      name: nginx-secure
      namespace: nginx
    spec:
      entryPoints:
        - websecure
      routes:
        - match: Host(`nginx.voorbeeld.nl`)
          kind: Rule
          services:
            - name: nginx
              port: 80
      tls:
        certResolver: myresolver

    De tweede route luistert op zijn beurt naar verkeer op poort 80 en stuurt die door naar HTTPS via de eerdere redirect-to-https middleware. 

    apiVersion: traefik.io/v1alpha1
    kind: IngressRoute
    metadata:
      name: nginx-redirect
      namespace: nginx
    spec:
      entryPoints:
        - web
      routes:
        - match: Host(`nginx.voorbeeld.nl`)
          kind: Rule
          middlewares:
            - name: redirect-to-https
          services:
            - name: nginx
              port: 80

     

     Daarmee zijn we aan het eind gekomen van onze handleiding over de installatie en het gebruik van Traefik in Kubernetes.

    ```

    Kom je er niet uit?

    Ontvang persoonlijke hulp van onze supporters

    Neem contact op