Himbeercluster (k3s) Teil 2: Software Setup

Weil wir auf dem Raspberry Pi unterwegs sind liegt natürlich nichts näher als Raspbian als OS für das Cluster zu wählen. Entscheidet man sich bei
den Varianten statt für k3s zum Beispiel für microk8s würde sich eventuell Ubuntu empfehlen, da beide Produkte aus der Feder von Canonical stammen. Rancher bietet auch ein eigenes leichtgewichtiges OS für den Betrieb von k3s
an (Rancher OS), zum Zeitpunkt zu dem der Autor für die Erstellung der
Inhalte dieses Buches herumexperimentiert gab es aber (noch) keine Version,
die wirklich mit dem Raspberry Pi 4 kompatibel war. Also Raspbian… Allerdings brauchen wir hier vieles der normalen Version nicht. Eine grafische Benutzeroberfläche ist für den Betrieb in einem Cluster zum Beispiel völlig unnötig. Daher werden wir unser Cluster auf der Lite Version von Raspbian aufbauen. Da diese zum Zeitpunkt, an dem ich die Kapitel für mein Buch geschrieben habe nur in einer 32bit Variante vorlag müssen wir hier noch etwas dran basteln.

Inzwischen gibt die 64bit Variante immerhin schon in einer Beta Version, die aktuell auch bei mir im Betrieb ist. Nach der Erläuterung der notwendigen Konfigurationen für die 32bit Variante werde ich daher auch noch mal kurz auf die Konfigurationsunterschiede zur 64bit Variante eingehen.

Vorbereitungen:

