54 Fehlerbehebung auf Cluster-Ebene in Kubernetes

Cluster troubleshooting

Troubleshooting auf Cluster-Ebene in Kubernetes erfordert ein methodisches Vorgehen, bei dem Systemkomponenten, Infrastruktur und Konfiguration sorgfältig geprüft werden, um den einwandfreien Betrieb des Clusters zu gewährleisten.

54.1 Systemkomponenten überprüfen

54.1.1 Control Plane Status

Verwendung von kubectl get componentstatus um den Status der Control Plane Komponenten zu überprüfen.

54.1.2 Node Zustand

kubectl get nodes zeigt den Status aller Knoten im Cluster an.

54.1.3 Systemlogs

Überprüfung der Logs von Kubernetes-Diensten auf den Master-Knoten, oft unter /var/log.

54.2 Infrastrukturprobleme diagnostizieren

54.2.1 Netzwerkverbindungen

Netzwerk-Tools wie ping, traceroute oder netstat verwenden, um Verbindungsprobleme zu identifizieren.

54.2.2 Storage Probleme

Überprüfen der Persistent Volumes und Storage Classes auf Fehlkonfigurationen oder Verbindungsprobleme.

54.2.3 Hardware-Ressourcen

Überwachung der Hardware-Ressourcennutzung wie CPU, Speicher und Festplattenplatz.

54.3 Cluster-Konfiguration überprüfen

54.3.1 API-Server Zugänglichkeit

Stellen Sie sicher, dass der Kubernetes API-Server von den Knoten aus erreichbar ist.

54.3.2 Sicherheitseinstellungen

Überprüfen der Role-Based Access Control (RBAC) Einstellungen und Netzwerkrichtlinien.

54.3.3 Etcd Gesundheit

Überprüfen der etcd-Cluster mit etcdctl cluster-health oder etcdctl endpoint health.

54.4 Hilfreiche Befehle

54.5 Tipps für Cluster-Debugging

54.6 Troubleshooting Nodes

54.6.1 Einführung

Das Troubleshooting von Nodes in einem Kubernetes-Cluster ist entscheidend, um die Stabilität und Verfügbarkeit von Anwendungen sicherzustellen. Nodes können aus verschiedenen Gründen ausfallen oder Probleme verursachen, wie z. B. Ressourcenengpässe, Konfigurationsfehler oder Hardwareprobleme. Dieses Kapitel behandelt die häufigsten Methoden und Werkzeuge zur Fehlerbehebung bei Nodes in einem Kubernetes-Cluster.

54.6.2 Überblick

Die häufigsten Probleme, die bei Nodes auftreten können, umfassen:

54.6.3 Werkzeuge zur Fehlerbehebung

54.6.4 Schritt-für-Schritt-Anleitung

54.6.4.1 1. Node-Status überprüfen

Verwenden Sie kubectl, um den Status aller Nodes im Cluster zu überprüfen:

kubectl get nodes

Achten Sie auf den STATUS-Spalte. Nodes sollten im Ready-Status sein. Beispielausgabe:

NAME           STATUS   ROLES    AGE   VERSION
node-1         Ready    <none>   10d   v1.21.0
node-2         Ready    <none>   10d   v1.21.0
node-3         NotReady <none>   10d   v1.21.0

54.6.4.2 2. Details eines Nodes anzeigen

Um detaillierte Informationen über einen Node zu erhalten, verwenden Sie den Befehl kubectl describe node <node-name>:

kubectl describe node node-3

Überprüfen Sie die Ausgabe auf Hinweise auf Ressourcenprobleme, Netzwerkprobleme oder andere Fehler.

54.6.4.3 3. Node-Logs überprüfen

Verwenden Sie SSH, um sich mit dem betroffenen Node zu verbinden und die Logs der relevanten Dienste zu überprüfen. Insbesondere sollten Sie die Logs des Kubelet-Dienstes und des Container-Runtime-Dienstes (z. B. Docker) untersuchen.

Beispiel für das Überprüfen der Kubelet-Logs:

ssh user@node-3
sudo journalctl -u kubelet -f

