Read Kubernetes conditions like a pro
Kubernetes objects report their health through an array of status.conditions. Each condition has a type, a status of True, False or Unknown, plus a reason and message. This reference explains the everyday conditions across Pods, Nodes, Deployments, PVCs and Jobs, what each status means, and how to remediate it.
How it works
A condition is a standardised latch describing one aspect of an object’s state. The triad of values matters: True and False are deliberate assertions (for example PodScheduled=True means a node was assigned), while Unknown means the controller could not determine the answer — frequently because the component that reports it went silent.
Conditions also chain. A pod progresses through PodScheduled, then Initialized (init containers done), then ContainersReady, and finally Ready. A failure earlier in that chain blocks the later ones, so always read the first False condition rather than the last. View them with:
kubectl get pod my-pod -o jsonpath='{.status.conditions}'
kubectl describe pod my-pod
The reason and message fields shown by describe are where the actionable detail lives — Unschedulable, ProgressDeadlineExceeded, CrashLoopBackOff and so on.
Common condition reference
Pod conditions
| Condition | True means | False/Unknown means |
|---|---|---|
PodScheduled | A node was selected | No schedulable node found (resource pressure, taints) |
Initialized | All init containers completed | An init container failed or is still running |
ContainersReady | Every container passed its readiness probe | At least one container is not ready |
Ready | Pod can serve traffic | Follows from ContainersReady; excluded from Service endpoints |
Deployment conditions
| Condition | True means | False means |
|---|---|---|
Available | Enough ready replicas to satisfy minReadySeconds | Too few replicas are running |
Progressing | Rollout is moving forward | Deadline exceeded; check new ReplicaSet pods |
Node conditions
| Condition | True means | Action needed |
|---|---|---|
Ready | Kubelet is healthy and accepting pods | Unknown: check kubelet, node networking |
MemoryPressure | Available memory below eviction threshold | Reduce pod memory footprint or add capacity |
DiskPressure | Disk space below eviction threshold | Clear images, logs, or add storage |
PIDPressure | Process count near node limit | Check runaway processes or increase PID limits |
PVC conditions
| Condition | Meaning |
|---|---|
| Bound | Volume found and attached |
| Pending | No matching PV or provisioner; check StorageClass and capacity request |
Diagnostic commands
Sort cluster events to see condition transitions in time order:
kubectl get events --sort-by=.lastTimestamp
Inspect a pod’s exact condition JSON for the machine-readable reason:
kubectl get pod my-pod -o jsonpath='{.status.conditions}' | python3 -m json.tool
Check a deployment’s rollout status:
kubectl rollout status deployment/my-app
Tips and notes
- For nodes,
Ready=Unknownalmost always points at the kubelet or node networking rather than the workloads — check that the node is reachable and the kubelet service is running. - For deployments, watch both
Available(enough ready replicas) andProgressing(rollout moving) — a healthy rollout ends with bothTrueandProgressing.reason=NewReplicaSetAvailable. - Treat node pressure conditions as capacity signals: tune requests/limits, enable cluster autoscaling, or add nodes before the kubelet starts evicting pods.
- The first
Falsecondition in the chain is usually the root cause — reading fromPodScheduleddownward prevents chasing symptoms.