Anatomie meines Heimat-Kubernetes-Clusters

Vor einem Jahr wurde mir klar, dass ich meinen eigenen Kubernetes-Cluster erstellen wollte. Ich bin ein Softwareentwickler. Normalerweise verwende ich entweder einen lokalen Cluster mit einem Knoten oder einen Remote-Cluster mit mehreren Knoten, um meine Projekte zu testen. Wenn ich mit einem Cluster mit einem Knoten arbeite , verlasse ich mich normalerweise auf Minikube , obwohl es andere Lösungen gibt, wie das Kind- Projekt , das das Vorhandensein mehrerer Knoten in einem Cluster emulieren kann. In Minikube wird möglicherweise die Unterstützung mehrerer Knoten angezeigt.

Daher möchte ich die Funktionen der beiden oben genannten Umgebungen zur Verfügung haben. Das heißt, ich hätte einen Cluster, der aus mehreren Knoten besteht, und die Arbeit mit diesen Clustern würde keine Netzwerkverzögerungen bedeuten, die für die Interaktion mit Remote-Umgebungen typisch sind. Es wurden bereits viele großartige Tutorials zum Erstellen von Kubernetes Multi-Node-Clustern mit Single-Board-Computern geschrieben . Viele dieser Handbücher verwenden den Raspberry Pi als SBC. Als ich das sah, beschloss ich, den Weg des geringsten Widerstands zu beschreiten und entschied mich auch für diesen Computer. Die Raspberry Pi-Plattform hat sich als kostengünstige und kostengünstige Lösung etabliert.





Es ist zu beachten, dass die Wahl dieser Plattform einige Kompromisse vorsieht. Beispielsweise haben Broadcom und die Raspberry Pi Foundation keine kryptografischen ARMv8-Erweiterungen lizenziert (dies ist für die Hardwarebeschleunigung der AES-Unterstützung erforderlich). Eine weitere umstrittene Lösung ist die Verwendung von microSD-Karten in Form eines Standardspeichermediums, von dem das Betriebssystem geladen wird.

Bei der Analyse der vorhandenen Richtlinien zum Erstellen von Clustern auf Einplatinencomputern habe ich keine einzige gefunden, die eine Lösung beschreibt, die meinen Anforderungen entspricht. Ich beginne die Geschichte über den Cluster, den ich mit ihnen erstellt habe.

Bedarf


  • Der Cluster sollte in einem separaten Gehäuse untergebracht sein, das leicht bewegt, geöffnet und gewartet werden kann und mit separaten Modulen des Systems arbeitet.
  • , . , , . , . , .
  • , .
  • , , , .

Hinter diesen Anforderungen steht ein nicht offensichtliches Ziel: Ich brauchte meine vierjährige Tochter, um mit dem Cluster zu arbeiten. Ich hoffe, dass er für sie eine Art Studienführer wird, der ihr hilft, sich mit Computern, Befehlsschalen und Terminals vertraut zu machen.

Zubehör


DetailQuelle
Pico 5 Raspberry PI 5S Starter Kitpicocluster.com
Single Board Computer: 2 Raspberry Pi 4B (4 GB) 3 Raspberry Pi 3B +
5 microSD-Karten 32 GB Klasse 10 / A1 raspberrypi.org
Ethernet-Kabel: 2 0,25 m Kat. 83 0,15 m Kat. 7, S / FTP1attack.de
USB-Kabel PortaPow 20AWG2 USB-C3-Kabel Micro-USB-Kabelportablepowersupplies.co.uk
Offizieller Raspberry Pi 7 ″ Touchscreenraspberrypi.org
Stromversorgung Dehner Elektronik STD-12090 12V / DC 9A 108Wdehner.net
12V bis 5V 15A DC-Abwärtswandlerdroking.com
Heschen 12V 25A SPST 2-Pin ON/OFFheschen.com
Noctua NF-A4x20 5V PWMnoctua.at
, (15A, 30V) 4 , MOSFET PSMN011-30YLCebay.com
2 M.2 NVMe USB 3.0, JMS58amazon.com
2 Samsung SSD 970 EVO Plus M.2 PCIe NVMe 500 Go
2 USB 3.0 ( , ) 6″/152mmusbfirewire.com
2 USB 3.0- Delock, Male-Female ( 270°)delock.com
Adafruit Raspberry Pi 24″/610mmadafruit.com
Adafruit (DSI CSI) Raspberry Pi adafruit.com
Wago 221wago.com
Lapp Unitronic 300mm/1200mm 2x0.14mm²lappgroup.com
Lemo FGG.0B.302.CLAD42 EGG.0B.302.CLLlemo.com
DuPont Female-Female