Ich kann nur DRINGEND empfehlen, den Raspberry Pi Imager (zu finden hier: https://www.raspberrypi.com/software/) zu verwenden, da dieser einem das Leben doch sehr erleichtert. Damit flashen wir nun Raspbian Lite (oder wie es eigentlich nun heißt: Raspberry OS lite) auf eine SD Karte. Es empfiehlt sich hier schon über das Super-Top-Secret-Spezial-Menü (*hust* Strg+X *hust*) SSH zu aktivieren, ein Passwort zu setzen und der Himbeere einen sinnvollen Hostnamen zu geben.

Die fertig geflashte SD Karte wandert dann in die Himbeere und die an den Strom. Nun heißt es etwas Geduld haben und den kleinen Rechner einmal booten und die SD Karte einrichten lassen. Nach diesem ersten Boot (zum feststellen ob die kleine Kiste gebootet hat empfiehlt sich die Kiste einfach anzupingen) muss der Pi wieder runtergefahren und die SD Karte entfernt werden.

Im nächsten Schritt öffnen wir die SD Karte mit unserem Hauptrechner und bearbeiten zwei Dateien:

Die erste Datei ist die bootconfig, auch bekannt als config.txt. Dort fügen wir ganz am Ende die folgende Zeile hinzu:

arm_64bit=1

Hiermit fordern wir Raspberry OS auf den 64bit Kernel zu nutzen. Als Nächstes müssen wir die Datei cmdline.txt ergänzen. Hier fügen wir am Ende der Zeile (KEINE neue Zeile) folgende Parameter an:

cgroup_memory=1 cgroup_enable=memory

Diese beiden Argumente sind etwas schwerer in wenigen Zeilen zu erklären, aber die Kurzfassung ist, dass sich mit den cgroups auf Linux zusammengehörige Prozesse gruppieren und organisieren lassen. Grade beim Thema Ressourcenmanagement sind cgroups hilfreich. Hier aktivieren wir das memory-Subsystem, was speziell den Speicherbedarf der gruppierten Prozesse kontrolliert.

Damit sind die Vorbereitungen weitestgehend abgeschlossen. Alles was jetzt noch nötig ist können wir direkt auf der Himbeere erledigen. Also SD Karte wieder im Raspi versenkt, den kleinen Rechenknecht an den Strom gehangen und die Konsole aufgemacht.

Raspi Vorbereitungen:

Im letzten Abschnitt haben wir in der bootconfig den Raspi aufgefordert den 64bit Kernel zu verwenden. Diesen müssen wir nun auch im ersten Schritt einmal updaten. Also flugs eine SSH Verbindung zum kleinen Taschencomputer aufgebaut und folgendes in die Tastatur gehackt:

$ sudo rpi-update

Das kann nun etwas dauern (Kaffee irgendjemand?). Wenn das Update durchgelaufen ist wird die kleine Kiste einmal neugestartet mit:

$ sudo reboot

Nun kommt das reguläre einrichten des Raspberry Pi via raspi-config. Da wir in der lite Version von Raspberry OS allerdings keine grafische Oberfläche zur Bedienung haben (und wir ja auch via SSH mit der Kiste Verbunden sind) muss das ganze über die Konsole passieren. Aufgerufen wird das Ganze mit:

$ sudo raspi-config

Das Menü ist vom Inhalt her das gleiche wie man es von der Desktop Bedienung her gewohnt ist. Im „Performance“ Menü setzen wir den für die GPU reservierten Speicher auf 16MB herunter und im „Localisation„-Menü können wir die deutschen Sprachdateien erzeugen. Das ist aber ggf. optional. Nun gehen wir noch in die „Advanced Options“ und aktivieren die Funktion „Expand Filesystem“ um Raspberry OS dazu zu bringen den kompletten Speicherplatz der SD Karte zu nutzen. Nach Bedarf kann jetzt noch der Wifi Zugang eingerichtet werden. Für ein Cluster empfiehlt sich aber üblicherweise eine Netzwerkverbindung via Kabel. Ist alles eingerichtet kommt -Überraschung- wieder ein reboot.

Ist die Kiste wieder anwesend muss im nächsten Schritt einmal die vorhandene Software aktualisiert werden. Das geht ganz klassisch mit:

$ sudo apt-get update && sudo apt-get upgrade

Das Update wird wieder einen Moment dauern, da es einiges zu tun geben wird. Wenn das Upgrade durchgelaufen ist folgt, mal wieder, ein:

$ sudo reboot

Nun fehlt nur noch eine Kleinigkeit um die Vorbereitungsarbeiten abzuschließen. Damit die Netzwerkkommunikation zwischen den Cluster Knoten mit k3s nachher richtig funktioniert müssen wir noch iptables auf die legacy Version umstellen. Das geht folgendermaßen:

$ sudo iptables -F

$ sudo update-alternatives --set iptables /usr/sbin/iptables-legacy

$ sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy

$ sudo reboot

Damit sind die Vorbereitungsarbeiten ENDLICH abgeschlossen. Diese Arbeiten müssen für jeden Raspberry Pi vorgenommen werden, der nachher als Teil des Clusters laufen soll. In nicht übermäßig ferner Zukunft werde ich dafür vermutlich auch auf meinem GitHub Account ein Ansible Playbook zur Verfügung stellen.

Und was ist nun mit der versprochenen 64bit-Beta Version???

Jaaaajaaa, nicht drängeln. Zunächst einmal brauchen wir das Image. Leider ist das nicht im Raspberry Pi Imager hinterlegt, aber wir können es hier (https://downloads.raspberrypi.org/raspios_lite_arm64/images/) runterladen. Auch wenn es „nur“ eine Beta Version ist, ich habe mein Cluster jetzt seit annähernd einem halbem Jahr auf Basis dieser Version im Betrieb und konnte (noch) keine Probleme feststellen. Von den oben erwähnten Schritten können wir uns beim Verwenden der Beta Version alles sparen, was mit dem Kernel zu tun hat. Dementsprechend müssen wir die bootconfig nicht anpassen und auch kein Firmware Update mit rpi-update durchführen.

Im nächsten Abschnitt folgt dann die Installation von k3s auf den Knoten des Clustert.

Himbeercluster (k3s) Teil 1: Setup

Der vermutlich einfachste Weg ein Rechnercluster zu nutzen ist aktuell Kubernetes. An diesem Punkt werden vermutlich schon die ersten Leute aufschreien, dass ein Raspberry Pi, selbst in der Raspberry Pi 4 mit 8GB RAM Variante, eine absolut ungeeignete technische Basis wäre, selbst ein durchschnittlicher Laptop mehr leisten würde, uuund und und und und….

Da ist natürlich was dran. Ein Produktivcluster für den Einsatz in einem großen Unternehmen können wir so natürlich nicht auf die Beine stellen. Aber das ist auch gar nicht der Punkt hier. Zum einen kann ich aus eigener Erfahrung sagen, dass man immens viel lernt, wenn man mal so ein Bare-Metal Kubernetes von null an aufsetzt und etwas damit herumexperimentiert (was man dann auch nachher 1:1 auf „sinnvolle“ Cluster übertragen kann), zum anderen ist im heimischen Netzwerk ja dann doch tendenziell nicht ganz so viel los wie in einem Rechenzentrum von Google und so ein Cluster ist ein schöner Weg kleine Dienste (Gitea, Pi-Hole, Minecraft,….) für den Heimgebrauch im eigenen Netzwerk anzubieten.

Außerdem… Warum zum Teufel nicht? 😀 Welcher Nerd, der etwas auf sich hält findet die Idee sagen zu können „Ich hab ein Rechnercluster in meiner Wohnung stehen“ nicht an sich schon irre cool 😀 Ok, vielleicht bin auch nur ich so wahnsinnig, aber zurück zum Thema:

Die erste Frage, die sich stellt ist, welche Variante von Kubernetes wollen wir eigentlich nutzen? Die „große“, komplette Variante (quasi das Original k8s) bekommt man angeblich auch auf dem Raspberry Pi 4 zum laufen, durchaus auch nutzbar, aber persönlich würde ich eher zu SUSEs k3s (https://k3s.io) oder Canonicals microk8s (https://microk8s.io) greifen. Dabei handelt es sich um etwas kompaktere Versionen, die mit etwas weniger Ansprüchen an die Hardware daher kommen und wir wollen ja nachher so viel Leistung wie möglich für das Cluster zur Verfügung haben. Für diesen Artikel habe ich mich jetzt für k3s entschieden.

Material:

Hat man nun vor der Himbeere ein paar Kollegen an die Seite zu stellen und ein Cluster aufzusetzen braucht man natürlich erstmal Material. Hier ist was ich benutze und empfehlen würde (die Links sind Affiliate Links, ich bekomme also eine kleine Provision, falls ihr darüber kauft):

  • Zunächst mal natürlich mindestens zwei Raspberry Pi 4. Ich würde dringend die 8GB Variante empfehlen, mit der 4GB Variante müsste man aber auch noch davon kommen.
  • Mindestens eine Mini-SD Karte pro Raspi. Die Karte darf gerne etwas größer sein, mehr als 3264GB braucht man aber eigentlich nicht, wir werden später ein NAS nutzen um die Daten der Services, die im Cluster laufen zu sichern.
  • Da ein Cluster davon lebt, Daten so schnell wie möglich zwischen den Knoten hin und her schieben zu können empfiehlt sich für den Netzwerkzugang das gute, alte Ethernetkabel.

Damit haben wir das Pflichtprogramm an Material zusammen. Im Folgenden erwähne ich noch 2-3 Dinge, die ich benutze und die sich als praktisch erwiesen haben, aber für das Ziel dieses Artikels nicht unbedingt nötig sind.

Wenn man anfängt ein Cluster mit mehr als zwei Knoten zu bauen erstickt man früher oder später in massivem Kabelsalat. Dazu kommt ja auch, dass man die Netzwerkkabel irgendwo unterbringen muss und der durchschnittliche Heimrouter hat dann ja auch nicht soooo viele Lan-Dosen. Die Lösung?

POE!

Oder genau genommen: POE+

POE steht for Power Over Ethernet (das „+“ von „POE+“ steht einfach nur für etwas mehr Power Over Ethernet). Hier kommt der Strom, wie der Name vermuten lässt direkt über das Ethernetkabel. Nötig dafür sind aber zwei Dinge:

  • Ein POE+ fähiger Switch
  • Ein POE+ Hat pro Raspberry Pi. Ich selbst benutze den originalen POE+ Hat der Raspberry Pi Foundation, der scheint aber aktuell nicht besonders gut zu bekommen zu sein. Wichtig ist hier nur, dass es sich tatsächlich um einen POE+ Hat nach IEEE 802.3at Standard handelt. Der reguläre POE Hat (IEEE 802.3af) liefert etwas zu wenig Power um den Raspi 4 in jeder Lebenslage sicher zu versorgen.

Das wäre es auch eigentlich schon an Material. Damit es nicht ganz so chaotisch wird empfiehlt sich vielleicht noch ein Gehäuse. Hier kann ich aber nichts direktes empfehlen, da grade auch die Wahl des POE+ Hats die Höhe des Raspberry Pi’s doch stark beeinflusst. Eine sehr einfache Variante ist ein stapelbares „Gehäuse“ wie dieses. Es wird zwar nicht nutzbar sein wie vom Verkäufer beworben, aber die Standoffs zwischen den einzelnen Ebenen lassen sich stapeln und so der Abstand zwischen den Schichten vergrößern. Dazu ist das Gehäuse recht offen, was dem Temperaturmanagement zugute kommt. Für Leute, die einen 3D Drucker besitzen empfiehlt sich auch ein Blick auf Thingiverse, da es dort für jede denkbare Variante von Himbeerenkonfiguration eigentlich eine Unterbringung zu finden gibt… Wenn man bereit ist etwas Geld in die Hand zu nehmen gibt es auch schon professionell gefertigte Schienen für 19 Zoll Serverschränke um Raspis samt POE+ Hats unterzubringen.

Damit hätten wir die Hardware Seite abgehakt. Im nächsten Teil geht es weiter mit der Vorbereitung der Software.