Kubernetes Cluster auf Raspberry PIs

Kubernetes ist in aller Munde

Viele Entwickler und Administatoren interssieren sich gerade für Kubernetes. In allen großen Clouds ist Kuberentes verfügbar. Allerdings ist die Cloud für kleine Geldbeutel auf die Dauer etwas teuer. Um einfach mal verschiedene Experimente mit Kubernetes zu wagen gibt es doch bestimmt günstigere Weg die Spaß machen.

Die Idee

Wir bauen einen kompletten Kubernetes-Cluster auf Embedded-Hardware. Dazu benutzen wir einen EdgeRouterX, 2 WLAN-Router, 2 Switche, ein Intel UP-Board und für den eigentlichen K8S-Cluster Raspberry Pi’s.

Schematisch soll es so aussehen:

Layout

Ein WLAN-Router stellt die Verbindung zum Internet her, den könnnt Ihr natürlich auch durch ein Kabel zu Eurem vorhanden Router ersetzen. Der EdgeRouterX ist für DHCP und DNS zuständig, und über den WLAN-Accesspoint können sich mehrere Leute mit der Umgebung verbinden. Dieses Setup benutzen wir gerne in Trainings und Workshops. Die verbleibende zentrale Komponente ist die Registry bzw. der Registry-Mirror auf dem Up-Board. Dieses hat eine Atom-CPU und ist um einiges performanter als die RPi’s.

Unsere Hardware

Wir Ihr seht, ist also einiges an Hardware erforderlich. Die einzelnen Komponeten sind aber gar nicht sooo teuer :), bei vielen von Euch sind wahrscheinlich auch schon etliche Teile vorhanden.

Hier kurz die Liste der verwendeten Komponenten:

wlan-router edge-router up-board layout

Weitere Infos+Links für die verwendeten Bauteile findet Ihr in unserem Github-Repo

Der Ablauf

Der eigentliche Ablauf, um Kubernetes auf die RPIs zu bringen, besteht aus wenigen Schritten:

  • Flashen der SD-Cards mit einem passenden OS-Image mit Docker
  • Erstellen eines Verzeichnisses mit allen Rechnern, die in den Cluster sollen
  • Installation von Kubernetes. Dazu haben wir ein kleines Installationsscript geschrieben.

Die verwendete Software

Vorbereitung der Raspberry PI’s

Wir benötigen für Kubernetes eine unterstützte Docker Version, in diesem Fall Docker CE 17.03. Das passende Image dazu hat die Versionsnummer v1.4.0. Wir haben natürlich auch andere Kombinationen ausprobiert, aber spätestens beim Installieren des Netzwerklayers kam es zu Inkompatibilitäten.

Flashen des OS-Images

Am einfachsten funktioniert das flashen mit dem Flash-Tool der Hyprioten (Die Installation des Flash-Programme haben wir auf Github näher beschrieben!)

$ flash -n "MY_HOSTNAME" hypriotos-rpi-v${HOS_VERSION}.img


Raspberry-Pi’s starten

Nach dem Einsetzen der Karten könnt Ihr die Raspberry-PI starten. Nun könnt Ihr Euch zum Test mit dem PI per SSH verbinden.

$ ssh pirate@<ip>

Das Passwort für den Nutzer pirate lautet: hypriot.

Frage: Wie bekommt man eigentlich heraus welche IP dem PI vom DHCP Server zugeordnet wurde?

Wenn Ihr es nicht auf Eurem Router/DHCP-Server nachschauen könnt, geht das am einfachsten mit einem Netzwerk-Scan:

# install nmap
$ brew install nmap
$ nmap -sn 192.168.1.0/24 # Durch Euer Netz ersetzen


Kubernetes-Cluster installieren

Vorbereitung

Zur Ausführung unseres Installationsscripts auf den einzelen RPIs benutzen wir Ansible.

Wir brauchen zuerst ein Inhaltsverzeichnis, in dem die verwendeten IP-Adressen der zukünftigen Cluster-Nodes stehen. Wir haben mehrere Cluster, deshalb ist die Konfiguration etwas größer angelegt. Hier ein Auszug für Cluster-1:

inventory.ini

[cluster-1-master]
192.168.1.11

[cluster-1-nodes]
192.168.1.12
192.168.1.13

[cluster-1:children]
cluster-1-master
cluster-1-nodes

[cluster-1:vars]
fqdn_master="bee42-crew-01-001.bee42"
network_address_master="192.168.1.11"

[master:children]
cluster-1-master

[nodes:children]
cluster-1-nodes


Ansible verbindet sich per SSH auf die zu verwaltenden Rechner, dort muss also Euer öffentlicher SSH-Key hinterlegt sein. Falls Ihr das noch nicht bereits erledigt habt, könnt Ihr das jetzt nachholen.

Hier ein kleines Beispiel:

# Schlüssel erzeugen
$ ssh-keygen -t ed25519 -C "name@example.org"

# Öffentlichen Schlüssel auf alle RPIs kopieren
$ ssh-copy-id pirate@192.168.1.11
$ ssh-copy-id pirate@192.168.1.12
...

# und testen:

$ ansible -u pirate --key=PATH_TO_MY_PRIVATE_KEY -m ping all
192.168.1.11 | success >> {
    "changed": false, 
    "ping": "pong"
}

192.168.1.12 | success >> {
    "changed": false, 
    "ping": "pong"
}


Cluster erzeugen

So, wenn alle Vorbereitungen abgeschlossen sind, kann der Kubernetes-Cluster erzeugt werden. Ein Raspberry PI pro Cluster wird zum Master, die restlichen PIs werden die Nodes.

$ ansible-playbook -u pirate --key=PATH_TO_MY_PRIVATE_KEY -i cluster -l cluster-1 kubernetes.yml


Dadurch werden folgende Schritte ausgeführt:

  • Die benötigte Pakete werden heruntergeladen und installiert.
  • Auf dem Master-Rechner wird per kubeadm init die Kubernetes-Installation gestartet
  • Der Weave-Netzwerk-Layer für Kubernetes wird installiert
  • Eine kleine Datei kubeadm_join wird erzeugt und heruntergeladen. Darin steht das Kommando, um einen weiteren Node zu dem Cluster hinzuzufügen
  • Auf allen Nodes wird danach das entsprechende Join-Kommando ausgeführt

Noch ein wichtiger Hinweis: In unserem Script wird die Verwendung eines lokalen Registry-Mirrors eingerichtet. Dadurch müssen die Container-Images nur einmal zentral heruntergeladen werden und nicht von jedem einzelnen RPi selbst. Das müsstet Ihr ggf. anpassen/auskommentieren.

Im Ordner secrets findet Ihr danach die Config-Datei für Kubernetes, oder Ihr springt auf den Master-Rechner und könnt dort als Root (sudo -i) dann Euren Cluster per kubectl verwalten. Also z.B. alle Nodes anzeigen mit

$ kubectl get nodes

Und so sieht übrigens alles fertig aufgebaut aus:

Layout
Wenn Ihr Euch das genauer ansehen wollt: Alle Dateien stehen auf Github bereit.

Viel Spaß mit dem Aufbau und besucht uns auf einem unser Container Lab mit Kubernetes zum ausprobieren. Wir kommen auch gerne zu Euch mit einem InHouse-Training…

KubernetesLoveRaspberryPI

Die bee42 Crew

"Um unsere Webseite für Sie optimal zu gestalten und fortlaufend verbessern zu können, verwenden wir Cookies. Durch die weitere Nutzung der Webseite stimmen Sie der Verwendung von Cookies zu. Weitere Informationen zu Cookies erhalten Sie in unserer Datenschutzerklärung."