https://kubernetes.io/docs/tasks/debug/
Debugging in Kubernetes, besonders im Zusammenhang mit der Certified Kubernetes Application Developer (CKAD) Prüfung, erfordert ein tief gehendes Verständnis der verschiedenen Ressourcen und deren Zusammenspiel. Ziel ist es, Probleme schnell zu identifizieren und zu beheben.
Über kubectl get pods den Status der Pods überprüfen.
Nicht laufende Pods mit kubectl describe pod [POD_NAME]
untersuchen.
Mit kubectl logs [POD_NAME] die Ausgabe der Container
ansehen, um Fehlermeldungen oder andere Hinweise zu identifizieren.
Falsche Konfigurationen können zu Fehlern führen. Konfigurationen mit
kubectl get und kubectl describe
überprüfen.
kubectl exec nutzen, um in einen Container einzusteigen
und Netzwerk-Tools wie ping oder curl zu
verwenden.
kubectl top verwenden, um CPU- und Speicherauslastung zu
überwachen.
kubectl get - Ressourcen auflistenkubectl describe - Detaillierte Informationen zu
Ressourcenkubectl logs - Logs von Container anzeigenkubectl exec - Kommandos in einem Container
ausführenkubectl top - Ressourcennutzung anzeigenkubectl-BefehlsreferenzEffektives Debugging in Kubernetes setzt voraus, dass man mit
kubectl effizient arbeitet, ein gutes Verständnis für
Pod-Status und -Lebenszyklen hat, und weiß, wie man Logs und Metriken
zur Fehlersuche heranzieht.
Dieser Leitfaden hilft Benutzern, Anwendungen zu debuggen, die in Kubernetes bereitgestellt wurden und sich nicht korrekt verhalten. Dies ist kein Leitfaden für Personen, die ihren Cluster debuggen möchten. Für diesen Zweck sollten Sie diesen Leitfaden anschauen.
Der erste Schritt bei der Fehlersuche ist die Triage. Was ist das Problem? Liegt es an Ihren Pods, Ihrem Replication Controller oder Ihrem Service?
Der erste Schritt beim Debuggen eines Pods besteht darin, ihn sich anzusehen. Überprüfen Sie den aktuellen Zustand des Pods und kürzliche Ereignisse mit dem folgenden Befehl:
kubectl describe pods ${POD_NAME}
Schauen Sie sich den Zustand der Container im Pod an. Laufen sie alle? Gab es kürzlich Neustarts? Fahren Sie mit dem Debugging fort, abhängig vom Zustand der Pods.
Wenn ein Pod im Status “Pending” stecken bleibt, bedeutet dies, dass
er nicht auf einem Knoten eingeplant werden kann. In der Regel liegt
dies daran, dass nicht genügend Ressourcen eines Typs vorhanden sind,
die die Planung verhindern. Schauen Sie sich die Ausgabe des Befehls
kubectl describe ... oben an. Dort sollten Nachrichten vom
Scheduler stehen, warum Ihr Pod nicht eingeplant werden kann. Gründe
können sein:
hostPort: Wenn Sie einen Pod an einen
hostPort binden, gibt es eine begrenzte Anzahl von Orten,
an denen der Pod eingeplant werden kann. In den meisten Fällen ist
hostPort unnötig. Versuchen Sie, ein Service-Objekt zu
verwenden, um Ihren Pod freizugeben. Wenn Sie hostPort
benötigen, können Sie nur so viele Pods einplanen, wie es Knoten in
Ihrem Kubernetes-Cluster gibt.Wenn ein Pod im Status “Waiting” feststeckt, wurde er einem
Worker-Knoten zugewiesen, kann aber auf dieser Maschine nicht ausgeführt
werden. Auch hier sollte die Information aus
kubectl describe ... aufschlussreich sein. Der häufigste
Grund für im Status “Waiting” feststeckende Pods ist ein Fehler beim
Herunterladen des Images.
Es gibt drei Dinge zu überprüfen:
docker pull <image>
aus.Sobald Ihr Pod eingeplant wurde, stehen die in Debug Running Pods beschriebenen Methoden zum Debuggen zur Verfügung.
Wenn sich Ihr Pod nicht so verhält, wie Sie es erwarten, könnte es
sein, dass es einen Fehler in Ihrer Pod-Beschreibung gab (z.B. die
mypod.yaml-Datei auf Ihrem lokalen Rechner), und dass der
Fehler stillschweigend ignoriert wurde, als Sie den Pod erstellt haben.
Oft ist ein Abschnitt der Pod-Beschreibung falsch verschachtelt oder ein
Schlüsselname ist falsch getippt, und so wird der Schlüssel
ignoriert.
Das Erste, was Sie tun sollten, ist, Ihren Pod zu löschen und ihn
erneut mit der Option --validate zu erstellen.
Zum Beispiel:
kubectl apply --validate -f mypod.yamlWenn Sie command als commnd falsch
geschrieben haben, gibt kubectl einen Fehler wie diesen
aus:
I0805 10:43:25.129850 46757 schema.go:126] unknown field: commnd I0805 10:43:25.129973 46757 schema.go:129] this may be a false alarm, see https://github.com/kubernetes/kubernetes/issues/6842 pods/mypod
Das Nächste, was zu überprüfen ist, ob der Pod auf dem apiserver mit dem Pod übereinstimmt, den Sie erstellen wollten (z.B. in einer yaml-Datei auf Ihrem lokalen Rechner). Zum Beispiel:
kubectl get pods/mypod -o yaml > mypod-on-apiserver.yamlund dann manuell die ursprüngliche Pod-Beschreibung mit der, die Sie
vom apiserver zurückbekommen haben, vergleichen,
mypod-on-apiserver.yaml. Es wird typischerweise einige
Zeilen in der “apiserver”-Version geben, die nicht in der
Originalversion sind. Dies ist zu erwarten. Wenn es jedoch Zeilen im
Original gibt, die nicht in der apiserver-Version sind, könnte dies auf
ein Problem mit Ihrer Pod-Spezifikation hinweisen.
Replication Controller sind ziemlich unkompliziert. Sie können entweder Pods erstellen oder nicht. Wenn sie keine Pods erstellen können, beziehen Sie sich bitte auf die oben genannten Anweisungen, um Ihre Pods zu debuggen.
Sie können auch
kubectl describe rc ${CONTROLLER_NAME}verwenden, um Ereignisse im Zusammenhang mit dem Replication Controller zu inspizieren.
Services bieten Lastausgleich über eine Reihe von Pods. Es gibt mehrere häufige Probleme, die dazu führen können, dass Services nicht richtig funktionieren. Die folgenden Anweisungen sollten helfen, Probleme mit Services zu debuggen.
Zuerst überprüfen Sie, ob es Endpunkte für den Service gibt. Für
jedes Service-Objekt stellt der apiserver eine
endpoints-Ressource zur Verfügung. Sie können diese
Ressource mit folgendem Befehl anzeigen:
kubectl get endpoints ${SERVICE_NAME}Stellen Sie sicher, dass die Endpunkte mit der Anzahl der Pods übereinstimmen, von denen Sie erwarten, dass sie Mitglieder Ihres Services sind. Zum Beispiel, wenn Ihr Service für einen nginx-Container mit 3 Replikaten ist, würden Sie erwarten, drei verschiedene IP-Adressen in den Endpunkten des Services zu sehen.
Und Sie können im Container des PODs eine Shell starten:
kubectl exec webserver -- /bin/bashWenn Ihnen Endpunkte fehlen, versuchen Sie, Pods mit den Labels aufzulisten, die der Service verwendet. Stellen Sie sich vor, Sie haben einen Service, bei dem die Labels sind:
.
.
.
spec:
selector:
name: nginx
type: frontendSie können
kubectl get pods --selector=name=nginx,type=frontend
verwenden, um Pods aufzulisten, die zu diesem Selector passen.
Überprüfen Sie, ob die Liste mit den Pods übereinstimmt, von denen Sie
erwarten, dass sie Ihren Service bereitstellen.
Überprüfen Sie, ob der containerPort des Pods mit dem
targetPort des Services übereinstimmt.