DevOps, Cloud, Backend

Kubernetes Setup Raspberry Pi (Lokales Setup)

Veröffentlicht am 25. November 2024

In diesem Artikel erkläre ich euch kurz, wie mein technisches Setup lokal aussieht. Damit ermögliche ich euch, die anderen Tutorials / Blogbeiträge besser zu verstehen (vor allem wenn ich über spezifische Nodes, IPs und Anwendungen schreibe).

Motivation

Ich wollte schon länger ein technisches Setup, mit dem ich Fähigkeiten im Umgang mit Kubernetes vertiefen kann. Dabei war es mir wichtig, den Multi-Node-Modus zu trainieren – also ein realistisches Setup, das sich von der typischen Docker-Umgebung unterscheidet. Ich möchte euch zeigen, wie sich ein Kubernetes-Cluster verhält, wenn mehrere Knoten miteinander kommunizieren, und so euer und mein Wissen über verteilte Systeme erweitern.

Außerdem möchte ich euch die einzelnen Bestandteile von Kubernetes besser beleuchten. Indem ihr einen „Bare-Metal“-Cluster selbst aufsetzt, kommt ihr viel direkter mit Komponenten wie etcd, kubelet oder kube-proxy in Kontakt. Dieses tiefergehende Verständnis hilft nicht nur beim Debuggen, sondern gibt euch auch die Fähigkeit, Kubernetes in Zukunft gezielt anzupassen und Probleme schneller zu lösen.

Ein weiterer Punkt, der mich motiviert hat, war der Wunsch, mehr mit Raspberry Pis zu arbeiten. Sie bieten eine tolle Möglichkeit, kostengünstig und praktisch an Clustern zu arbeiten. Gleichzeitig lernt man, wie man Hardware-Ressourcen sinnvoll nutzt und ein System betreibt, das sich an echten Produktionsumgebungen orientiert.

Dieses Setup ist für mich eine perfekte Kombination aus Lernen, Experimentieren und Hands-on-Erfahrung.

Raspberry Pis

Für mein Cluster-Experiment habe ich mir vier Raspberry Pi 4 Model B mit jeweils 4 GB SDRAM bestellt. Die Wahl fiel auf dieses Modell, da es für meine Anforderungen gut geeignet ist und genügend Leistung bietet. Tatsächlich sollte das Setup auch mit Modellen mit 2 GB RAM problemlos laufen. Wenn du mehr über das Modell erfahren möchtest, hier ist der Link zu den technischen Details: Raspberry Pi 4 Model B – 4 GB SDRAM.

Zusätzlich habe ich vier 64 GB SanDisk Extreme Speicherkarten geholt, um genug Speicherplatz für das Betriebssystem und die späteren Anwendungen zu haben. Auf diese Speicherkarten habe ich Debian 12 (Bookworm) installiert. Für Raspberry Pi gibt es dafür speziell angepasste Images, die du hier findest: Debian für Raspberry Pi.

Um das Setup übersichtlich und gut organisiert zu halten, verwende ich ein kompaktes Raspberry Pi Rack. Es hilft mir, die Geräte sauber an einem Ort unterzubringen und sorgt gleichzeitig für bessere Kühlung. Details dazu gibt es hier: Raspberry Pi Rack.

Ziel-Setup

Mein Plan für die vier Raspberry Pis sah wie folgt aus:

  1. Ein Raspberry Pi als Jumpbox: Dieser dient mir als zentraler Einstiegspunkt, um auf das Cluster zuzugreifen. Er könnte theoretisch weggelassen werden, aber ich nutze ihn auch für das Hosting von Anwendungen, die nicht direkt im Kubernetes-Cluster laufen sollen.
  2. Ein Raspberry Pi als Control Plane: Dieser übernimmt die Steuerung des Kubernetes-Clusters und verwaltet die Ressourcen und Deployments.
  3. Zwei Raspberry Pis als Worker Nodes: Diese beiden Nodes sind für die tatsächliche Ausführung der Workloads verantwortlich. Hier werden die Anwendungen und Container betrieben.
Aufbau des Kubernetes Clusters mit einem Jumphost, einem Server und 2 Worker Nodes inkls. IPs

Kubernetes the hard way

Für die Installation von Kubernetes habe ich mich bewusst dafür entschieden, keinen Installer wie kubeadm zu verwenden. Stattdessen wollte ich den Cluster Schritt für Schritt manuell aufsetzen, um die Funktionsweise der einzelnen Komponenten besser zu verstehen. Dabei hat mir ein extrem hilfreiches Tutorial von Kelsey Hightower geholfen: Kubernetes The Hard Way.

Dieses Tutorial ist eine echte Goldgrube, wenn es darum geht, die Grundlagen von Kubernetes zu lernen und alle wichtigen Setup-Schritte eigenständig durchzuführen. Es beleuchtet Bereiche, die bei vielen automatisierten Installationsmethoden im Hintergrund bleiben, wie zum Beispiel:

  • Modifizieren von Hostfiles: Die Konfiguration von Netzwerken, um sicherzustellen, dass die Nodes korrekt miteinander kommunizieren können.
  • Einrichten von Zertifikaten: Austausch und Signierung von TLS-Zertifikaten, um die Kommunikation zwischen den Komponenten des Clusters abzusichern.
  • Manuelles Starten des etcd-Servers: Die Datenbank von Kubernetes, die alle Cluster-Daten speichert.
  • Einrichten der Control Plane: Inklusive Starten des Kubernetes API Servers, des Schedulers und des Controller Managers.

