Ingress und Load Balancer in Kubernetes: Traefik und MetalLB

Hallo zusammen! Nachdem wir uns im letzten Beitrag mit der Verwaltung von DNS und Zertifikaten beschäftigt haben, widmen wir uns heute dem Thema Ingress und Load Balancer in unserem Kubernetes-Cluster. In meinem Setup habe ich die von k3s mitgelieferten Komponenten deaktiviert und stattdessen Traefik und MetalLB mit FluxCD installiert und konfiguriert.

 The Yan'an East Road Interchange in Shanghai, China. North is on the right side of photo.

Warum Traefik und MetalLB?

Traefik ist ein leistungsfähiger und flexibler Ingress-Controller, der einfach zu konfigurieren ist und eine Vielzahl von Funktionen bietet, wie z.B. automatische Zertifikatserneuerung mit Let’s Encrypt, Unterstützung für verschiedene Backends und eine benutzerfreundliche Web-UI.

MetalLB ist ein Load Balancer für Bare-Metal-Kubernetes-Cluster. Es bietet Load-Balancing-Funktionen in Umgebungen, in denen die Cloud-Provider-Load-Balancer nicht verfügbar sind.

Warum ich die von k3s mitgelieferten Komponenten nicht verwende

Traefik

Ich habe mich für eine eigene Installation von Traefik entschieden, weil ich die Möglichkeit haben möchte, die Konfiguration anzupassen. Dies beinhaltet:

  • Portkonfigurationen: Anpassung der Ports, auf denen Traefik lauscht.
  • Metriken: Aktivierung und Konfiguration von Metriken für Monitoring und Analyse.
  • Dashboard: Zugriff und Anpassung des Traefik-Dashboards für eine bessere Übersicht und Verwaltung.

MetalLB

Der von k3s mitgelieferte Load Balancer wird nur empfohlen, wenn man eine einzelne Worker-Node hat. Da ich mehrere Nodes in meinem Cluster betreibe, ist MetalLB die bessere Wahl. MetalLB unterstützt mehrere Nodes und bietet eine stabile und skalierbare Lösung für das Load Balancing in einem Bare-Metal-Cluster.

ACME Client

Ich nutze nicht den ACME Client aus Traefik. Stattdessen verwende ich den Cert-Manager, wie im letzten Blogpost beschrieben, um die Verwaltung und Erneuerung der Zertifikate zu übernehmen. Dies ermöglicht eine flexiblere und robustere Handhabung der SSL-Zertifikate.

Installation und Konfiguration mit FluxCD

Deaktivierung der k3s-Komponenten

Zunächst müssen wir sicherstellen, dass die standardmäßigen k3s-Komponenten deaktiviert sind. Dies geschieht durch das Bearbeiten der k3s-Installationsoptionen. Ich verwalte meine k3s-Installation mit ansible und habe in der Konfiguration beide Services deaktiviert:

    server_config_yaml:  |
      disable:
        - traefik
        - servicelb

Installation von Traefik

Einrichten von Traefik mit FluxCD: Füge die Traefik-Konfiguration zu deinem Git-Repository hinzu:

apiVersion: helm.toolkit.fluxcd.io/v2beta1
kind: HelmRelease
metadata:
  name: traefik
  namespace: traefik
spec:
  chart:
    spec:
      chart: traefik
      version: 28.3.0
      sourceRef:
        kind: HelmRepository
        name: traefik
        namespace: default
  interval: 15m
  timeout: 5m
  releaseName: traefik
  values:
    ... # add values from traefik's values.yaml here
        # important values to configure are:
    web:
      port: 8000
      expose:
        default: true
      exposedPort: 80
      protocol: TCP
    websecure:
      port: 8443
      expose:
        default: true
      exposedPort: 443
      protocol: TCP

Diese Konfiguration installiert Traefik und stellt es so ein, dass es auf Port 80 und 443 lauscht.

Installation von MetalLB

