Mit diesen Informationen melden Sie sich mit dem Befehl ssh ubuntu@RasPi-IP von einem anderen Rechner im Netz aus auf einem der Mini-Computer an. Sofern Sie in der initialen Konfiguration der Raspberry Pi nichts verändert haben, geben Sie als Passwort ubuntu ein. Beim ersten Einloggen fragt das System nach einem neuen Passwort. Nach dessen Eingabe melden Sie sich fortan als Nutzer ubuntu mit dem neuen Passwort an.
Microk8s installieren
Um Microk8s installieren und verwenden zu können, benötigen Sie Cgroups. Die Bezeichnung steht für Control Groups, ein Linux-Kernel-Feature, das die Begrenzung verschiedener Ressourcen wie CPU, RAM, Disk I/O, Netzwerk und so weiter kontrolliert. Ursprünglich wurde das Cgroups-Feature von Google-Angestellten, allen voran Paul Menage und Rohit Seth, unter dem Namen Process Containers entwickelt. Gegen Ende 2007 hat sich der Name in Control Groups geändert, um die Mehrdeutigkeit des Container-Begriffs zu umgehen.
Da das Cgroups-Feature standardmäßig nicht aktiviert ist, müssen Sie es auf dem Ubuntu Server Image zunächst einmal in Betrieb nehmen. Dazu melden Sie sich via SSH auf dem Raspberry Pi an und passen die Boot-Parameter in der Datei nobtcmd.txt (früher: cmdline.txt) an. Sie starten einen Editor Ihrer Wahl mit Sudo-Rechten und fügen die Zeile cgroup_enable=memory cgroup_memory=1 in die Datei ein. Nach dem Speichern müssen Sie den Raspberry Pi neu starten, damit die Änderung greift. Da Sie ohnehin schon auf dem Raspberry Pi eingeloggt sind, klappt das am einfachsten mit dem Befehl sudo reboot.
Nach dem anschließenden Neustart installieren Sie die Microk8s-Distribution ganz einfach als Ubuntu-Snap [8]. Der Snap-Mechanismus von Canonical verfügt über ein Konzept namens Channel. Ein solcher Channel definiert, welches Release eines Snaps installiert und anschließend auf Updates überprüft wird. Der Microk8s-Snap folgt den Versionen des Upstream-Kubernetes, bei dem ein neues Release etwa alle drei Monate erscheint. Als dieser Artikel geschrieben wurde, war 1.19.3 die neueste Kubernetes-Version, sodass der entsprechende Microk8s-Snap sich mit dem Befehl aus der ersten Zeile von Listing 1 installieren ließ.
Nach Abschluss der Microk8s-Installation sorgen Sie für mehr Komfort bei der Bedienung auf der Kommandozeile [9]. Dazu fügen Sie das Benutzerkonto der Microk8s-Gruppe hinzu und passen den Eigentümer des Verzeichnisses ~/.kube/ an (Listing 1, Zeile 2 und 3) und starten anschließend Microk8s (Zeile 4 und 5). Ist die Installation ordnungsgemäß verlaufen, zeigt der Aufruf microk8s kubectl get nodes die aktuell verfügbaren Rechenknoten an – in diesem Fall genau einen Raspberry Pi, da wir noch keine weiteren Rechenknoten hinzugefügt haben (Zeile 19). Das Kommando microk8s kubectl get services gibt den Standard-Service kubernetes aus, da wir aktuell noch keine eigenen Kubernetes-Services angelegt haben (Zeile 22).
Listing 1
Initiales Benutzer-Setup
$ sudo snap installMicrok8s --classic --channel=1.18/stable $ sudo usermod -a -Gmicrok8s $USER $ sudo chown -f -R $USER ~/.kube $ su - $USER $ microk8s status --wait-ready microk8s is running addons: dashboard: disabled dns: disabled helm: disabled helm3: disabled ingress: disabled kubeflow: disabled metallb: disabled metrics-server: disabled rbac: disabled registry: disabled storage: disabled $ microk8s kubectl get nodes NAME STATUS ROLES AGE VERSION ubuntu Ready <none> 10m v1.18.0 $ microk8s kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 10m
Sieht die Ausgabe also wie in Listing 1 aus, kann man zu einer erfolgreichen Microk8s-Installation gratulieren. Möchten Sie einen Raspberry-Pi-Cluster aus mehreren Mini-Rechnern aufbauen, müssen Sie die gezeigten Schritte für jeden davon wiederholen.
Nginx-Deployment
Jetzt gilt es, sich die Vorzüge einer Kubernetes-Umgebung für das Deployment der eigentlichen Applikationen zunutze zu machen [10]. Wie das geht, soll am Beispiel des populären HTTP- und Reverse-Proxy-Servers Nginx [11] demonstriert werden. Zunächst legen Sie, wie in Listing 2 gezeigt, ein neues Kubernetes-Deployment an (Zeile 1). Es trägt den Namen my-nginx und verwendet das Nginx-Docker-Image.
Listing 2
Neues Kubernetes-Deployment
$ microk8s.kubectl create deployment my-nginx --image nginx deployment.apps/my-nginx created $ microk8s.kubectl get all NAME READY STATUS RESTARTS AGE pod/my-nginx-9b596c8c4-ngd2q 1/1 Running 0 12m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 47h NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/my-nginx 1/1 1 1 12m NAME DESIRED CURRENT READY AGE replicaset.apps/my-nginx-9b596c8c4 1 1 1 12m $ microk8s.kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 47h
Mit dem Unterbefehl get all (Zeile 4) lässt sich verifizieren, dass das Deployment tatsächlich erfolgreich angelegt wurde: Kubernetes zeigt nun ein Deployment namens deployment.apps/my-nginx sowie den dazugehörigen Pod pod/my-nginx-9b596c8c4-ngd2q an. Als Pod bezeichnet man die kleinste Einheit, die Kubernetes anlegen und verwalten kann. Technisch gesehen handelt es sich dabei um eine Gruppe aus einem oder mehreren Containern, die über gemeinsame Speicher- und Netzwerkressourcen verfügen sowie eine gemeinsame Spezifikation haben, die bestimmt, wie die Container ausgeführt werden sollen.
Wo aber kommt dieser Begriff her? Nun, im Kubernetes-Ökosystem werden häufig Docker-Container verwendet. Das Symbol und Maskottchen von Docker ist bekanntlich ein Wal. Die meisten Wale sind sehr gesellig, weisen ein hochentwickeltes Sozialverhalten auf und leben in Gruppen von meist 10 bis 50 Tieren. Im Deutschen bezeichnet man solche Walgruppen als Schulen, im Englischen als Pods. Somit ist also ein Kubernetes-Pod eine Anspielung auf eine Gruppe von Docker-Containern.
Mit Kubernetes lässt sich die Verfügbarkeit der Applikation quasi im Handumdrehen verbessern. Dazu erhöht man mit dem Parameter --replicas die Anzahl der Replicas in einem Kubernetes-Deployment. Listing 3 zeigt, wie das für das my-nginx-Deployment klappt (Zeile 1). Der anschließende Aufruf des Unterbefehls get all zeigt nun drei gerade laufende Pods (Zeile 4).
Listing 3
Anzahl der Replicas erhöhen
$ microk8s.kubectl scale deployment my-nginx --replicas 3 deployment.apps/my-nginx scaled $ microk8s.kubectl get all NAME READY STATUS RESTARTS AGE pod/my-nginx-9b596c8c4-4jp7d 1/1 Running 0 7s pod/my-nginx-9b596c8c4-7ql2q 1/1 Running 0 7s pod/my-nginx-9b596c8c4-ngd2q 1/1 Running 0 14m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 47h NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/my-nginx 3/3 3 3 14m NAME DESIRED CURRENT READY AGE replicaset.apps/my-nginx-9b596c8c4 3 3 3 14m
Kubernetes-Replicas legen fest, wie viele Pods parallel laufen sollen. Damit lässt sich einerseits die eigentliche Anwendung für den Fall skalieren, dass mehr Anfragen bedient werden müssen. Andererseits erhöhen Replicas die Verlässlichkeit, da der Absturz eines einzelnen Pods nicht gleich die ganze Anwendung gefährdet. Natürlich sind Replicas erst dann richtig sinnvoll, wenn die einzelnen Pods auf unterschiedlichen physikalischen Rechenknoten laufen – also nachdem Sie dem Microk9s-Cluster mehrere RasPis hinzugefügt haben.





