K3s Traefik

De standaard installatie van K3s installeert een aantal standaard componenten en één daarvan is de Traefik Ingress Controller.

Het manifest bestand voor Traefik is te vinden in /var/lib/rancher/k3s/server/manifests/traefik.yaml en wordt aangemaakt iedere keer als de K3s server wordt herstart.

Een voordeel van deze standaard installatie van Traefik als load-balancer is dat Kubernetes in een ‘on-premise‘ omgeving geen load-balancer heeft, in tegenstelling tot Kubernetes in een cloud-provider omgeving. Traefik voorziet hierin en maakt het mogelijk om in de ‘on-premise’ omgeving toch een load-balancer service te gebruiken.

De manifest file voor Traefik zorgt ervoor dat een Daemonset wordt aangemaakt die pods creëert op elke node. Deze pods fungeren dan als proxy voor services die aangeroepen worden.

$ kubectl get pods -n kube-system -l app=svclb-traefik
NAME                READY STATUS  RESTARTS AGE
svclb-traefik-4pp5b 2/2   Running 0        52d
svclb-traefik-4zdsl 2/2   Running 0        52d
svclb-traefik-9wqz9 2/2   Running 0        52d

Indien de node een extern IP-adres heeft dan gebruikt de Traefik-service dit IP-adres.

$ kubectl get svc traefik -n kube-system
NAME    TYPE         CLUSTER-IP   EXTERNAL-IP                                  PORT(S)                    AGE
traefik LoadBalancer 10.43.14.215 192.168.178.50,192.168.178.51,192.168.178.52 80:32606/TCP,443:32006/TCP 52d

Voorbeeld

Er is een service voor een simple-nginx pod en deze dient nu via een Ingress toegankelijk gemaakt te worden voor de buitenwereld.

$ kubectl get svc simple-nginx -n simple-nginx
NAME         TYPE      CLUSTER-IP    EXTERNAL-IP PORT(S)   AGE
simple-nginx ClusterIP 10.43.122.198             80:31426/TCP 52d

Zoals je ziet is het type service hier ‘ClusterIP’ en niet ‘LoadBalancer’. Echter, op het moment dat een Ingress aangemaakt wordt:

$ kubectl get ingress simple-nginx-ingress -n simple-nginx -o yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: simple-nginx-ingress
  namespace: simple-nginx
spec:
  rules:
  - host: my.simple-nginx.nl 
    http: 
      paths: 
        backend:
          service:
            name: simple-nginx
            port:
              number: 80
        path: /
        pathType: ImplementationSpecific

zal de nginx-ingress controller de ingress ‘oppakken’ en het verkeer proxy’en waardoor de simple-nginx bereikt kan worden.

$ kubectl -n simple-nginx get ingress simple-nginx-ingress
NAME                 CLASS  HOSTS              ADDRESS                                      PORTS  AGE
simple-nginx-ingress <none> my.simple-nginx.nl 192.168.178.50,192.168.178.51,192.168.178.52 80     36d