Das Prinzip
Egal ob lokal auf dem Laptop oder remote auf Cloud-Servern: Du steuerst deine Cluster immer mit demselben Tool: kubectl. Lokal eignen sich Tools wie Minikube, Kind oder k3d. Für die Cloud nutzen wir ein schlankes k3s auf Hetzner via HTTPS (Port 6443).
Lokal testen oder Cloud steuern
Pods laufen hier
ssh root@…)
00 Lokale Kubernetes-Installation & Deinstallation
Wenn du Kubernetes erst einmal gebührenfrei auf deinem Laptop testen möchtest, ohne Cloud-Ressourcen zu nutzen, hast du unter Windows (mit Docker Desktop, Podman oder WSL2) drei hervorragende Optionen.
Dieselbe Idee in zwei Größen – und die eine Zeile, für die es in Kubernetes bewusst keine Entsprechung gibt.
Zeichnung aus Diagramme: Hetzner & CRC (21).
depends_on: was dort eine Zeile ist, wird hier
zur Anforderung an den Dienst selbst.Variante A: Minikube (Der Einsteiger-Standard)
Minikube startet eine vollständige Single-Node-Kubernetes-VM oder einen Container auf deinem Rechner.
# Installation per winget
winget install Kubernetes.minikube
# Cluster starten (nutzt Docker, WSL2 oder Hyper-V)
minikube start
# Status pruefen
kubectl get nodes
minikube dashboard # Oeffnet das grafische Kubernetes-Dashboard im Browser
# Cluster loeschen & Daten/VM-Dateien bereinigen
minikube delete --all --purge
# CLI-Tool deinstallieren
winget uninstall Kubernetes.minikube
Variante B: Kind (Kubernetes in Docker)
Kind verwendet Docker-Container als Cluster-Nodes. Es ist extrem schnell hochgefahren und ideal für lokale CI/CD-Tests.
# Installation per winget
winget install Kubernetes.kind
# Cluster erstellen
kind create cluster --name lokales-k8s
# Status pruefen
kubectl cluster-info --context kind-lokales-k8s
# Cluster loeschen
kind delete cluster --name lokales-k8s
# CLI-Tool deinstallieren
winget uninstall Kubernetes.kind
Variante C: k3d (k3s in Docker – Perfekt als Vorbereitung auf Hetzner)
k3d verpackt k3s (das wir später auf Hetzner nutzen) in Docker-Container. Damit testest du exakt dieselbe Kubernetes-Distribution lokal.
# Installation per winget
winget install k3d
# Local k3s-Cluster erstellen
k3d cluster create mein-k3s --ports "8080:80@loadbalancer"
# Status pruefen
kubectl get nodes
# Cluster loeschen
k3d cluster delete mein-k3s
# CLI-Tool deinstallieren
winget uninstall k3d
kubectl verwaltest du über Kontexte. So wechselst du beliebig hin und her:
kubectl config get-contexts # Alle verfuegbaren Cluster anzeigen
kubectl config use-context minikube # Auf lokalen Minikube wechseln
kubectl config use-context default # Auf Hetzner k3s wechseln
01 Voraussetzung: Server-Basis
Konto, API-Token, hcloud CLI, SSH-Key, Firewall-Prinzip und die Skripte –
der einmalige Teil steht in einer eigenen Anleitung.
Server-Basis
durcharbeiten. Für k3s zusätzlich in der Firewall Port 6443
(kube-API) auf deine IP freigeben. Werkzeuge: kubectl + helm.
02 cloud-init: die k3s-Zeile
cloud-init läuft beim ersten Boot einmalig. Es installiert k3s als
Server-Node. --tls-san trägt die öffentliche IP ins API-Zertifikat ein.
#cloud-config
package_update: true
runcmd:
- 'IP=$(curl -s http://169.254.169.254/hetzner/v1/metadata/public-ipv4); curl -sfL https://get.k3s.io | sh -s - server --write-kubeconfig-mode 644 --tls-san "$IP"'
03 Server erstellen
Ein Befehl. Server bootet in Sekunden, k3s ist ~60–90 s später bereit.
hcloud server create `
--name k3s-host `
--type cpx22 `
--image ubuntu-24.04 `
--ssh-key laptop `
--firewall k3s-fw `
--user-data-from-file cloud-init.yaml
hcloud server ip k3s-host # IP anzeigen -> oben ins Feld "Server-IP"
04 Cluster prüfen & Host-Key bestätigen
ssh root@<IP> "k3s kubectl get nodes"
05 kubeconfig auf den Laptop holen & KUBECONFIG verstehen
Die kubeconfig sagt kubectl wo der Cluster ist. k3s schreibt sie mit 127.0.0.1 – die tauschen wir gegen die IP.
New-Item -ItemType Directory -Force $env:USERPROFILE\.kube | Out-Null
scp root@<IP>:/etc/rancher/k3s/k3s.yaml $env:USERPROFILE\.kube\k3s-hetzner.yaml
(Get-Content $env:USERPROFILE\.kube\k3s-hetzner.yaml) -replace '127\.0\.0\.1','<IP>' |
Set-Content $env:USERPROFILE\.kube\k3s-hetzner.yaml
$env:KUBECONFIG = "$env:USERPROFILE\.kube\k3s-hetzner.yaml"
kubectl get nodes # muss den Node zeigen
Die kubeconfig-Datei (YAML) ist der Schlüsselbund für deinen Cluster. Sie enthält drei Hauptbestandteile:
- clusters: Wo liegt der API-Server? (URL, IP, Port 6443, CA-Zertifikat).
- users: Wie authentifiziere ich mich? (Client-Zertifikate, Tokens, Passwörter).
- contexts: Verknüpft einen User mit einem Cluster und einem Default-Namespace.
Die Umgebungsvariable $env:KUBECONFIG: Standardmäßig sucht kubectl unter ~/.kube/config. Mit der Variable legst du fest, welche Konfigurationsdatei genutzt werden soll.
Mehrere Cluster verwalten (Merged Config): Du kannst mehrere Dateien verknüpfen:
$env:KUBECONFIG = "$env:USERPROFILE\.kube\config;$env:USERPROFILE\.kube\k3s-hetzner.yaml"
kubectl config use-context default # Zwischen Clustern umschalten
06 Erste Workload & Ports
kubectl create deployment web --image=nginx
kubectl expose deployment web --port=80 --type=LoadBalancer
kubectl get svc web # EXTERNAL-IP wird die Server-IP (k3s ServiceLB)
07 Updates & Manifeste
Vom Hostnamen bis zum Prozess – und die Stelle, an der die Readiness-Probe darüber entscheidet, ob es klappt.
Zeichnung aus Diagramme: Hetzner & CRC (23).
- Manifeste versionieren: YAML in einen Ordner,
kubectl apply -f . - Auto-Deploy auf dem Server: Dateien in
/var/lib/rancher/k3s/server/manifests/legen. - k3s aktualisieren:
ssh root@<IP> "curl -sfL https://get.k3s.io | sh -"
+ Was Kubernetes übernimmt & Vergleich mit Alternativen
Keine Befehle, die ausgeführt werden – nur Schleifen, die vergleichen. Das ist der ganze Trick.
Zeichnung aus Diagramme: Hetzner & CRC (22).
| Objekt | Rolle |
|---|---|
Pod | kleinste Einheit – 1+ Container, die zusammengehören |
Deployment | „halte N Repliken dieses Pods am Leben“ |
Service | stabile Adresse + Lastverteilung |
Ingress | HTTP-Router von außen rein |
Kubernetes (k8s / k3s) im Vergleich zu anderen Orchestrierungs-Lösungen
| Eigenschaft | Docker Compose | Docker Swarm | Kubernetes (k8s / k3s) | HashiCorp Nomad | Serverless / PaaS (Cloud Run) |
|---|---|---|---|---|---|
| Zielgruppe | Lokale Dev-Umgebung, Single-Node | Einfache Multi-Node Cluster | Komplexe, skalierbare Multi-Node Workloads | Flexibler Orchestrator (Container & VMs) | Zero-Ops, Event-Driven Webapps |
| Komplexität | Sehr niedrig | Niedrig | Hoch (bei k3s mittel) | Mittel | Sehr niedrig (nur Code/Container liefern) |
| Multi-Node / HA | Nein (nur 1 Host) | Ja (integriert) | Ja (Standard) | Ja (sehr performant) | Cloud-Provider übernimmt alles |
| Auto-Healing & Scaling | Nur Container-Neustart | Begrenzt (Replication) | Sehr stark (HPA, VPA, Node-Autoscaling) | Gut (über externe Telemetrie) | Automatisch bis auf 0 Skalierbar |
| Ökosystem | Klein | Mittel (stagniert) | Riesig (Standard-De-Facto, Helm, Operators) | Mittel (HashiCorp-Welt) | Anbieter-gebunden (Lock-in) |
| Ressourcenbedarf | Minimal | Gering | K8s: hoch (~2GB RAM) / k3s: gering (~512MB RAM) | Sehr gering | N/A (Pay-per-Use) |
Fazit: Docker Compose reicht für einfache Setups auf einem Server. Sobald du aber Ausfallsicherheit, automatisches Rollout, feingliedriges Scaling, selbstheilende Container und breite Tool-Unterstützung (CI/CD, Monitoring, Service Mesh) auf mehreren Servern brauchst, führt kein Weg an Kubernetes (k3s) vorbei.
+ Mehrere Nodes
ssh root@<IP> "cat /var/lib/rancher/k3s/server/node-token"
+ Kosten steuern
Hetzner rechnet stundenweise ab. Bei Nichtgebrauch Server löschen oder Snapshots nutzen.
+ Absicherung
- API nur von deiner IP – durch Firewall schützen.
- Node-Token geheim halten.
+ Kill-Switch: Vergessen darf nichts kosten
.\scripts\k3s.ps1 up # aus letztem Snapshot, kubeconfig holen
.\scripts\k3s.ps1 down # stoppt k3s, macht Snapshot + loescht Server
+ Andere Anbieter
k3s läuft auf jeder Linux-VM (DigitalOcean, Scaleway, Linode, AWS etc.).