Das PicoCluster-Gehäuse ist klein und sehr einfach zu bedienen. Aus dem von mir bestellten Starter-Kit habe ich nur das Chassis einschließlich der Latches und Racks sowie den 8-Port-Gigabit-Ethernet-Switch verwendet.

Jetzt verstehe ich, dass es besser wäre, wenn PicoCluster eine Version seines Kits ohne elektrische Komponenten verkaufen würde. Eine weitere Alternative zu diesem Kit war die Entwicklung eines eigenen Gehäuses. Dies würde jedoch mehr Zeit erfordern. Ich müsste Vektorzeichnungen erstellen, ich müsste die Dienste des Laserschneidens in einem Unternehmen in Anspruch nehmen, das Acrylplatten anbietet, idealerweise Platten mit einer Beschichtung, die elektrostatische Entladungen ableitet.

Während der Arbeit stieß ich auf Warnungen vor unzureichender Spannungund fand heraus, dass das Problem durch Micro-USB-Kabel verursacht wurde, die mit dem Gehäuse geliefert wurden. Zusätzlich zum Gehäuse gab es einen DC / DC-Abwärtswandler mit 12 V bis 5 V und 30 W, den ich durch einen leistungsstärkeren ersetzte. Ich habe dies aus Gründen getan, die ich weiter unten im Abschnitt zur Stromversorgung des Systems erläutern werde.

Als ich mit der Arbeit an diesem Projekt begann, hatte ich nicht vor, die 2019 veröffentlichten Raspberry Pi 4-Boards zu verwenden. Dies erklärt, dass ich noch drei Raspberry Pi 3-Karten habe, die als Arbeitsknoten fungieren. Ich habe zwei andere solche Boards gegen Raspberry Pi 4 ausgetauscht. Sie werden für Knoten verwendet, die mehr Ressourcen benötigen. Dies ist der Hauptknoten und der Arbeitsknoten, der unter anderem zum Erstellen von Datensicherungen verwendet wird.

Kurz nach der Veröffentlichung des Raspberry Pi 4 brachte PicoCluster ein neues Chassis auf den Markt, das speziell für solche Boards entwickelt wurde. Es enthält ein leistungsstarkes Netzteil, zwei Lüfter und einen Netzschalter. Dieser Fall ist zwar größer als meiner, und die Lüfter werden sicherlich lauter sein als der Noctua NF-A4x20. Die Drehzahl dieses Lüfters kann mithilfe der Pulsweitenmodulation (PWM) gesteuert werden , wobei die Ergebnisse der an den Platinen durchgeführten Temperaturmessungen berücksichtigt werden.

Es ist zu beachten, dass sowohl der SoC Broadcom BCM2837 (Raspberry Pi 3) als auch der SoC BCM2711 (Raspberry Pi 4) über Hardware-Timer verfügen, die PWM-Signale erzeugen können. Infolgedessen ist es sehr einfach, Steuereingangssignale auszugebenvon Noctua NF-A4x20 PWM erwartet, ohne den Prozessor zu überlasten. Außerdem ist der Lüfter kaum hörbar, wenn er mit der halben Drehzahl läuft (ca. 2500 U / min). Wie sich herausstellte, reicht dies aus, um die Systemtemperatur unter normaler Last unter 45 ° C zu halten.

