>_ DevTrendsnl

Taal

Home

Talen

Secties

Frontend Backend Mobiel DevOps AI / ML GameDev Blockchain Embedded Beveiliging
Go

Lokale Kubernetes in een minuut zonder zware VM's

Kubernetes-manifesten of operators testen op een remote cloudcluster is duur en langzaam. Wachten op builds, pushes naar de registry en deployment naar een dev-omgeving wordt snel vervelend. Voorheen werden Minikube of K3s veel gebruikt voor lokale tests. Maar wanneer je snelle integratietests in CI moet draaien of binnen enkele seconden op een laptop wilt opstarten, staan virtuele machines en extra abstractielagen alleen maar in de weg.

Technici van Kubernetes SIGs liepen dit probleem al in 2018 tegen het lijf toen ze Kubernetes zelf moesten testen. Hiervoor schreven ze kind (Kubernetes IN Docker).

kind logo

Het tooltje bleek zo succesvol dat gewone ontwikkelaars het actief gingen gebruiken voor dagelijks werk en het draaien van CI/CD-pipelines.

Hoe kind werkt

Het idee is eenvoudig. In plaats van volledige virtuele machines voor elke clusternode, draait kind gewone Docker-containers. Binnen zo'n container draaien systemd, container runtime en Kubernetes-componenten.

kubeadm verzorgt de componentdeployment, dus de omgeving komt zo dicht mogelijk bij een echt productiecluster.

kind create cluster

Het project is geschreven in Go en werkt overal waar container runtime draait. Naast Docker worden Podman en nerdctl ondersteund, en het kan draaien op Linux, macOS en Windows.

Installatie en je eerste cluster draaien

Als je al Go en Docker op je systeem hebt, kost het opzetten van een basiscluster letterlijk één regel:

go install sigs.k8s.io/kind@v0.32.0 && kind create cluster

Als je Go niet wilt installeren, zijn binaries eenvoudig te downloaden via standaard package managers.

Op macOS:

brew install kind

Op 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

Daarna zal het kind create cluster commando een single-node cluster aanmaken. De utility zal automatisch je kubectl configureren en de context naar het nieuwe cluster schakelen.

Laten we verifiëren dat het werkt:

kubectl get nodes

Wanneer je het cluster niet meer nodig hebt, verwijder het dan met het kind delete cluster commando.

Multi-node clusters en geavanceerde configuratie

Een single-node cluster is prima voor eenvoudige tests, maar echte problemen in Kubernetes komen vaak naar voren bij het werken met meerdere nodes, taints en affinity. kind kan clusters van elke complexiteit opzetten met behulp van een declaratieve config.

Maak een kind-config.yaml bestand:

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

Voer clustercreatie uit met het config bestand:

kind create cluster --config kind-config.yaml

Als resultaat krijg je een highly available cluster met drie control-plane nodes en twee worker nodes op je machine. En dit alles draait op binnen gewone containers zonder extra belasting van je CPU's.

Snel laden van lokale images

Een van de meest handige functies voor ontwikkelaars is het direct doorgeven van lokale Docker-images naar het cluster zonder private registries.

Meestal ziet de keten er zo uit: bouw een image, push naar Docker Hub of een lokale Nexus, pull in het cluster. kind verkort deze stap. Je bouwt een image lokaal en laadt het direct in de nodes:

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

Daarna kun je veilig image: my-app:v1 en imagePullPolicy: Never specificeren in je applicatiemanifest. Het cluster zal de image direct zien.

Waar het in de praktijk handig voor is

Het project heeft inmiddels meer dan 15.000 sterren verzameld op GitHub en is de facto de standaard geworden voor het testen van Kubernetes-infrastructuur. Hier zijn de belangrijkste scenario's waar het tijd bespaart:

  1. Integratietesten in CI. Het opzetten van kind binnen GitHub Actions of een GitLab CI-runner kost seconden. Je kunt eenvoudig een vers cluster opzetten, tests uitvoeren voor een Helm chart of operator, en het direct na het voltooien van de pipeline verwijderen.
  2. Lokale ontwikkeling van controllers en operators. Wanneer je je eigen CRD of operator schrijft in Go/Python, heb je snelle feedback nodig. kind start direct op en kan eenvoudig naar een schone staat worden gereset.
  3. Leren en experimenteren. Wil je het gedrag van een Ingress controller testen, een CNI-plugin, of zien hoe een applicatie zich gedraagt wanneer een van de nodes uitvalt? Zo'n speeltuin opzetten op een lokale laptop kost een paar minuten.

Waar je op moet letten

Voor je begint, houd een paar nuances in gedachten. kind is primair gemaakt voor testen, dus probeer het niet in productie te gebruiken.

Merk op dat werken met lokale poorten expliciete poortforwarding in de clusterconfig vereist (extraPortMappings). Als je een service binnen kind vanaf de hostmachine moet bereiken, moet je de benodigde poorten vooraf in het configuratiebestand specificeren.

Anders is kind een geweldige vervanger voor logge virtuele machines. Het is snel, voorspelbaar en vriendelijk voor resources.

Gerelateerde projecten