Debugging
Ziel
In diesem Hands-On lernen Sie, wie Sie Probleme in einem Kubernetes-Cluster debuggen können. Sie werden:
- die Logs von Pods und Systemkomponenten analysieren
- den Status von Nodes und Pods überprüfen
- häufige Fehlerursachen identifizieren und beheben
Hilfsmittel
- Versuchen Sie, die unten stehenden Aufgaben mit Hilfe der Schulungsunterlagen und Ihres bisherigen Wissens aus den vorherigen Labs eigenständig zu lösen.
- Sollten Sie dabei Probleme haben, finden Sie bei jeder Aufgabe einen ausklappbaren Block, in dem der Lösungsweg beschrieben wird.
Szenario 1
1.1: Initialisieren
- Führen Sie das Script
destructor-1.shaus.
1.2: Umgebung aufsetzen
Sie haben festgestellt, dass der worker-1 eine hohe Auslastung hat, während worker-0 kaum ausgelastet ist. Es scheinen auch einige Services instabil zu sein. Sie möchten die Ursache für die hohe Auslastung und die Instabilität der Services herausfinden.
- Starten Sie ein Testdeployment mit 10 Replikas:
kubectl create deployment nginx-test --image=nginx --replicas=10
- Beobachten Sie ob sich die Pods auf den beiden Workern unterschiedlich verhalten.
- Lösen Sie die Ursache für die hohe Auslastung auf
worker-1und die Instabilität der Services.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
- Mit
kubectl get pods -o widekönnen Sie sehen, auf welchen Nodes die Pods laufen. - Die Pods werden nur auf
worker-1geplant - Mit
kubectl get nodessehen Sie, dassworker-0alsNotReadymarkiert ist. - Mit
kubectl describe node worker-0sehen Sie, dass es auf dem Worker einen Fehler mit containerd gibt. - Loggen Sie sich auf
worker-0ein und lassen Sie sich den Status von containerd anzeigen:systemctl status containerd - Starten Sie containerd:
systemctl start containerd - Die Node sollte jetzt wieder
Readysein. - Skalieren Sie das Deployment auf 20 Replikas:
kubectl scale deployment nginx-test --replicas=20 - Beobachten Sie, dass die Pods jetzt auf beide Worker verteilt werden.
- Skallieren Sie das Deployment anschließend wieder auf 0 Replikas, damit es keine Ressourcen im Cluster verbraucht:
kubectl scale deployment nginx-test --replicas=0
Szenario 2
2.1: Initialisieren
- Führen Sie das Script
destructor-2.shaus.
2.2: Umgebung aufsetzen
- Skalieren Sie das Deployment
nginx-deploymentauf 5 Replikas:
kubectl scale deployment nginx-deployment --replicas=5
- Beobachten Sie was passiert.
- Finden Sie heraus warum die Pods nicht starten und lösen Sie das Problem.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
- Mit
kubectl get podssehen Sie, dass die Pods imPendingStatus sind. - Mit
kubectl describe pod <pod-name>sehen Sie, dass es keine Events gibt, die auf einen Fehler bei der Planung hinweisen. - Mit
kubectl get pods -n kube-systemsehen Sie, dass derkube-schedulerProbleme hat. - Mit
kubectl logs -n kube-system <kube-scheduler-pod-name>sehen Sie keine Logs, da der Scheduler gar nicht startet. - Mit
kubectl describe pod <kube-scheduler-pod-name> -n kube-systemsehen Sie, dass das Binary des Schedulers nicht gefunden wird. - Loggen Sie sich auf der Controlplane Node ein und prüfen Sie den Inhalt des
/etc/kubernetes/manifestsVerzeichnisses. - Das Manifest des Schedulers verweist auf ein nicht existierendes Binary.
- Korrigieren Sie den Pfad zum Binary zu
kube-schedulerund speichern Sie die Datei. - Der Scheduler sollte jetzt starten und die Pods sollten geplant werden.
Szenario 3
3.1: Initialisieren
- Führen Sie das Script
destructor-3.shaus.
3.2: Umgebung aufsetzen
- Skalieren Sie das Deployment
nginx-deploymentauf 5 Replikas:
kubectl scale deployment nginx-deployment --replicas=5
- Erstellen Sie einen Service für das Deployment:
kubectl expose deployment nginx-deployment --port=80 --target-port=80
- Testen Sie den Service mit einem temporären Pod:
kubectl run test -it --image=alpine --rm -- sh
wget -O- nginx
- Der Service ist nicht erreichbar. Finden Sie heraus warum und lösen Sie das Problem.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
- Mit
kubectl get podssehen Sie, dass die Pods imRunningStatus sind. - Mit
kubectl get svcsehen Sie, dass der Service eine ClusterIP hat. - Machen Sie ein wget auf die ClusterIP des Services, z.B.
wget -O- <cluster-ip>. - Der Service ist erreichbar, aber nur über die IP-Adresse, nicht über den DNS-Namen
nginx. - Mit
kubectl get pods -n kube-systemsehen Sie, dass dercorednsPod Probleme hat. - Mit
kubectl logs -n kube-system <coredns-pod-name>sehen Sie, dass es ein Problem mit der Konfiguration von CoreDNS gibt. - Mit
kubectl get configmap -n kube-system coredns -o yamlsehen Sie, dass die Konfiguration von CoreDNS fehlerhaft ist. - Mit
kubectl edit configmap -n kube-system corednskönnen Sie die Konfiguration von CoreDNS korrigieren.- Ersetzen Sie
readyyyydurchreadyund speichern Sie die Datei.
- Ersetzen Sie
- Sobald die Konfiguration korrigiert ist, sollte der DNS-Name
nginxauflösbar sein und der Service sollte erreichbar sein.
Szenario 4
4.1: Initialisieren
- Führen Sie das Script
destructor-4.shaus.
4.2: Debuggen
- Versuchen Sie eine der folgenden Aktionen durchzuführen und beobachten Sie die Fehlermeldungen:
kubectl get nodeskubectl get pods
- Beheben Sie den Fehler und erlangen Sie wieder Zugriff auf den Cluster.
Lösung (Klicken Sie auf den Pfeil, falls Sie nicht weiterkommen)
- Mit
kubectl get nodessehen Sie, dass Kubernetes keine Verbindung zum API-Server herstellen kann. - Mit
crictl pssehen Sie, dass der kube-apiserver nicht läuft. - Nutzen Sie
crictl ps -aum auch die gestoppten Container zu sehen und identifizieren Sie den Container des kube-apiservers. - Mit
crictl logs <kube-apiserver-container-id>sehen Sie, dass der kube-apiserver wegen eines Fehlers in seinem Command-Argument nicht startet. - Öffnen Sie die Manifest-Datei des kube-apiservers unter
/etc/kubernetes/manifests/kube-apiserver.yamlund korrigieren Sie den Fehler im Command-Argument.- Ersetzen Sie
allow-privileged=trueeeedurchallow-privileged=trueund speichern Sie die Datei.
- Ersetzen Sie
- Der kube-apiserver sollte jetzt starten und der Cluster sollte wieder erreichbar sein.