Das neue Gehäuse verfügt über ein integriertes Netzteil. Er ist außerdem teurer als der, den ich gewählt habe. All diese Eigenschaften dieses Gehäuses sind der Grund, warum ich das Pico 5S-Kit wählen würde, selbst wenn ich das Gehäuse jetzt kaufen würde. Es sollten mehr Anstrengungen unternommen werden, um daran zu denken, aber was sich am Ende herausstellte, scheint mir besser zu sein als das, was sich herausgestellt hätte, wenn ich ein anderes Gebäude gewählt hätte. Im Allgemeinen lohnt sich die Mühe und Zeit.

Versammlung


▍ Frontplatte



Vorderseite

Die Vorderseite hat eine Öffnung für den Zugriff auf microSD-Karten. Dies ist praktisch, auch wenn ich vorhabe, den Systemstart mithilfe des USB-Massenspeicherstarts zu organisieren. Ich habe vor, dies direkt zu tun, nachdem der Raspberry Pi 4 diesen Startmodus vollständig unterstützt. Das Loch hilft auch, die Luftzirkulation im Gehäuse zu organisieren. In diesem Fall befinden sich zwei SSD-Laufwerke direkt vor dem Lüfter, wodurch die optimale Betriebstemperatur aufrechterhalten werden kann.

Die Aktivitäts- und Leistungsindikatoren der Boards sind deutlich sichtbar, sodass Sie den Status des Clusters auf einen Blick beurteilen können. Die Aktivitätsanzeigen des Ethernet-Switch sind ebenfalls sichtbar.


Die Oberseite des Gehäuses ohne Bildschirm Der

Bildschirm kann leicht verschoben werden, um ihn näher an die Tastatur heranzuführen oder um beim Öffnen des Gehäuses Zugriff auf die Oberseite zu erhalten.

▍ Linkes Feld



Linkes Feld

Auf dem linken Feld des Gehäuses befinden sich die GPIO-Anschlüsse der Karten. Eines der Kabel verbindet das Hauptgerät mit dem Lüfter - zur Organisation der PWM-Steuerung seiner Drehzahl. Ein weiteres Kabel verbindet den Hauptknoten mit dem Leiterplattenmodul, mit dem die Arbeitsknoten ein- und ausgeschaltet werden. Vier Kabel verbinden jeden der Arbeitsknoten mit dem Hauptknoten. Im ausgeschalteten Zustand werden GPIO-Pins mit einem hohen aktiven Pegel verwendet. Auf diese Weise kann der Hauptknoten die Stromversorgung des Arbeitsknotens sicher abschalten, nachdem die am Ende seines Betriebs ausgeführte Abfolge von Aktionen abgeschlossen ist.


Das Modul zum Anschließen des Lüfters an den Hauptknoten

In der oberen linken Ecke befindet sich ein kleines Modul zum Anschließen des 4-poligen Noctua-Lüfteranschlusses an den Raspberry Pi-Hauptknoten. Der entsprechende GPIO-Anschluss ist dank der Hardware-Unterstützung für die Erzeugung von PWM-Signalen zur Steuerung der Lüftergeschwindigkeit konfiguriert. Die Geschwindigkeit wird basierend auf der Analyse der Temperatur der Platinen ausgewählt, deren Informationen regelmäßig mit SSH gesammelt werden. Das Hauptgerät liest außerdem zu Überwachungszwecken die Lüftergeschwindigkeit.

▍ Rückwand



Rückseite

Die Rückseite des Gehäuses verbirgt Kabel. Die Tatsache, dass alles so aussieht, kann als Folge eines listigen Ansatzes für die modulare Organisation meines Projekts angesehen werden. Es war schwer, Qualitätskabel zu finden. Besonders - kurze USB 3.0-Kabel mit gebogenen Steckern. Kabel - Dies ist die größte Gruppe beweglicher Elemente in meinem System. Sie müssen bestimmte mechanische und elektrische Eigenschaften erfüllen. Sie erwiesen sich als Hauptursache für Probleme.

