Warum läuft mein Pod nicht?
Läuft ein Pod in Kubernetes nicht, sagt sein Status schon, in welche Richtung Sie suchen müssen: Pending, ImagePullBackOff oder CrashLoopBackOff. Mit kubectl describe und kubectl logs finden Sie dann den genauen Grund.
Das Rechenzentrum eines Stadtwerks meldet morgens drei Programme als „nicht bereit“. Wer die Statuswörter kennt, braucht für jedes nur eine Minute.
Am Ende dieser Lektion
Notiz
Ich kann mit describe und logs den Fehler eines Pods benennen.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Pending | der Pod ist angelegt, aber noch auf keinem Knoten gestartet | |
| ImagePullBackOff | das Image lässt sich nicht holen, Kubernetes wartet und versucht es erneut | |
| CrashLoopBackOff | das Programm startet, endet mit Fehler und wird immer wieder gestartet | |
| describe | der Befehl, der ein Objekt mit seinen Ereignissen beschreibt | kubectl describe pod |
| logs | der Befehl, der ausgibt, was das Programm selbst geschrieben hat | kubectl logs |
| Ereignis | eine Meldung von Kubernetes darüber, was mit einem Objekt geschah |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Der Status sagt, wo Sie suchen müssen
Die Spalte STATUS von kubectl get pods ist die erste Spur. Jedes Wort steht für eine andere Phase.
Wir legen im Namespace kurs5 drei Programme an, die jeweils auf eigene Art scheitern. Das erste nennt ein Image, das es nicht gibt. Das zweite verlangt 100 Kerne, mehr als die Maschine hat. Das dritte liest eine Datei, die nicht da ist.
Den Namespace kurs5 anlegen
kubectl create namespace kurs5Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein Deployment mit falschem Image-Tag anlegen
kubectl create deployment bild -n kurs5 --image=busybox:1.99.0 -- sleep 3600Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Einen Pod anlegen, der 100 Kerne verlangt
kubectl run gross -n kurs5 --image=busybox:1.37.0 --overrides='{"spec":{"containers":[{"name":"gross","image":"busybox:1.37.0","command":["sleep","3600"],"resources":{"requests":{"cpu":"100"}}}]}}'Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein Deployment anlegen, das eine fehlende Datei liest
kubectl create deployment absturz -n kurs5 --image=busybox:1.37.0 -- sh -c 'cat /etc/einstellung/app.conf'Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Warten Sie, bis der Fehler sichtbar wird
Ein Pod braucht etwas Zeit, bis sein Fehler im Status steht. Warten Sie gut eine halbe Minute und drücken Sie dann Ausführen. Steht noch ContainerCreating, warten Sie weiter.
Der Befehl zeigt dann drei Pods mit drei verschiedenen Status. Die Namen der Pods enden bei jedem Lauf anders.
Die Pods in kurs5 anzeigen
kubectl get pods -n kurs5Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Statuswort, Bedeutung und erster Schritt
| Status | Bedeutung | Erster Schritt |
|---|---|---|
| ErrImagePull oder ImagePullBackOff | Das Image lässt sich nicht holen | describe lesen: Name und Tag prüfen |
| Pending | Kein Knoten nimmt den Pod auf | describe lesen: Ereignis FailedScheduling |
| Error oder CrashLoopBackOff | Das Programm endet mit Fehler | logs lesen |
| ContainerCreating | Der Container wird noch gebaut | Einige Sekunden warten |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
describe nennt die Ereignisse eines Pods
kubectl describe pod gibt viel aus. Die wichtigste Stelle steht ganz unten im Abschnitt Events: die Meldungen von Kubernetes, älteste oben.
Die Befehle unten filtern aus dieser Ausgabe nur die Zeilen, die den Grund nennen. Beim ersten steht der Name des Images, das sich nicht holen ließ. Beim zweiten steht, welche Ressource fehlt.
Die Meldung zum Image lesen
kubectl describe pod -n kurs5 -l app=bild | grep "Failed to pull image" | head -n 1Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Meldung des Schedulers lesen
kubectl describe pod gross -n kurs5 | grep FailedSchedulingHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
logs zeigt, was das Programm selbst sagt
Ein Pod, der startet und endet, hat eine eigene Meldung. Das Programm schreibt sie, nicht Kubernetes. Sie steht in den Logs.
kubectl logs deployment/absturz gibt die Meldung des Programms aus. Hier sagt sie, welche Datei fehlt.
Die Logs des abgestürzten Programms lesen
kubectl logs -n kurs5 deployment/absturzHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein häufiger Fehler
Warnung
Viele denken, kubectl logs helfe bei jedem kaputten Pod. Ein Pod im Status Pending oder ImagePullBackOff hat nie ein Programm gestartet. Also gibt es auch keine Logs. Lesen Sie in diesen Fällen kubectl describe. Logs gibt es erst, wenn das Programm wenigstens einmal lief.
Den Namespace kurs5 wieder löschen
kubectl delete namespace kurs5Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.