Einrichten von MetalLB mit FluxCD: Füge die MetalLB-Konfiguration zu deinem Git-Repository (Namespace, Helmrepo und Kustomization lasse ich hier weg) hinzu:

apiVersion: helm.toolkit.fluxcd.io/v2beta1
kind: HelmRelease
metadata:
  name: metallb
  namespace: metallb-system
spec:
  chart:
    spec:
      chart: metallb
      version: 0.14.5
      sourceRef:
        kind: HelmRepository
        name: metallb
        namespace: default 
  interval: 15m
  timeout: 5m
  releaseName: metallb  
  values: # paste icontents of upstream values.yaml below, indented 4 spaces

Änderungen an den Standardwerten der values.yaml habe ich nicht vorgenommen.

Zusätzlich musst du eine Konfigurationsdatei für MetalLB erstellen, um die IP-Bereiche festzulegen, die für Load Balancer verwendet werden sollen:

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: metallb-pool
  namespace: metallb-system
spec:
  addresses:
  - 10.42.0.0/25
  - 2a00:c42:6543:5678::/56

Diese Konfiguration stellt sicher, dass MetalLB IP-Adressen aus dem angegebenen Bereich verwendet.

Verwendung von MetalLB für verschiedene Anwendungen

Mit MetalLB kannst du nicht nur Traefik als LoadBalancer konfigurieren, sondern auch andere Dienste. In meinem Setup nutze ich MetalLB unter anderem für Mosquitto, einen MQTT-Broker, damit alle Komponenten in meinem Heimnetzwerk damit kommunizieren können. Hier ist ein Beispiel für die Konfiguration eines LoadBalancer-Services für Mosquitto:

<code>
</code>apiVersion: v1
kind: Service
metadata:
  name: mosquitto
  namespace: mosquitto
  annotations:
    metallb.universe.tf/address-pool: metallb-pool
    metallb.universe.tf/loadBalancerIPs: "10.64.32.129,2a01:c23:6453:5800::2"
spec:
  type: LoadBalancer
  selector:
    app: mosquitto
  ipFamilyPolicy: PreferDualStack
  ipFamilies:
    - IPv4
    - IPv6
  ports:
    - protocol: TCP
      port: 1883
      targetPort: 1883Code-Sprache: HTML, XML (xml)

Mit den Annotationen für metallb können im Service IP-Adressen festgelegt werden. Je nach Setup kann das sinnvoll sein. Wer neben IPv6 auch IPv4 verwenden möchte, muss Dualstack konfigurieren.

Beispielkonfiguration für einen Ingress

Nun, da Traefik und MetalLB installiert und konfiguriert sind, können wir ein Beispiel für eine Ingress-Ressource geben, die einen HTTP-Dienst verfügbar macht:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  namespace: example
  annotations:
    external-dns.alpha.kubernetes.io/hostname: your-domain.xy.
    external-dns.alpha.kubernetes.io/target: target.your-domain.xy.
spec:
  tls:
  - hosts:
    - your-domain.xy
    secretName: your-domain-xy-tls
  rules:
  - host: your-domain.xy
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: example-service
            port:
              number: 80

Fazit

Mit der Integration von Traefik als Ingress-Controller und MetalLB als Load Balancer haben wir eine flexible und leistungsstarke Lösung für die Verwaltung des eingehenden Traffics in unserem Kubernetes-Cluster geschaffen. Durch die Verwendung von FluxCD zur Installation und Konfiguration dieser Komponenten bleibt unsere Infrastruktur konsistent und leicht zu verwalten. Zudem zeigt die Verwendung von MetalLB für andere Dienste wie Mosquitto die Vielseitigkeit dieser Lösung in einem Heimnetzwerk.

Bleibt dran, um mehr über die fortgeschrittene Nutzung von Kubernetes und die Verwaltung von Heimnetzwerken zu erfahren!

Weitere Blogposts aus der k3s-Reihe

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert