- Authors

- Name
- Phillip Pham
- @ddppham
Node NotReady: Kubelet, CNI, Pressure
TL;DR
NotReady heißt: die Control Plane hat zu lange kein gesundes Lebenszeichen von diesem Node. Neue Pods sollen dort nicht landen. Laufende Pods werden nach der Grace-Zeit evicted oder hängen. Zuerst die Bedingungen, nicht ein einzelnes Deployment:
kubectl describe node NODE
kubectl get nodes
Unter Conditions: Ready False, plus der Grund. KubeletNotReady und ein Text wie container runtime is down oder cni plugin not initialized. MemoryPressure und DiskPressure sind voll, nicht tot. Pods, die deshalb gehen: Pod Evicted. Übersicht, wenn nur ein Pod klemmt: Pod startet nicht.
Ready kommt vom Kubelet
Der Node bleibt Ready, solange das Kubelet die Node-Lease erneuert und seine Conditions meldet. Stoppt das Kubelet, wird Ready nach node-monitor-grace-period (Default 40 Sekunden, in der Praxis oft etwa eine Minute bis der Status kippt) False. Der Node ist dann noch in der Liste. Er ist nur nicht benutzbar.
Auf dem Node selbst: systemctl status kubelet und der Journal. Häufig stirbt das Kubelet, weil die Container-Runtime nicht antwortet, das Zertifikat des Kubelets abgelaufen ist, oder die Platte so voll ist, dass es seinen Status nicht mehr schreiben kann. Ein volles /var erklärt NotReady und Eviction gleichzeitig.
Von außen, ohne SSH, sehen Sie nur die letzte Condition und Unschedulable. Reicht der Text Kubelet stopped posting node status, ist der nächste Schritt Zugang zum Node, nicht ein weiteres kubectl delete pod.
CNI und die Runtime
Network plugin returns error: cni plugin not initialized macht den Node NotReady oder lässt Pods in ContainerCreating mit FailedCreatePodSandBox. Das CNI-Pod auf diesem Node muss laufen, bevor Workload-Pods ein Netz bekommen. Nach einem Node-Neustart ist die Reihenfolge: Runtime, Kubelet, CNI, dann erst Ihre Deployments.
container runtime is down ist containerd oder CRI-O, nicht das Deployment. systemctl status containerd auf dem Node. Solange die Runtime tot ist, hilft kein Image-Pull und kein neues Replica.
Pressure ist Ready oder nicht
DiskPressure und MemoryPressure können True sein, während Ready noch True ist. Der Scheduler meidet den Node für neue Pods, das Kubelet evicted welche. Erst wenn das Kubelet selbst nicht mehr meldet, kippt Ready. Wer nur auf NotReady wartet, übersieht die Evictions eine Stufe vorher.
kubectl top node braucht metrics-server. Ohne ihn bleiben die Conditions der Beleg. Allocatable gegen Allocated im describe zeigt die Reservierung, nicht die volle Platte. Die volle Platte steht in der Condition DiskPressure und im Text dahinter.
Pods von einem toten Node
Ein Pod bleibt Running in der API, obwohl der Node weg ist, bis das Kubelet das Gegenteil meldet oder die Control Plane ihn abreißt. kubectl delete pod --force --grace-period=0 ist hier der Fall aus Pod Terminating: der Node kommt nicht zurück, das API-Objekt muss weg, damit das Replica woanders entsteht. Auf einem Node, der gleich wieder Ready wird, löscht dasselbe Kommando einen Pod, dessen Prozess noch schreibt.
Quellen
📖 Verwandte Artikel
Weitere interessante Beiträge zu ähnlichen Themen
ContainerCreating hängt: Volume, Sandbox, CNI
ContainerCreating hängt: der Pod hat einen Node, der Container startet nicht. FailedMount, Pod-Sandbox und CNI stehen in den Events, nicht in den Logs.
Pod Evicted: Disk, Memory, ephemeral-storage
Pod Evicted beheben: Node-Druck auf Disk, Memory oder ephemeral-storage. Der Unterschied zu OOMKilled, und warum der Ersatz-Pod auf demselben Node fliegt.
kubectl connection refused 6443 beheben
kubectl connection refused auf Port 6443: der API-Server antwortet nicht. kubeconfig, Kontext, Firewall, API-Prozess. Der Pod-Status kommt erst danach.
Error from server Forbidden: RBAC-Recht
kubectl Forbidden: Error from server (Forbidden) nennt User, Verb und Ressource. kubectl auth can-i zeigt das Recht, bevor jemand cluster-admin vergibt.
CreateContainerConfigError: Secret und ConfigMap
CreateContainerConfigError: fehlendes Secret, falscher Key oder Namespace. Der Container startet nicht, logs --previous bleibt leer. Das Event nennt das Objekt.
Kubernetes DNS fehlgeschlagen: CoreDNS, ndots
Kubernetes DNS fehlgeschlagen: CoreDNS-Pods, das Service-ClusterIP und ndots:5. Wann ein Name im Cluster auflöst und wann die NetworkPolicy UDP 53 schluckt.
Exit Code 1: die erste Zeile im Previous-Log
Exit Code 1 auf Kubernetes: die Anwendung beendet sich selbst. kubectl logs --previous zeigt die Zeile. Speicher, Image-Pull und SIGKILL sind andere Codes.
Exit Code 143: SIGTERM und Graceful Shutdown
Exit Code 143 ist SIGTERM: 128 plus 15. Beim Rollout ist das normal. Im Loop fehlt ein Handler oder die Grace-Period ist kürzer als der Stopp der Anwendung.