Pod 生命周期与状态
本教程共 65 篇 · 第 12 篇 · 更新于 2026-08-14 · 约 10 分钟阅读
本节目标:学完你能对着
kubectl get pod的输出,说清 Pod 现在卡在哪个阶段、为什么卡住,以及 CrashLoopBackOff 到底意味着什么。
Pod 不是一创建就立刻干活。它像一个人从出生到上岗,要经过好几个阶段。看懂这些阶段,排错时你心里才有底。
12-1 Pod 的五个阶段
kubectl get pod 里那个 STATUS 列,显示的就是 Pod 当前所处的阶段(Phase)。总共就五种。
Pending 是”排队等待中”。Pod 已被集群接受,但还没调度成功,或者镜像还在拉。
Running 是”在岗工作”。Pod 已经绑到节点,至少一个容器在跑,或者正在启动。
Succeeded 是”任务完成”。所有容器都正常退出,而且不会再重启。跑一次性任务的 Job 常看到它。
Failed 是”干砸了”。所有容器都终止,而且至少有一个是异常退出的。
Unknown 是”失联了”。节点控制器收不到 kubelet 的心跳,通常是节点宕机或网络断了。
Note阶段只是个粗略的”大状态”。它不告诉你容器内部细节。要看细活,得往下看容器状态和 Pod 条件。
12-2 容器的三种状态
Pod 阶段之下,每个容器自己还有三个状态。
Waiting:容器正在做准备,比如拉镜像、等挂载。这时 kubectl get 会显示 ContainerCreating 或 ImagePullBackOff。
Running:容器正在跑,而且从启动起就没停过。
Terminated:容器跑完了或被杀掉了。你会看到它退出码和原因,比如 Completed 或 Error。
你可以用这个命令看容器的具体状态:
kubectl describe pod nginx-demo
在输出的 Containers 段落里,有 State、Last State、Reason、Exit Code 这些字段。排错基本都从这入手。
12-3 Pod 条件:四个判断题
除了阶段,Pod 还有一组条件(Conditions),相当于几道是非题。每条要么 True 要么 False。
PodScheduled:有没有被调度到节点上。
Initialized:所有 Init 容器(第 13 章)是不是都跑完了。
ContainersReady:Pod 里所有容器是不是都就绪。
Ready:Pod 能不能接流量。只有 Ready 为 True,Service 才会把请求转给它。
kubectl get pod nginx-demo -o jsonpath='{.status.conditions}'
这条命令能把这几个条件的答案打印出来。看 Ready 一直是 False?那八成是就绪探针没过,跳到第 14 章就对上了。
Note除了上面四个,v1.36 里还有
DisruptionTarget(Pod 因驱逐/中断被终止)、PodReadyToStartContainers(容器开始启动前)等条件。平时排错盯紧Ready和PodScheduled就够。
12-4 重启策略 restartPolicy
Pod 有个字段 spec.restartPolicy,决定容器挂了之后怎么办。它有三个值。
Always:永远重启。这是默认项,适合 Web 服务这类长驻程序。
OnFailure:只在非正常退出时重启。适合批处理任务。
Never:挂了就挂了,不重启。
spec:
restartPolicy: OnFailure
注意它控制的是”容器重启”,不是”Pod 重建”。容器重启发生在同一个 Pod 里,IP 不变。Pod 本身被删了,那就是另一回事。
Tip
kubectl get pod里的RESTARTS列,记的是容器被重启过几次。这个数字一直涨,说明程序在反复崩,得赶紧查日志。
12-5 认识 CrashLoopBackOff
新手最怕看到的状态就是 CrashLoopBackOff。它翻译过来就是”崩溃循环,歇一会再试”。
流程是这样的:容器启动 → 立刻崩溃 → kubelet 重启它 → 又崩溃。Kubernetes 不会傻重启,它会每次拉大重试间隔,从 10 秒慢慢涨到 5 分钟上限。这个”退避”就叫 BackOff。
它出现,基本说明容器自己启动就报错,常见原因有这几种:
- 程序启动命令写错,一跑就退出。
- 配置或密钥没挂上,程序读不到文件。
- 端口被占用,或者依赖的数据库连不上。
排查就三步,照着来:
kubectl describe pod <pod名> # 看 Events 里的报错
kubectl logs <pod名> # 看程序自己打的日志
kubectl logs <pod名> --previous # 看上一次崩溃前的日志
--previous 很关键,因为崩溃的容器可能已经没了,当前日志是空的。
Warning别用
restartPolicy: Always去硬扛一个必崩的程序。它会陷入无限重启,还掩盖了真正的 bug。先修代码,再谈重启。
12-6 删除 Pod 时发生什么
你执行 kubectl delete pod 时,Pod 不会瞬间消失。它先进入 Terminating 状态,kubelet 发 SIGTERM 给容器,给个宽限期(默认 30 秒)做收尾。
宽限期内还没退,kubelet 就发 SIGKILL 强杀。想改宽限期:
kubectl delete pod nginx-demo --grace-period=60
理解了生死流程,下一章我们看一个 Pod 里怎么塞多个容器,以及 Init 容器怎么给主容器铺路。