Beispiel für das Überprüfen der Docker-Logs:

sudo journalctl -u docker -f

54.6.4.4 4. Ressourcenüberprüfung

Überprüfen Sie die Ressourcenverfügbarkeit (CPU, Speicher, Speicherplatz) auf dem Node:

CPU und Speicher:

top

Festplattenspeicher:

df -h

Falls der Node Ressourcenengpässe aufweist, sollten Sie Maßnahmen ergreifen, um die Last zu reduzieren oder zusätzliche Ressourcen bereitzustellen.

54.6.4.5 5. Netzwerküberprüfung

Stellen Sie sicher, dass der Node Netzwerkzugriff auf die Master-Nodes und andere Nodes im Cluster hat. Überprüfen Sie die Netzwerkkonfiguration und führen Sie Netzwerkdiagnosetools wie ping und traceroute aus.

Beispiel:

ping <master-node-ip>
traceroute <master-node-ip>

54.6.4.6 6. Pod-Probleme untersuchen

Überprüfen Sie die Pods, die auf dem betroffenen Node laufen, um festzustellen, ob sie ebenfalls Probleme haben:

kubectl get pods --all-namespaces -o wide | grep <node-name>

Untersuchen Sie die Logs und Events der betroffenen Pods:

kubectl logs <pod-name>
kubectl describe pod <pod-name>

54.6.4.7 7. Node erneut starten

Falls das Problem weiterhin besteht, versuchen Sie, den Node neu zu starten:

ssh user@node-3
sudo reboot

Nach dem Neustart können Sie erneut überprüfen, ob der Node im Ready-Status ist.

54.6.5 Beispiel: Fehlersuche bei einem NotReady-Node

  1. Überprüfen Sie den Node-Status:
kubectl get nodes
  1. Zeigen Sie die Details des betroffenen Nodes an:
kubectl describe node node-3
  1. Überprüfen Sie die Kubelet-Logs:
ssh user@node-3
sudo journalctl -u kubelet -f
  1. Überprüfen Sie die Ressourcenverfügbarkeit:
ssh user@node-3
top
df -h
  1. Stellen Sie sicher, dass der Node Netzwerkzugriff hat:
ping <master-node-ip>
traceroute <master-node-ip>
  1. Überprüfen Sie die Pods auf dem Node:
kubectl get pods --all-namespaces -o wide | grep node-3
kubectl logs <pod-name>
kubectl describe pod <pod-name>
  1. Starten Sie den Node erneut:
ssh user@node-3
sudo reboot

Das Troubleshooting von Nodes in einem Kubernetes-Cluster erfordert eine systematische Herangehensweise zur Identifizierung und Behebung von Problemen. Durch den Einsatz von kubectl, direkten Node-Logs und Netzwerküberprüfungen können Administratoren schnell die Ursache von Problemen identifizieren und entsprechende Maßnahmen ergreifen. Regelmäßige Überprüfungen und eine gute Überwachungsstrategie helfen dabei, potenzielle Probleme frühzeitig zu erkennen und die Verfügbarkeit des Clusters zu gewährleisten.

54.7 Troubleshooting Networking

54.7.1 Einführung

Netzwerkprobleme in Kubernetes können sich auf die Kommunikation zwischen Pods, Services und externen Endpunkten auswirken. Das Netzwerkmodell in Kubernetes ist komplex und umfasst verschiedene Ebenen und Komponenten, die miteinander interagieren. In diesem Kapitel werden die häufigsten Netzwerkprobleme und deren Behebung beschrieben.

54.7.2 Überblick

Die häufigsten Netzwerkprobleme in Kubernetes umfassen:

54.7.3 Werkzeuge zur Fehlerbehebung

54.7.4 Schritt-für-Schritt-Anleitung

54.7.4.1 1. Pod-zu-Pod Kommunikation überprüfen

Überprüfen Sie die Netzwerkverbindung zwischen zwei Pods. Starten Sie dafür ein temporäres Test-Pod:

kubectl run -i --tty --rm debug --image=busybox --restart=Never -- sh

