kubectl get nodes shows NotReady
System Design practice on Codemia
Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.
Introduction
When kubectl get nodes shows NotReady, Kubernetes has stopped treating that node as healthy enough for normal scheduling. The fix is rarely a single magic command. You need to determine whether the problem is kubelet health, container runtime issues, node pressure, or broken networking between the node and the control plane.
Start With the Node Conditions
The NotReady label is only the summary. The useful detail lives in the node conditions and recent events.
In kubectl describe node, check the Conditions section for flags such as:
- '
Ready=False' - '
MemoryPressure=True' - '
DiskPressure=True' - '
PIDPressure=True' - '
NetworkUnavailable=True'
Those conditions narrow the investigation quickly. If you see DiskPressure, there is no point starting with CNI logs. If NetworkUnavailable is true, look at the network plugin before touching workload manifests.
Check the Kubelet and Container Runtime
A node becomes NotReady very quickly when kubelet stops posting status updates. On the node itself, inspect the two services that matter most: kubelet and the container runtime.
Typical kubelet problems include:
- certificate or authentication failures when talking to the API server
- inability to start pods because the runtime is down
- repeated CNI setup errors
- swap still enabled on Linux nodes that expect it off
If kubelet is down, fix that first and wait a minute before chasing anything else. Kubernetes cannot mark the node healthy when the agent responsible for reporting health is not functioning.
Rule Out Resource Pressure
Nodes under heavy resource pressure often show NotReady even though the operating system is technically up. Disk pressure is especially common on small worker nodes because images, logs, and writable layers accumulate faster than expected.
Useful corrective actions include cleaning unused images, rotating large logs, or resizing the node.
Do not blindly delete running containers or kubelet directories. If the node hosts stateful workloads, careless cleanup can turn a health issue into data loss.
Inspect the CNI Plugin and Network Path
If kubelet logs mention sandbox creation failures or NetworkUnavailable, inspect the CNI components. Most Kubernetes distributions run the CNI agents as DaemonSet pods in kube-system.
Replace calico-node with the correct DaemonSet name for your environment, such as Flannel, Cilium, or Weave.
Also confirm that the node can still reach the API server on the expected port and resolve cluster DNS if your bootstrap depends on it.
A firewall change, expired route entry, or broken VPN path can leave the node powered on but effectively isolated from the cluster.
Example Troubleshooting Flow
A practical sequence helps avoid random guessing:
Suppose the kubelet log contains repeated lines about image garbage collection failing because the disk is full. That points to DiskPressure. After cleanup, restart kubelet if necessary:
Then verify recovery from the control plane side:
If the node returns to Ready, the remediation was correct. If it remains NotReady, go back to the node conditions and events instead of trying unrelated changes.
Common Pitfalls
- Treating
NotReadyas a single error instead of checking the underlying node conditions. - Restarting workloads before checking whether kubelet or the container runtime is actually down.
- Ignoring disk pressure on nodes that build up large image caches.
- Looking only at application pods and forgetting that the CNI DaemonSet may be broken.
- Draining or deleting a node before confirming whether the problem is a small, reversible configuration issue.
Summary
- Start with
kubectl describe nodeand recent events, not guesswork. - Verify kubelet and the container runtime on the affected node.
- Check for memory, disk, and PID pressure before changing network settings.
- Inspect the CNI plugin when node conditions or kubelet logs point to networking.
- Confirm recovery with
kubectl get nodes -wafter each fix.
Related reading
- Kubectl get pods - How to filter pods by partial name
- kubectl get resources by label with OR operator
- kubectl get specific value from a secret in plaintext
- Kubectl how to work with different clusters contexts at the same time
- Kubectl kustomize edit can't find kustomization.yaml
- kubectl logs -f gets Authorization error
- kubectl jsonpath expression for named path
- kubectl logs - continuously

System Design Fundamentals
Build a strong foundation in designing scalable, reliable distributed systems.
View the courseTrack what you have practised
A free account saves your progress, solutions and study plan across every problem on Codemia.
System Design practice on Codemia
Work through 120+ system design problems with detailed solutions, from rate limiters to multi-region storage.