Zugriff auf microk8s in WSL2
Gerade für die Entwicklung und zum Testen bietet es sich im Kontext von Kubernetes an, auch eine lokale Umgebung zur Verfügung zu haben. Seit Docker Desktop für Firmen lizenzpflichtig geworden ist, ist diese Option weniger oft anzutreffen. Dabei sind nicht unbedingt die Kosten der entscheidende Faktor, sondern die mit der Beschaffung verbundene Komplexität und Aufwände.
Stattdessen bietet sich als Alternative an, mit der WSL zu arbeiten. Mit Ubuntu kommt auch eine leicht einzurichtende Kubernetest Distribution von Canonical mit: Microk8s. Microk8s bietet vergleichbar mit Minikube auch die Integration von verschiedene Addons um zum Beispiel einen Ingress einfach bereitzustellen.
$ microk8s enable ingress
Da Microk8s innerhalb der WSL läuft, ist die Integration nicht ganz so nahtlos, wie dies bei Docker Desktop gelungen ist. Wir werfen im folgenden einen Blick darauf, welche Optionen es gibt, auf den Microk8s bzw. Dienste zuzugreifen. Im Fokus steht dabei vor allem der Ingress, wird dieser schließlich auch sonst typischerweise für den Zugriff auf HTTP Dienste und Webanwendungen genutzt.
Port Forward
Da ein Kubernetes Cluster typischerweise nicht lokal läuft, ist der Zugriff auf somit entfernte Dienste kein Sonderfall, sondern alltäglches Geschäft.
So unterstützt das Werkzeug kubectl
auch den Zugriff auf Pods und Services.
Dazu muss eine entsprechende Berechtigung auf dem Kubernetes API Server vorliegen, kubectl lauscht dann auf einem lokalen Port und leitet die Verbindung weiter.
Dies funktioniert mit beliebigen Anwendungen, ist jedoch wenig effizient, da für jede neue TCP Verbindung eine entsprechende Weiterleitung eingerichtet werden muss.
Für den Zugriff auf den Ingress könnte das Kommando beispielsweise so aussehen:
$ kubect -n ingress port-forward service ingress 8080:80
Danach kann über http://localhost:8080 auf der Maschine, auf der das kubectl gestartet wurde, auf den Ingress im Cluster zugegriffen werden.
Entsprechende DNS Einträge oder Einträge in der hosts
Datei können beim Testen mehrerer Dienste helfen.
LoadBalancer Service
Eine weitere Möglichkeit besteht darin, den Ingress als Kubernetes Service vom Typ LoadBalancer bereitzustellen.
Dabei wird eine separate IP verwendet, über die dann zugegriffen wird.
Microk8s macht dies prinzipiell einfach, da auch hierfür ein Addon existiert.
$ microk8s enable metallb:192.168.1.200-192.168.1.220
Das funktioniert jedoch je nach Netzwerksetup und Windows nicht immer mit WSL2 zusammen.
Ingress Host-Port
Die Microk8s Ingress Addon Konfiguration verwendet automatisch Host-Ports, so dass eigentlich der Zugriff auch auf dem Windows Host über http://localhost funktionieren solte. Da macht jedoch die WSL einen Strich durch die Rechnung: Schließlich läuft eine gut getarnte virtuelle Maschine, die Linux bereitstellt und lediglich auf geschickte Weise in die Windows Welt eingebunden wird. Und genau hier klappt nicht alles, wie man es erwarten würde: Ubuntu stellt Microk8s durch eine eigene Containertechnologie, Snap, zur Verfügung. Innerhalb von Microk8s werden wiederum Container gestartet, um Kubernetes und auch die Ingress Implementierung bereitzustellen. Auf einer dieser Abstraktionsebenen klappt dann ggf. etwas nicht, den Port korrekt zu kommunizieren.
In den Setups, bei denen wir diese Probleme festgestellt haben, hat folgender Hack Abhilfe geschaffen: Unter dem WSL Ubuntu einfach den Port ohne Containertechnologien einfach nochmals verwenden. Dann merkt es auch das WSL und reicht den Port durch - an den Ingress, nicht den nachträglich gestarteten Prozess.
$ sudo netcal -vvvv -l 80
Zu den Themen Kubernetes, Docker und Cloudarchitektur bieten wir sowohl Beratung, Entwicklungsunterstützung als auch passende Schulungen an:
Auch für Ihren individuellen Bedarf können wir Workshops und Schulungen anbieten. Sprechen Sie uns gerne an.