Ich hatte die Idee, ein einzelnes Spiralkabel zu verwenden, um es durch ein DSI-Bandkabel zu ersetzen, mit dem ein Bildschirm an das System angeschlossen ist. Dann würde das Spiralkabel den Bildschirm mit dem Cluster verbinden und ihn mit Strom versorgen. Ich konnte jedoch keinen geeigneten DSI-Anschluss finden. Ich verzichtete auf dieses Unterfangen und die Tatsache, dass mich die Aussicht, 17 Drähte mit einer Größe von 0,14 mm² zu löten, nicht anzog. Ich habe einen DSI-Kabelverlängerer verwendet und ein 2-adriges Spiral-Micro-USB-Stromkabel verwendet. Dies gab mir die Möglichkeit, den Bildschirm leicht zu bewegen und auszuschalten, ohne das Gehäuse zu öffnen.


Erfolgloser Versuch, Kabel anzuordnen

Hier ist ein erfolgloser Versuch, das System zum Organisieren der Kabeleinführung in das für USB 3.0-Erweiterungskabel vorgesehene Gehäuse zu organisieren. Trotz unzähliger Versuche, die Kabel richtig zu verlegen, sind bei der Datenübertragung systematisch E / A-Fehler aufgetreten. Sie wurden wahrscheinlich durch die Tatsache verursacht, dass sie beim Verlegen der Kabel zu stark gedehnt wurden, oder durch die Tatsache, dass dies die zuverlässige Verbindung der Kabel mit den Steckverbindern beeinträchtigte.

▍ Rechtes Feld



Rechtes Feld

Auf der rechten Seite des Gehäuses sehen Sie den 8-Port-Ethernet-Switch.

System-Design


▍ Essen



Bei offener Frontplatte musste

ich mich für ein Netzteil entscheiden. Insbesondere darüber, welche Leistung in Watt unterstützt werden muss, um die Anforderungen des Clusters zu erfüllen. Dies ist eine kleine Frage zu dem, was vorher kam - einem Huhn oder einem Ei, da keine Messungen durchgeführt werden können, bevor der Cluster mit Strom versorgt wird.

Um eine ungefähre Schätzung der Leistung zu erhalten, habe ich mich der offiziellen Dokumentation zugewandt, die einige Informationen zur Leistung des Raspberry Pi sowie zu den Spezifikationen anderer Komponenten enthält. Dies gab mir die folgenden ungefähren Zahlen basierend auf dem durchschnittlichen Energieverbrauch.


Aber was geschah nach Berücksichtigung der Maximalwerte des Energieverbrauchs aus der Dokumentation.


Dies war viel höher als die Leistung der Netzteile, die 5 V erzeugten, da die Komponenten mit "geringem Stromverbrauch" einen Strom von 10 A benötigten. Dies schloss die Verwendung einer einzelnen 5-V-Stromversorgung aus. Gleichzeitig sind 12-V-Netzteile sehr verbreitet, die die erforderliche Leistung liefern können. Aus diesem Grund habe ich das Dehner Elektronik STD-12090 12V / DC 9A 108W-Netzteil ausgewählt und an einen 12V / 5V 75W DC / DC- Wandler angeschlossen .

Hier hatte ich eine andere Option, die darin bestand, fünf weniger leistungsstarke Konverter zu verwenden - einen für jede Raspberry Pi-Karte, aber dies würde das Clusterdesign erheblich erschweren.




Patchplatine Eine 4-polige Patchplatine auf Basis des MOSFET PSMN011-30YLC befindet sich unten im Gehäuse. Es wird zum Aktivieren und Deaktivieren von Arbeitsknoten verwendet. Es ist mit 15A, 30V gekennzeichnet, sodass es auch mit der Last von vier Raspberry Pi gut zurechtkommt.

Ich habe den durchschnittlichen und maximalen Stromverbrauch des Clusters gemessen. Die Messergebnisse stimmen ungefähr mit den ungefähren Berechnungen überein, die ich zuvor durchgeführt habe. Der Unterschied zwischen den erwarteten und tatsächlichen Werten kann durch die Merkmale der Systemkonfiguration und die Merkmale des Tests erklärt werden. Insbesondere habe ich Wi-Fi und Bluetooth auf meinem Raspberry Pi ausgeschaltet. Sie funktionieren auch, ohne dass ein Bild auf dem Monitor angezeigt wird. Dies könnte die Tatsache erklären, dass sich die Werte in Wirklichkeit als geringer herausstellten.