Versuchen Sie, die IP-Adresse eines anderen Pods zu pingen:

ping <pod-ip>

Wenn das Ping nicht erfolgreich ist, könnte es ein Problem mit dem Netzwerk-Plugin oder den Netzwerkregeln geben.

54.7.4.2 2. Service-Erreichbarkeit prüfen

Überprüfen Sie, ob ein Service innerhalb des Clusters erreichbar ist. Starten Sie ein temporäres Pod und verwenden Sie curl oder wget:

kubectl run -i --tty --rm debug --image=busybox --restart=Never -- sh

Versuchen Sie, den Service zu erreichen:

wget -qO- http://<service-name>.<namespace>.svc.cluster.local:<port>

Wenn der Service nicht erreichbar ist, überprüfen Sie die Service-Definition und die zugehörigen Endpunkte:

kubectl get svc
kubectl describe svc <service-name>
kubectl get endpoints

54.7.4.3 3. DNS-Auflösung überprüfen

Wenn DNS-Probleme vorliegen, können Pods möglicherweise keine anderen Dienste im Cluster finden. Überprüfen Sie die DNS-Konfiguration und die DNS-Server-Logs.

Überprüfen Sie die DNS-Auflösung in einem Pod:

kubectl run -i --tty --rm debug --image=busybox --restart=Never -- sh

Verwenden Sie nslookup, um die DNS-Auflösung zu testen:

nslookup <service-name>.<namespace>.svc.cluster.local

Wenn die DNS-Auflösung fehlschlägt, überprüfen Sie die Logs des DNS-Servers (CoreDNS oder kube-dns):

kubectl logs -n kube-system -l k8s-app=kube-dns

54.7.4.4 4. Netzwerk-Latenz und Paketverlust prüfen

Verwenden Sie ping und traceroute, um Netzwerk-Latenz und Paketverlust zwischen Pods und Nodes zu überprüfen:

kubectl run -i --tty --rm debug --image=busybox --restart=Never -- sh

Verwenden Sie ping:

ping <target-ip>

Verwenden Sie traceroute:

traceroute <target-ip>

54.7.4.5 5. Überprüfen der Netzwerk-Plugins

Wenn Sie ein Netzwerk-Plugin wie Calico, Flannel oder Weave verwenden, überprüfen Sie, ob die entsprechenden Pods und DaemonSets korrekt laufen:

kubectl get pods -n kube-system -l k8s-app=calico-node
kubectl get pods -n kube-system -l app=flannel
kubectl get pods -n kube-system -l name=weave-net

Überprüfen Sie die Logs der Netzwerk-Plugin-Pods:

kubectl logs -n kube-system <plugin-pod-name>

54.7.5 Beispiel: Fehlerbehebung bei nicht erreichbarem Service

  1. Service-Details anzeigen:
kubectl get svc
kubectl describe svc <service-name>
  1. Endpunkte überprüfen:
kubectl get endpoints
kubectl describe endpoints <service-name>
  1. DNS-Auflösung testen:
kubectl run -i --tty --rm debug --image=busybox --restart=Never -- sh
nslookup <service-name>.<namespace>.svc.cluster.local
  1. Netzwerk-Plugin-Status überprüfen:
kubectl get pods -n kube-system -l k8s-app=kube-dns
kubectl logs -n kube-system <dns-pod-name>
  1. Direkte Service-Erreichbarkeit testen:
kubectl run -i --tty --rm debug --image=busybox --restart=Never -- sh
wget -qO- http://<service-name>.<namespace>.svc.cluster.local:<port>

Netzwerkprobleme in Kubernetes können verschiedene Ursachen haben, von fehlerhaften Netzwerk-Plugins bis hin zu DNS-Fehlern. Durch den systematischen Einsatz von Tools wie kubectl, ping, traceroute, nslookup und das Überprüfen von Logs können Administratoren die Ursache von Netzwerkproblemen schnell identifizieren und beheben. Eine solide Überwachungs- und Fehlerbehebungsstrategie hilft, die Netzwerkverfügbarkeit und die Gesamtleistung des Clusters sicherzustellen.