Initialisierung meines Heim-Kubernetes-Clusters: k3s mit Ansible

Hallo zusammen! Im letzten Post haben wir die Hardware besprochen, die ich für meinen Heim-Kubernetes-Cluster gewählt habe. Heute möchte ich euch erzählen, warum ich mich für k3s als meine Kubernetes-Distribution entschieden habe und wie ich sie eingerichtet habe.

Warum k3s?

Bei der Auswahl der richtigen Kubernetes-Distribution für meinen Heimcluster waren mehrere Faktoren ausschlaggebend. Ich benötigte etwas, das leichtgewichtig, einfach zu verwalten und dennoch leistungsfähig genug ist, um einen Cluster mit mehreren Geräten zu unterstützen. k3s hat sich als die ideale Wahl herausgestellt, da es alle Kernfunktionalitäten von Kubernetes in einem einzigen, kompakten Binary bietet.

Die Vorteile von k3s

  • Leichtgewichtig: k3s entfernt einige der weniger häufig benötigten Features und Plugins, die in Standard-Kubernetes-Setups vorhanden sind, was es ideal für Szenarien mit begrenzten Ressourcen macht.
  • Alles in einem Binary: Die Einfachheit der Installation und Wartung, da alles in einem einzigen ausführbaren Binary enthalten ist, erleichtert das Setup und die Updates erheblich.
  • Flexibel: Trotz seiner Kompaktheit unterstützt k3s vollständige Kubernetes-Funktionen und kann problemlos Cluster mit mehreren Knoten verwalten.

Alternativen und deren Einschränkungen

Während meiner Recherche habe ich auch andere Distributionen wie Minikube und MicroK8s in Betracht gezogen. Minikube ist zwar großartig für lokale Entwicklungen, unterstützt aber nur eine einzelne Maschine, was es für den Aufbau eines Heimclusters ungeeignet macht. MicroK8s ist ebenfalls eine solide Wahl, besonders auf Ubuntu-Systemen, aber es ist stärker an Ubuntu gebunden und war für meine Anforderungen weniger flexibel als k3s.

Architektur

Insgesamt stehen mir 3 Rechner zur Verfügung. Ein Rechner soll als Master Server und Control Plane fungieren. Die beiden anderen werden als Worker Nodes eingerichtet. In großen Kubernetes-Umgebungen werden auch die Master Server redundant ausgelegt. Dafür benötigt man eine ungerade Anzahl an Rechnern, damit die Master Server immer einen Leader bestimmen können.

Ich werde bei der Installation von k3s zwei integrierte Komponenten deaktivieren:

  1. traefik – wird als Ingress mitgeliefert. Ich möchte die Konfiguration selbst in der Hand halten und werden traefik später selbst im Cluster installieren
  2. servicelb – statt des integrierten, einfachen Loadbalancers möchte ich metallb verwenden, um die Vorteile meiner aus mehreren Servern bestehenden Installation ausnutzen zu können.

Automatisierung der k3s-Installation mit Ansible

Die Wahl fiel auf k3s, da es eine leichte, aber leistungsfähige Kubernetes-Distribution ist, die sich perfekt für Umgebungen mit begrenzten Ressourcen eignet. Um die Installation und Konfiguration von k3s auf meinen Thin Clients zu automatisieren, habe ich mich für Ansible entschieden, ein mächtiges Tool zur Automatisierung von IT-Prozessen.

Warum Ansible?

Ansible ermöglicht es mir, die Installation von k3s auf allen Geräten gleichzeitig zu orchestrieren, ohne manuell eingreifen zu müssen. Dies gewährleistet eine konsistente und fehlerfreie Einrichtung über alle Nodes hinweg.

Außerdem kann ich mit Ansible Aktualisierungen vornehmen, die Konfiguration verändern, das Cluster geordnet herunterfahren oder neu starten. Genauso lässt sich der Cluster löschen und neu aufsetzen. Letzteren Fall habe ich schon benötigt, um IPv6 zu aktivieren. Das lässt sich leider nicht nachträglich hinzufügen.

Schritte der Automatisierung

Das Ansible Playbook, das ich verwendet habe, findet ihr auf meinem GitHub. Hier sind die Kernpunkte des Playbooks:

  1. Vorbereitung der Nodes: Ansible konfiguriert die notwendigen Voraussetzungen auf den Nodes, wie die Installation von Abhängigkeiten und das Einrichten der Netzwerkkonfiguration.
  2. Installation von k3s: Das Playbook führt den k3s-Installer auf jedem Node aus und konfiguriert die Cluster-Parameter automatisch.
  3. Post-Installation Tasks: Nach der Installation stellt das Playbook sicher, dass alle Nodes korrekt verbunden sind und der Cluster funktionsfähig ist.

Zur Installation des Playbooks mit Ansible benötigt man zunächst das Inventory. Darin definiert man die Hostnamen der beteiligten Server.

---
k3s_cluster:
  children:
    server:
      hosts:
        master-server-name:
    agent:
      hosts:
        worker-node-1:
        worker-node-2:
Code-Sprache: YAML (yaml)

Im Inventory wird außerdem die Konfiguration des Clusters eingefügt:

  vars:
    ansible_port: <ssh-port>
    ansible_user: <username that is allowed to install things>
    k3s_version: <your desired k3s version>
    token: <a token you want to keep secret>
    api_endpoint: "{{ hostvars[groups['server'][0]]['ansible_host'] | default(groups['server'][0]) }}"
    extra_server_args: ""
    extra_agent_args: ""

  # Optional vars    
    server_config_yaml:  |
      # e.g. to disable things
      disable:
        - traefik
        - servicelbCode-Sprache: PHP (php)

Das Playbook wird mit ansible-playbook playbook/site.yml -i inventory.yml ausgeführt. Damit wird k3s auf den im Inventory angebenen Servern mit den richtigen Rollen installiert. Es gibt noch 3 weitere Playbooks in diesem Repository:

  1. upgrade.yaml: Hiermit lassen sich die k3s-Server aktualisieren und sie werden in der richtigen Reihenfolge neu gestartet. Mein Setup braucht das zwar nicht, da ich nur einen Server als Master betreibe.
  2. reboot.yaml: Startet alle Server in der richtigen Reihenfolge neu.
  3. reset.yaml: Entfernt k3s von allen Servern.

Fazit und Ausblick

k3s hat sich als eine hervorragende Wahl für meinen Heim-Kubernetes-Cluster herausgestellt. Es bietet eine Balance zwischen Leistungsfähigkeit und Einfachheit, die perfekt für die Bedürfnisse und Ressourcen meines Heimnetzwerks ist. Im nächsten Post werde ich tiefer in die Konfiguration des Clusters eintauchen und teilen, wie ich die einzelnen Dienste und Anwendungen aufgesetzt habe.

Bleibt dran, und lasst uns gemeinsam mehr über die spannende Welt von Kubernetes zu Hause erfahren!

Schreibe einen Kommentar

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