在K8S中,Pod 可能位处于的状态有哪些?
好的,了解 Pod 可能处于的状态对于管理和排查 Kubernetes 集群问题至关重要。Pod 的状态是一个层次化的结构,主要包括两个层面:Pod 的 status.phase
(相位) 和 容器详细状态 status.containerStatuses
。
下图概述了 Pod 的核心生命周期及其状态转换关系:
flowchart LR
P[Pending] -->|调度成功| R[Running]
R -->|所有容器<br>正常退出| S[Succeeded]
R -->|至少一个容器<br>非正常退出| F[Failed]
R -.->|多种原因| U[Unknown]
P -.->|镜像拉取失败等| F
P -.->|多种原因| U
1. Pod Phase (相位) - status.phase
Phase 是对 Pod 在其生命周期中所处阶段的简单、高层次的概括。它不是一个详尽的状态汇总,而是为了提供一个大致的快照。主要有以下值:
相位 | 描述 |
---|---|
Pending (挂起) |
API Server 已创建 Pod 对象,但 Pod 还未被调度到一个节点上运行,或者还在下载镜像、创建容器。 • 可能原因:等待调度、正在拉取镜像、申请资源(PV)等。 |
Running (运行中) |
Pod 已被调度到一个节点上,并且所有容器都已创建。至少有一个容器正在运行,或者正在启动/重启。 • 注意:即使容器正在重启,Phase 也仍然是 Running 。 |
Succeeded (成功) |
Pod 中的所有容器都已成功终止(退出码为 0),并且不会再重启。 • 常见于:一次性任务(Job/CronJob)执行完成。 |
Failed (失败) |
Pod 中的所有容器都已终止,并且至少有一个容器是因为失败而终止的。 即容器以非零状态退出或被系统终止。 • 可能原因:容器执行失败、内存溢出、被 liveness 探针杀死等。 |
Unknown (未知) |
无法获取 Pod 的状态,通常是由于与 Pod 所在节点的 Kubelet 通信失败。 • 常见原因:节点失联、网络分区。 |
查看 Phase 的命令:
kubectl get pods
# 在输出列表中可以直观地看到 STATUS 列,这通常是 Phase 和更细粒度状态的结合。
2. Pod Conditions (状况) - status.conditions
Conditions 提供了比 Phase 更详细和具体的状态信息,它是一个数组,描述了 Pod 满足某些条件的状况。每个 Condition 都有以下几个字段:
type
:状况的类型,例如:PodScheduled
:Pod 是否已被调度到一个节点上。Initialized
:所有 Init 容器是否已成功完成。ContainersReady
:Pod 中的所有容器是否都已就绪。Ready
:Pod 是否已经可以对外提供服务,并能被添加到所有匹配服务的负载均衡池中。这是最重要的一个状况。
status
:该条件是否被满足,值为True
,False
, 或Unknown
。reason
:状况的原因(大写驼峰字符串,如ContainersNotReady
)。message
:关于该状况的详细人类可读信息。
查看 Conditions 的命令:
kubectl describe pod <pod-name>
# 在输出中查找 `Conditions:` 部分。
3. 容器状态 - status.containerStatuses
这是最细粒度的状态,描述了 Pod 内每个容器的具体状态。每个容器状态包含以下字段:
状态类型 | 描述 |
---|---|
Waiting |
容器正在等待启动。会包含 reason 和 message 字段说明原因。• 常见 reason :- ContainerCreating : 正在创建容器(例如,拉取镜像、创建网络)。- ImagePullBackOff : 拉取镜像失败(镜像不存在、权限错误等)。 |
Running |
容器正在正常运行。包含容器启动时间 startedAt 。 |
Terminated |
容器已执行完毕并退出。包含退出码 exitCode 、结束时间 finishedAt 以及容器运行时的 ID。 |
查看容器状态的命令:
kubectl describe pod <pod-name>
# 在输出中查找 `Containers:` 部分,下面会列出每个容器的状态。
常见状态组合与排查意义
你使用 kubectl get pods
时看到的 STATUS
列通常是 Phase 和容器状态的组合,尤其是一些 Waiting
的原因会直接显示出来,这对于快速排查问题非常有帮助。
kubectl get pods 看到的 STATUS |
含义与可能原因 |
---|---|
Pending |
参考 Phase 的解释,通常是调度或资源准备问题。 |
ContainerCreating |
Pod 已被调度,正在节点上创建容器(拉取镜像中)。 |
Running |
Pod 正常运行中。 |
Completed |
等同于 Succeeded Phase,任务执行完毕。 |
Error / CrashLoopBackOff |
属于 Failed Phase。• Error : 容器启动失败后不再重启。• CrashLoopBackOff : 容器不断启动后立即失败,Kubernetes 正在指数增加重启的时间间隔。需要重点排查应用代码、配置、资源限制等问题。 |
ImagePullBackOff / ErrImagePull |
属于 Pending Phase。无法拉取镜像。检查镜像名称、标签、仓库权限和网络。 |
Terminating |
这不是一个 Phase,而是表示 Pod 收到了删除指令,正在优雅终止过程中。 |
总结
要全面了解一个 Pod 的状态,你需要结合这三层信息:
- 看 Phase (
kubectl get pods
):快速了解 Pod 处于生命周期的哪个大阶段。 - 看 Conditions (
kubectl describe pod
):深入了解 Pod 是否满足关键条件(如是否就绪、是否调度成功)。 - 看容器状态 (
kubectl describe pod
):定位到具体是哪个容器出了问题以及问题的具体原因(如镜像拉取失败、应用崩溃)。
掌握这些状态的含义是高效管理 Kubernetes 应用的基础。