Kubernetes
Kubernetes (K8s) führt Container über einen Cluster hinweg aus, hält die festgelegte Anzahl von Replikaten betriebsbereit und plant GPU-Trainings- und Inferenzaufträge ein.
Kubernetes, oft zu K8s abgekürzt, ist ein Open-Source-System, das containerisierte Anwendungen auf einem Maschinencluster ausführt. Nutzer geben den gewünschten Zustand einer Arbeitslast an, etwa welches Container-Image ausgeführt werden soll, wie viele Kopien laufen sollen und wie viel CPU-, Arbeitsspeicher- und GPU-Kapazität jede Kopie benötigt. Kubernetes startet, startet neu, verschiebt und skaliert Container fortlaufend, bis der gewünschte Zustand erreicht ist. Google kündigte das Projekt im Juni 2014 an und stützte sich dabei auf den internen Cluster-Manager Borg. Mit Version 1.0 im Juli 2015 stellte Google Kubernetes als Startprojekt der neu gegründeten Cloud Native Computing Foundation bereit. Der Name ist griechisch für Steuermann; K8s steht für die acht Buchstaben zwischen K und s. In Machine-Learning-Betrieb (MLOps) dient Kubernetes als gängige Basis für verteilte Trainings-Jobs, Stapelinferenz und die Bereitstellung von Modellen auf gemeinsam genutzter Hardware.
Architektur und Regelkreis#
Ein Cluster besteht aus einer Steuerungsebene und Worker-Knoten. Die Steuerungsebene umfasst den API-Server, mit dem alle Clients kommunizieren, den etcd-Speicher für den Clusterzustand, den Scheduler, der neuen Pods Knoten zuweist, und Controller, die jeweils einen Objekttyp überwachen. Auf jedem Worker-Knoten – ob vor Ort betriebener Server oder virtuelle Cloud-Maschine – laufen ein kubelet-Agent und eine Container-Laufzeitumgebung wie containerd oder CRI-O. Die kleinste von Kubernetes eingeplante Einheit ist ein Pod: ein oder mehrere Container, die sich eine Netzwerkadresse und Speichervolumes teilen.
Arbeitslasten werden als Objekte definiert, meist in YAML, und mit kubectl angewendet. Ein Deployment hält eine festgelegte Anzahl identischer Pods am Laufen und ersetzt sie schrittweise, wenn sich das Image ändert. Ein Service weist diesen Pods eine stabile Adresse zu und verteilt Anfragen auf sie. Ein Job führt Pods aus, bis eine Aufgabe abgeschlossen ist. Controller vergleichen den definierten Zustand mit dem tatsächlich laufenden Zustand und beheben Abweichungen:
Derselbe Regelkreis sorgt dafür, dass Kubernetes sich selbst repariert. Fällt ein Knoten aus, scheiden dessen Pods aus dem laufenden Zustand aus, und der Controller erstellt Ersatz auf funktionsfähigen Knoten. Ein Pod, der mangels Kapazität im Status Pending verbleibt, signalisiert den automatischen Clusterskalierern ebenfalls, dass weitere Knoten hinzugefügt werden müssen.
Kubernetes für maschinelles Lernen#
GPUs werden Pods über Geräte-Plug-ins zur Verfügung gestellt, die sie als zählbare Ressource wie nvidia.com/gpu anbieten, sowie über Dynamic Resource Allocation. Diese Funktion ist seit Kubernetes 1.34 stabil und ermöglicht es einem Pod, Geräte anhand von Merkmalen wie GPU-Modell oder Arbeitsspeicher anzufordern. Der GPU Operator von NVIDIA installiert Treiber und Plug-ins auf GPU-Knoten und kann eine GPU in Multi-Instance-GPU-Slices aufteilen oder ihre Zeit zwischen Pods aufteilen. OpenAI berichtete 2021, einzelne Kubernetes-Cluster für das Training von Modellen wie GPT-3 und CLIP auf 7.500 Knoten skaliert zu haben.
Open-Source-Projekte ergänzen Kubernetes um spezifische Funktionen für maschinelles Lernen:
- Kubeflow: Führt verteiltes PyTorch-Training, ML-Pipelines und Notebooks auf einem Cluster aus.
- Kueue: Reiht Stapel- und Trainings-Jobs in eine Warteschlange ein und setzt Teamkontingente durch. So bleiben kostspielige GPUs ausgelastet, ohne dass ein Team sie alle beansprucht.
- KServe: Stellt Modelle über Endpunkte mit automatischer Skalierung bereit, die bei Nichtnutzung bis auf null skaliert werden können.
- Horizontal Pod Autoscaler: Fügt Inferenzreplikate hinzu oder entfernt sie anhand der CPU-Auslastung oder eigener Messwerte wie der Warteschlangenlänge. So bleibt die Latenz bei schwankendem Datenverkehr konstant.
Ein Job ist die einfachste Möglichkeit, eine einmalige GPU-Aufgabe wie Batch-Inferenz auszuführen. Das offizielle Docker-Image von Ultralytics enthält bereits den Befehl yolo und Gewichte für YOLO26 nano. Dieser Job legt daher nur einen Befehl fest und fordert eine GPU an:
apiVersion: batch/v1
kind: Job
metadata:
name: yolo26-predict
spec:
backoffLimit: 2 # retry a failed pod at most twice
template:
spec:
restartPolicy: Never
containers:
- name: yolo
image: ultralytics/ultralytics:latest
command: ["yolo", "predict", "model=yolo26n.pt", "source=https://ultralytics.com/images/bus.jpg"]
resources:
limits:
nvidia.com/gpu: 1 # schedule only onto a node with a free GPUMit kubectl apply -f job.yaml wird der Job eingereicht. Der Scheduler platziert den Pod auf einem Knoten mit einer freien GPU, und kubectl logs job/yolo26-predict gibt die Ergebnisse der Objekterkennung im Vorhersagemodus aus. Ein Trainings-Job folgt demselben Muster und ergänzt ein dauerhaftes Volume für Prüfpunkte sowie ein speicherinternes Volume unter /dev/shm für PyTorch-Datenlader-Worker.
Kubernetes im Vergleich zu Docker und Serverless#
- Docker: Erstellt Images und führt Container auf einem Rechner aus. Kubernetes verteilt Container auf viele Rechner. Seit Version 1.24 führt es mit Docker erstellte Images über containerd oder CRI-O statt über Docker Engine aus.
- Serverless Computing: Dienste wie Google Cloud Run und AWS Lambda verbergen den Cluster vollständig und berechnen die Kosten pro Anfrage. Knative bringt dasselbe Modell mit Skalierung bis auf null in Kubernetes-Cluster.
- Verwaltetes Kubernetes: Google Kubernetes Engine (GKE), Amazon Elastic Kubernetes Service (EKS) und Azure Kubernetes Service (AKS) betreiben die Steuerungsebene für ihre Kunden. GKE Autopilot verwaltet außerdem die Worker-Knoten.










