Kubernetes Pod phases at a glance
Every Kubernetes Pod has a single high-level status.phase value summarising
where it is in its lifecycle. The kubelet on the node owning the Pod sets it
from the aggregate state of all containers. This reference lists the five phase
values, when each is assigned, and which container states they imply.
How it works
The phase is derived, not configured. After scheduling, a Pod starts in
Pending while images pull and init containers run. Once at least one
container is started it moves to Running. Terminal phases depend on the
restartPolicy:
Pending -> Running -> Succeeded (all containers exit 0, no restart)
-> Failed (a container exits non-zero, no restart)
-> Unknown (node/kubelet unreachable)
With restartPolicy: Always (the Deployment default) a crashed container is
restarted and the Pod stays Running — you will see container reasons like
CrashLoopBackOff in kubectl get pod even though the phase is still
Running. Only Never and OnFailure policies let a Pod reach Succeeded
or Failed.
Tips and notes
- The
STATUScolumn inkubectl get podmixes phases and container reasons — treatCrashLoopBackOff,ImagePullBackOffandCompletedas container or derived states, not as thephasefield. - A Pod stuck in
Pendingusually means it cannot be scheduled (no node fits resource requests, taints, or unbound PVCs) — checkkubectl describe pod. Unknownis rare and node-level; the Pod’s real state is unknowable until the kubelet reconnects.- Use
kubectl get pod -o jsonpath='{.status.phase}'to read the raw phase.