Pod 的生命周期状态(Pending, Running, Succeeded, Failed, Unknown)
Kubernetes 中的 Pod 生命周期(Lifecycle)由 status.phase 字段表示。理解这些状态对于故障排查(Troubleshooting)至关重要。
Pod 的生命周期并不是一个简单的线性过程,它受到 重启策略(RestartPolicy) 和 容器退出状态码 的影响。
以下是这 5 种状态的详细解析:
1. Pending (挂起)
定义:
Pod 已被 Kubernetes API Server 接受并创建,但尚未被调度到具体的 Node 上,或者虽然调度了但容器镜像还在下载中。
处于此状态的具体阶段:
- Scheduling(调度中):K8s 调度器正在寻找合适的 Node(检查 CPU/内存资源、Taints/Tolerations、Affinity 等)。
- Downloading Images(拉取镜像):调度成功后,Kubelet 正在从镜像仓库下载容器镜像。
常见原因与排查:
- 资源不足:集群没有足够的 CPU 或内存(提示
Insufficient cpu/memory)。 - 调度限制:节点有 Taints(污点),而 Pod 没有对应的 Tolerations(容忍度);或者 Node Affinity 配置导致无法匹配节点。
- PVC 绑定失败:Pod 请求的存储卷(PVC)无法创建或绑定。
- 镜像问题:如果长时间处于 Pending 且伴随
ImagePullBackOff或ErrImagePull,说明镜像拉取失败(网络问题、镜像名错误、认证失败)。
2. Running (运行中)
定义:
Pod 已经被绑定到了某个 Node,Pod 中所有的容器都已被创建。至少有一个容器正在运行,或者处于启动(Starting)或重启(Restarting)状态。
注意:
Running状态并不代表应用一定“健康”或“可用”。它只表示进程已启动。- 如果容器配置了 Readines Probe(就绪探针)且失败,Pod 状态仍是
Running,但 Service 不会将流量转发给它。
常见场景:
- 正常运行:应用工作正常。
- CrashLoopBackOff:这是一个非常常见的容器状态(非 Pod 阶段)。如果容器启动后立即崩溃退出,K8s 会不断重启它。此时 Pod 的 Phase 依然是
Running,但READY字段可能是0/1。
3. Succeeded (成功)
定义:
Pod 中的所有容器都已成功终止(退出码为 0),并且不会再重启。
适用场景:
- 通常出现在 Job(一次性任务) 或 CronJob(定时任务) 中。
- 当数据处理完成或脚本执行完毕后,Pod 进入此状态。
前提条件:
RestartPolicy通常设置为OnFailure或Never。
4. Failed (失败)
定义:
Pod 中的所有容器都已终止,且至少有一个容器是以失败状态(非 0 退出码)终止的。也就是说,容器要么是崩溃了,要么是被系统(如 OOMKilled)杀死的。
适用场景:
- Job 任务执行出错。
RestartPolicy为Never,且程序崩溃。
常见原因:
- 代码错误:程序抛出异常退出。
- 配置错误:缺少环境变量或配置文件。
- OOMKilled:内存超限被内核杀死(如果 RestartPolicy 是 Never)。
5. Unknown (未知)
定义:
API Server 无法获取该 Pod 的状态。这通常是因为 Master 节点与 Pod 所在的 Node 节点之间的通信中断。
常见原因:
- Node 宕机:所在的 Worker 节点挂了。
- 网络分区:Master 和 Worker 之间的网络断开。
- Kubelet 进程挂死:节点上的 Kubelet 代理停止工作。
处理方式:
- 通常需要修复节点或网络。如果节点无法恢复,可能需要手动删除 Pod(强制删除),K8s 会在其他节点重建它(如果是 Deployment/StatefulSet 管理的)。
总结与状态流转图
为了更好地理解,我们需要区分 Pod Phase(阶段) 和 Container State(容器状态)。
- Pod Phase: 宏观状态 (Pending, Running, Succeeded, Failed, Unknown)
- Container State: 微观状态 (Waiting, Running, Terminated)
常见排查速查表
| Pod 状态 | 常见现象/错误信息 | 可能原因 |
|---|---|---|
| Pending | 0/1 nodes are available |
资源不足 (CPU/Mem),调度失败 |
| Pending | ImagePullBackOff / ErrImagePull |
镜像名错、密钥错、网络不通 |
| Pending | ContainerCreating (卡住) |
挂载存储卷失败、CNI 网络插件错误 |
| Running | CrashLoopBackOff |
应用程序启动即崩溃 (代码bug、配置错) |
| Running | OOMKilled |
内存限制过小,程序内存泄漏 |
| Running | 0/1 Ready (但没重启) |
Readiness Probe (就绪探针) 失败 |
| Evicted | The node was low on resource |
节点资源耗尽(通常是磁盘或内存),Pod 被驱逐 |
还有一个特殊的“状态”:Terminating
虽然 Terminating 不是官方的 status.phase 枚举值之一,但当用户执行 kubectl delete pod 时,Pod 会显示为 Terminating。
- 过程:K8s 发送 SIGTERM 信号 -> 等待
terminationGracePeriodSeconds(默认30s) -> 发送 SIGKILL 强制杀死。 - 卡在 Terminating:通常是因为 Finalizers(如 PVC 保护或 LoadBalancer 清理)未完成。