Wie sich herausstellte, ist das 108-W-Netzteil viel leistungsstärker als für den Cluster erforderlich. Die Tatsache, dass ich nur ein solches Netzteil habe, bedeutet jedoch, dass ich die Fähigkeiten des Systems erweitern kann. Ersetzen Sie beispielsweise Raspberry Pi 3 durch Raspberry Pi 4.

▍ Datenspeicherung


Eine der neuen Funktionen des Raspberry Pi 4 ist das Vorhandensein von zwei USB 3.0-Anschlüssen auf der Platine, die über eine extrem schnelle PCIe-Verbindung mit dem BCM2711 SoC verbunden sind. Dank dessen kann man hoffen, sehr hohe Datenraten zu erreichen. Ich entschied, dass ich diese USB 3.0-Anschlüsse verwendete, um SSDs mit dem M.2 NVMe an USB 3.0-Adapter anzuschließen. Es stellte sich jedoch heraus, dass es sehr schwierig war, solche Adapter zu finden. Ich schlug naiv vor, dass Adapter für mich funktionieren würden. Als Ergebnis kaufte ich den ersten derartigen Adapter ohne seine Kompatibilität mit dem Raspberry Pi 4.en Überprüfen

mir, zum Glück kam in diesemRaspberry Pi 4 Download-Anleitung und kaufte dann den empfohlenen Shinestar M.2 NVMe auf USB 3.0 Adapter. Es hatte fast die gleiche Größe wie das M.2 NVMe 2280 (22 mm breit und 80 mm lang), was sich hervorragend für das Pico 5S-Gehäuse eignet. Ich habe den Adapter verwendet, um die Samsung SSD 970 EVO Plus M.2 PCIe NVMe 500 anzuschließen. Gehen Sie zum Raspberry Pi.


M.2 NVMe-Adapter auf USB 3.0

Nachdem ich alles installiert und konfiguriert hatte, entschied ich mich, das Laufwerk schnell zu testen und die Datenübertragungsgeschwindigkeit herauszufinden. Dazu kopierte ich eine große Datei von der SSD auf meinen Laptopscp:

$ scp pi@master:<source> <destination>
100% 1181MB 39.0MB/s 00:30


Das Ergebnis von 39 Mb / s hat mich enttäuscht. Diese Zahlen sind weit entfernt von denen, die zum vollständigen Laden des Gigabit-Ethernet-Switches erforderlich sind. Ich suchte nach einem möglichen Engpass im System und stellte fest, dass während der Dateiübertragung immer einer der Prozessorkerne zu 100% geladen ist. Nachdem ich herausgefunden hatte, dass der Prozessor der Engpass bei der Datenübertragung war, stellte ich schnell fest, dass der Raspberry Pi 4 keine AES-Hardwareunterstützung bietet, da Broadcom und die Raspberry Pi Foundation keine kryptografischen ARMv8-Erweiterungen lizenzierten. Interessanterweise ist der Prozessor der Engpass des Systems auf dem Raspberry Pi 4, während die Engpässe des Raspberry Pi 3 USB 2.0 und Netzwerkschnittstellen waren.

Ein neuer Test netcatunter den gleichen Bedingungen ergab mit 104 Mb / s viel bessere Ergebnisse:

$ nc -l 6000 |dd bs=1m of=<destination> & ssh pi@master "dd bs=1M if=<source> | nc -q 0 $(hostname -I | awk '{print $1}') 6000"
[1] 71300 71301
1181+1 records in
1181+1 records out
1238558304 bytes (1.2 GB, 1.2 GiB) copied, 11.8632 s, 104 MB/s
0+740624 records in
0+740624 records out
1238558304 bytes transferred in 14.212518 secs (87145593 bytes/sec)
[1]  + 71300 done       nc -l 6000 |
       71301 done       dd bs=1m of=<destination>

Nachdem ich mich mit dem ersten SSD-Laufwerk befasst hatte, verband ich das zweite Laufwerk mit einer anderen Raspberry Pi 4- Karte . Ich werde dieses Laufwerk verwenden, um das erste mit etwas wie Restic zu sichern .

