基于本文回答

播面 播面

文图音视,全方位拆解八股文
0
评论

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 且伴随 ImagePullBackOffErrImagePull,说明镜像拉取失败(网络问题、镜像名错误、认证失败)。

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 通常设置为 OnFailureNever

4. Failed (失败)

定义
Pod 中的所有容器都已终止,且至少有一个容器是以失败状态(非 0 退出码)终止的。也就是说,容器要么是崩溃了,要么是被系统(如 OOMKilled)杀死的。

适用场景

  • Job 任务执行出错。
  • RestartPolicyNever,且程序崩溃。

常见原因

  • 代码错误:程序抛出异常退出。
  • 配置错误:缺少环境变量或配置文件。
  • 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 清理)未完成。
00:00
00:00