>_ DevTrendsde

Sprache

Start

Sprachen

Bereiche

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embedded Sicherheit
Go

Lokales Kubernetes in einer Minute ohne schwere VMs

Das Testen von Kubernetes-Manifesten oder Operatoren auf einem Remote-Cloud-Cluster ist teuer und langsam. Das Warten auf Builds, Pushes in die Registry und Deployment in eine Dev-Umgebung wird schnell lästig. Bisher wurden für lokale Tests häufig Minikube oder K3s verwendet. Aber wenn Sie schnelle Integrationstests in CI benötigen oder in Sekunden auf einem Laptop starten wollen, sind virtuelle Maschinen und zusätzliche Abstraktionsschichten einfach hinderlich.

Ingenieure der Kubernetes SIGs stießen 2018 auf dieses Problem, als sie Kubernetes selbst testen mussten. Dafür entwickelten sie kind (Kubernetes IN Docker).

kind logo

Das Tool war so erfolgreich, dass normale Entwickler begannen, es aktiv für die tägliche Arbeit und das Ausführen von CI/CD-Pipelines zu nutzen.

So funktioniert kind

Die Idee ist einfach. Anstatt vollständige virtuelle Maschinen für jeden Cluster-Knoten auszuführen, erstellt kind reguläre Docker-Container. In einem solchen Container laufen systemd, Container-Runtime und Kubernetes-Komponenten.

kubeadm übernimmt die Komponentenbereitstellung, sodass die Umgebung so nah wie möglich an einem echten Produktionscluster ist.

kind create cluster

Das Projekt ist in Go geschrieben und funktioniert überall, wo eine Container-Runtime läuft. Neben Docker werden auch Podman und nerdctl unterstützt, und es kann auf Linux, macOS und Windows ausgeführt werden.

Installation und Ausführung Ihres ersten Clusters

Wenn Sie bereits Go und Docker auf Ihrem System haben, ist das Starten eines grundlegenden Clusters buchstäblich ein Einzeiler:

go install sigs.k8s.io/[email protected] && kind create cluster

Wenn Sie Go nicht installieren möchten, lassen sich Binaries einfach über Standard-Paketmanager herunterladen.

Auf macOS:

brew install kind

Auf Linux:

curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.32.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind

Anschließend erstellt der Befehl kind create cluster einen Single-Node-Cluster. Das Tool konfiguriert automatisch Ihren kubectl und wechselt den Kontext zum neuen Cluster.

Überprüfen wir, ob es funktioniert:

kubectl get nodes

Wenn Sie den Cluster nicht mehr benötigen, löschen Sie ihn mit dem Befehl kind delete cluster.

Multi-Node-Cluster und erweiterte Konfiguration

Ein Single-Node-Cluster eignet sich gut für einfache Tests, aber echte Probleme in Kubernetes treten oft bei der Arbeit mit mehreren Nodes, Taints und Affinity auf. kind kann Cluster jeder Komplexität mit einer deklarativen Konfiguration erstellen.

Erstellen Sie eine kind-config.yaml-Datei:

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
role: control-plane
role: control-plane
role: control-plane
role: worker
role: worker

Führen Sie die Cluster-Erstellung mit der Konfigurationsdatei aus:

kind create cluster --config kind-config.yaml

Als Ergebnis erhalten Sie einen hochverfügbaren Cluster mit drei Control-Plane-Nodes und zwei Worker-Nodes auf Ihrem Rechner. Und das alles startet in regulären Containern ohne zusätzliche CPU-Last.

Schnelles Laden lokaler Images

Eine der praktischsten Funktionen für Entwickler ist das direkte Übergeben lokaler Docker-Images in den Cluster ohne private Registries.

Normalerweise sieht die Kette so aus: Image bauen, auf Docker Hub oder einen lokalen Nexus pushen, in den Cluster pullen. kind verkürzt diesen Schritt. Sie bauen ein Image lokal und laden es sofort in die Nodes:

docker build -t my-app:v1 .
kind load docker-image my-app:v1

Anschließend können Sie image: my-app:v1 und imagePullPolicy: Never bedenkenlos in Ihrem Applikations-Manifest angeben. Der Cluster sieht das Image sofort.

Wofür es in der Praxis nützlich ist

Das Projekt hat bereits über 15.000 Sterne auf GitHub gesammelt und ist zum De-facto-Standard für das Testen von Kubernetes-Infrastruktur geworden. Hier sind die wichtigsten Szenarien, in denen es Zeit spart:

  1. Integrationstests in CI. Das Starten von kind in GitHub Actions oder einem GitLab CI-Runner dauert Sekunden. Sie können mühelos einen frischen Cluster starten, Tests für ein Helm-Chart oder einen Operator ausführen und ihn direkt nach Abschluss der Pipeline löschen.
  2. Lokale Entwicklung von Controllern und Operatoren. Wenn Sie Ihre eigene CRD oder Ihren eigenen Operator in Go/Python schreiben, benötigen Sie schnelles Feedback. kind startet sofort und lässt sich leicht in einen sauberen Zustand zurückversetzen.
  3. Lernen und Experimente. Möchten Sie das Verhalten eines Ingress-Controllers, eines CNI-Plugins testen oder sehen, wie sich eine Anwendung verhält, wenn einer der Nodes ausfällt? Das Einrichten eines solchen Spielplatzes auf einem lokalen Laptop dauert ein paar Minuten.

Worauf Sie achten sollten

Bevor Sie starten, beachten Sie einige Feinheiten. kind wurde in erster Linie zum Testen entwickelt, versuchen Sie also nicht, es in der Produktion einzusetzen.

Beachten Sie, dass das Arbeiten mit lokalen Ports explizites Port-Forwarding in der Cluster-Konfiguration erfordert (extraPortMappings). Wenn Sie einen Service innerhalb von kind vom Host-Rechner aus erreichen müssen, müssen Sie die erforderlichen Ports vorab in der Konfigurationsdatei angeben.

Ansonsten ist kind ein großartiger Ersatz für klobige virtuelle Maschinen. Es ist schnell, vorhersehbar und ressourcenschonend.

Ähnliche Projekte