Dieses Vorgehen ist zwar zeitaufwendiger, aber es lohnt sich! Du lernst die Architektur von Kubernetes auf einer viel tieferen Ebene kennen und verstehst genau, wie die einzelnen Komponenten zusammenspielen. Für jeden, der Kubernetes wirklich meistern möchte, ist dieses Tutorial ein absolutes Muss.

Wenn du also Interesse hast, Kubernetes „von Hand“ aufzusetzen, kann ich dir dieses Tutorial nur wärmstens empfehlen. Es ist zwar eine Herausforderung, aber auch eine der besten Möglichkeiten, um tief in die Materie einzutauchen.

Setup Basics Services

Nachdem mein Cluster eingerichtet war, habe ich direkt einige Anwendungen installiert, um die Umgebung produktiv zu nutzen und weiter zu testen.

Cillium

Auf dem Cluster habe ich Cilium installiert, ein leistungsstarkes Networking- und Sicherheits-Tool für Kubernetes. Cilium ersetzt das Standard-Netzwerk-Plugin (CNI) und bietet erweiterte Networking-Funktionen wie:

  • eBPF-basierte Netzwerkanalyse: Eine moderne und effiziente Art, Netzwerkaktivitäten in Echtzeit zu überwachen.
  • Netzwerk-Policies: Präzise Kontrolle über die Kommunikation zwischen Pods und Services im Cluster.
  • Service Mesh Integration: Eine einfache Möglichkeit, Netzwerkfunktionen wie Traffic Management oder Verschlüsselung bereitzustellen.

Cilium hilft mir dabei, das Netzwerkverhalten innerhalb des Clusters besser zu verstehen und erweiterte Features wie Load-Balancing oder Observability zu testen.

Gitea

Auf meinem Jumphost habe ich Gitea installiert, einen schlanken und einfach zu bedienenden privaten Git-Service. Gitea bietet mir die Möglichkeit, meine Projekte zentral zu verwalten, ohne auf externe Plattformen wie GitHub oder GitLab angewiesen zu sein.

Besondere Vorteile von Gitea:

  • Einfache Einrichtung und geringer Ressourcenbedarf: Perfekt für die schlanke Hardware eines Raspberry Pi.
  • Netzwerkweite Verfügbarkeit: Gitea ist von allen Nodes im Cluster erreichbar, was die Arbeit im Team oder bei verteilten Deployments erleichtert.
  • Self-Hosting: Ich habe die volle Kontrolle über meine Repositories, einschließlich Zugangsbeschränkungen und Backups.

Fazit

Nach der Installation und Konfiguration sieht mein Kubernetes-Cluster jetzt folgendermaßen aus:

Cluster-Aufbau

  • 2 Worker Nodes: Diese beiden Nodes sind für die Ausführung der Workloads verantwortlich. Hier werden die Pods und Container gehostet, und die Last wird gleichmäßig zwischen ihnen verteilt.
  • 1 Master Node (Control Plane): Der Master Node steuert das gesamte Cluster. Hier laufen die zentralen Komponenten wie der Kubernetes API Server, der Scheduler und der Controller Manager, die für die Verwaltung und Planung der Workloads zuständig sind.
  • 1 Jumphost: Der Jumphost dient mir als zentraler Einstiegspunkt ins Cluster. Zusätzlich läuft auf diesem Node Gitea, mein privater Git-Service, der allen Nodes im Cluster zur Verfügung steht.

$ kubectl get nodes -o wide
NAME     STATUS   ROLES    AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                         KERNEL-VERSION   CONTAINER-RUNTIME
node-0   Ready    <none>   64d   v1.28.3   192.168.2.183   <none>        Debian GNU/Linux 12 (bookworm)   6.1.0-25-arm64   containerd://1.7.8
node-1   Ready    <none>   64d   v1.28.3   192.168.2.184   <none>        Debian GNU/Linux 12 (bookworm)   6.1.0-25-arm64   containerd://1.7.8

$ kubectl cluster-info
Kubernetes control plane is running at https://192.168.2.182:6443
CoreDNS is running at https://192.168.2.182:6443/api/v1/namespaces/kube-system/services/coredns:udp-53/proxy

Interaktion mit dem Cluster

Um effizient mit meinem Kubernetes-Cluster zu arbeiten, nutze ich OpenLens. Diese grafische Benutzeroberfläche für Kubernetes macht es deutlich einfacher, den Status des Clusters zu überwachen, Ressourcen zu verwalten und Workloads direkt zu kontrollieren.

Fazit: Ein vollständiges, flexibles Setup

Mit diesem Aufbau habe ich ein leistungsstarkes und übersichtliches Cluster, das sowohl für Lernzwecke als auch für echte Anwendungen genutzt werden kann. Es bietet mir nicht nur die Möglichkeit, Kubernetes im Detail zu verstehen, sondern auch praktische Anwendungen wie Gitea direkt produktiv einzusetzen.


0 Kommentare

Schreibe einen Kommentar

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