✦ For everyone, free.

Practical knowledge for real and everyday life

Home

Kubernetes Pod Phase Progression

Kubernetes Pod Phase Progression explains how pods transition through lifecycle states, from creation to termination, within a Kubernetes cluster.

Kubernetes Pod Phase Progression is the ordered path a Pod's status.phase field travels through over its lifetime, from initial creation to final termination. Unlike the detailed condition array, phase is a single coarse-grained value intended to answer, at a glance, which broad stage of existence a Pod currently occupies, and its progression follows a small set of well-defined transition rules rather than an arbitrary sequence.


The Phase Values

Pending

A Pod enters Pending the instant it is accepted by the API server and remains there through scheduling, image pulling, and container creation, for as long as any container has not yet started running.

kubectl get pod phase-progression-example -o jsonpath='{.status.phase}'

Running

A Pod moves to Running once it has been bound to a node and at least one of its containers is running, or is in the process of starting or restarting. Note that Running does not imply every container is healthy or ready; it only reflects that the Pod has begun executing.

Succeeded

A Pod reaches Succeeded when all of its containers have terminated successfully and none will be restarted, a terminal phase typically associated with Jobs and other run-to-completion workloads.

Failed

A Pod reaches Failed when all containers have terminated and at least one terminated with a non-zero exit code or was otherwise stopped by the system in a way not considered successful.

Unknown

A Pod shows Unknown when the state of the Pod cannot be determined, typically because communication with the node's kubelet has been lost, commonly seen alongside a NodeLost condition.


Legal Transitions

Forward-Only Movement

Phase progression is monotonic for terminal outcomes: once a Pod reaches Succeeded or Failed, it never transitions back to Pending or Running. A Pod that needs to run again is not resurrected in place; a controller creates an entirely new Pod object instead.

status:
  phase: Succeeded
  conditions:
    - type: PodScheduled
      status: "True"

Pending to Running

The transition from Pending to Running requires the Initialized condition to become true, meaning all init containers succeeded, followed by at least one application container entering the Running container state.


Phase Versus Readiness

Why Phase Alone Is Insufficient

Because Running only requires one container to be active, relying on phase to determine whether a Pod is safe to send traffic to is a common mistake. The Ready condition, driven by readiness probes, is the correct signal for traffic eligibility, and it can be false even while phase reports Running.

status:
  phase: Running
  conditions:
    - type: Ready
      status: "False"
      reason: ContainersNotReady

Phase Interaction With restartPolicy

How restartPolicy Affects Terminal Phases

A Pod with restartPolicy: Always never reaches Succeeded or Failed on its own, since any container exit triggers a restart rather than a terminal state; only OnFailure and Never policies allow a Pod to reach a terminal phase, which is why Jobs typically avoid Always.

spec:
  restartPolicy: OnFailure

Phase Progression Diagram

Pending Running Succeeded Failed

Once a Pod arrives at either terminal branch of this diagram, its phase progression is complete, and any further work, such as retrying a failed task, happens through the creation of a new Pod object rather than a change to the existing one.