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:
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:
- 2 x WLAN-Router (https://www.tp-link.com/us/products/details/cat-5506_TL-WR802N.html)
- EdgeRouterX (https://www.ubnt.com/edgemax/edgerouter-x/)
- UP-Board (http://www.up-board.org/)
- Und natürlich jede Menge Raspberry PI’s…
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
- Hypriot OS Die Hypriot-Piraten stellen regelmäßig aktualisierte Images bereit - Vielen Dank dafür!
- Docker - ist bereits vorinstalliert auf dem Hypriot-Image
- Kubernetes - (kubeadm)
- Docker Registry-Mirror
- Ansible
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:
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…
Die bee42 Crew