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.
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: 1883
Code-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
- Einführung in meinen Kubernetes-Heimcluster: Warum und Wie?
- Der Aufbau meines Kubernetes-Heimclusters: Die Wahl der Hardware
- Initialisierung meines Heim-Kubernetes-Clusters: k3s mit Ansible
- GitOps mit FluxCD für meinen Heim-Kubernetes-Cluster
- Sichere Verwaltung von Kubernetes Secrets mit Sealed Secrets
- Automatisierte DNS- und SSL-Zertifikatsverwaltung in Kubernetes
- Storage, Backup und Restore in meinem Kubernetes-Cluster
Ein Gedanke zu „Ingress und Load Balancer in Kubernetes: Traefik und MetalLB“