Darüber hinaus plane ich, SSDs zu verwenden, um den Start mithilfe des USB-Massenspeicher-Starts zu organisieren, unmittelbar nachdem der Raspberry Pi 4 diese Startmethode vollständig unterstützt. Im Vergleich zum Herunterladen von microSD verspricht es eine höhere Geschwindigkeit und ein stabileres Leistungsniveau.

Software


Ich bin Programmierer und dachte, es wäre für mich einfacher, mit dem Softwareteil des Clusters umzugehen als mit anderen Fragen. Die Ergebnisse der wunderbaren Arbeit des Rancher-Teams an k3s haben mir hier definitiv geholfen . Ich werde hier nicht näher auf das Einrichten eines Kubernetes-Clusters auf einem Raspberry Pi mit k3s eingehen. Für diejenigen, die interessiert sind, kann ich empfehlen, auf diesen Leitfaden zu verweisen . Hier sind die wichtigsten zu konfigurierenden Punkte, auf die ich näher eingehen möchte.

Aktivieren Sie zum Starten auf jedem Knoten cgroups:

$ sudo sed -i '$ s/$/ cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory/' /boot/cmdline.txt
$ sudo reboot

Installieren Sie dann k3s auf dem Hauptknoten:

$ curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644
#   
$ sudo systemctl status k3s

Jetzt erhalten wir ein Token, das die Verbindung von Arbeitsknoten mit dem Hauptknoten autorisiert:

$ sudo cat /var/lib/rancher/k3s/server/node-token

Weiter - Installieren Sie k3s auf jedem Arbeitsknoten:

$ curl -sfL https://get.k3s.io | K3S_URL="https://<MASTER_IP>:6443" K3S_TOKEN="<NODE_TOKEN>" sh -
#   
$ sudo systemctl status k3s-agent

Wenn Sie die standardmäßig installierte interne Registrierung von Container-Images verwenden möchten, müssen Sie diese möglicherweise auf besondere Weise konfigurieren, damit containerdBilder von ihr geladen werden können:

$ sudo sh -c 'REGISTRY=$(kubectl get svc -n kube-system registry -o jsonpath={.spec.clusterIP}); \
cat <<EOT >> /etc/rancher/k3s/registries.yaml
mirrors:
  "$REGISTRY":
    endpoint:
      - "http://$REGISTRY"
EOT'
$ sudo service k3s restart

Zukunftspläne


In diesem Material habe ich einige wichtige Themen nicht offengelegt, die einer ausreichend tiefen Analyse wert sind. Zum Beispiel Folgendes:

  • Software-Power-Management von Arbeitsknoten und automatische Cluster-Skalierung .
  • Installieren eines PWM-Lüfters und Anpassen seiner Drehzahl unter Berücksichtigung der Temperaturanzeigen des Systems.
  • Installieren Sie Pi-Hole mit MetalLB auf Kubernetes .

Vielleicht schreibe ich mehr darüber.

Darüber hinaus plane ich, die Arbeit am Cluster wie folgt fortzusetzen:


Ich bin mir sicher, dass ich viel vergessen habe, als ich über meine Erfahrungen bei der Erstellung des Kubernetes-Heimclusters sprach. Ich bin Programmierer und an eine eher heterogene Aufteilung großer Aufgaben in kleinere Fälle gewöhnt. Die Erfahrung hat gezeigt, dass Hardware in Bezug auf Versuch und Irrtum viel weniger tolerant ist als Software.

Je mehr ich herausfinde, desto größer ist im Allgemeinen die Bewunderung für mich durch moderne Hardware- und Softwaretechnologien. Es wundert mich, wie der Einfallsreichtum einer Person elektrische Phänomene und Programmiersprachen kombinieren konnte, was sie zu einem Beispiel dafür macht, wie das Bewusstsein die Materie kontrolliert.

Liebe Leser! Haben Sie versucht, etwas Ähnliches zu tun, wie es der Autor dieses Artikels beschrieben hat?


All Articles