Kubernetes Pod Phases Reference

Pod phase values — Pending, Running, Succeeded, Failed, Unknown — with transitions.

Reference for Kubernetes Pod phase enum values with lifecycle transitions, container state conditions and what each phase means for scheduling and restarts.

How many Pod phases are there?

Exactly five: Pending, Running, Succeeded, Failed and Unknown. The phase is a high-level summary in pod.status.phase; the more detailed STATUS column in kubectl often shows container reasons like CrashLoopBackOff or ImagePullBackOff, which are container states, not phases.

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 STATUS column in kubectl get pod mixes phases and container reasons — treat CrashLoopBackOff, ImagePullBackOff and Completed as container or derived states, not as the phase field.
  • A Pod stuck in Pending usually means it cannot be scheduled (no node fits resource requests, taints, or unbound PVCs) — check kubectl describe pod.
  • Unknown is 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.