首页 / Kubernetes (k8s) 入门教程 / Pod 生命周期与状态

Kubernetes (k8s) 入门教程

Pod 生命周期与状态

本教程共 65 篇 · 第 12 篇 · 更新于 2026-08-14 · 约 10 分钟阅读

KubernetesPod生命周期Pod状态CrashLoopBackOff

本节目标:学完你能对着 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 会显示 ContainerCreatingImagePullBackOff

Running:容器正在跑,而且从启动起就没停过。

Terminated:容器跑完了或被杀掉了。你会看到它退出码和原因,比如 CompletedError

你可以用这个命令看容器的具体状态:

kubectl describe pod nginx-demo

在输出的 Containers 段落里,有 StateLast StateReasonExit Code 这些字段。排错基本都从这入手。

12-3 Pod 条件:四个判断题

除了阶段,Pod 还有一组条件(Conditions),相当于几道是非题。每条要么 True 要么 False

PodScheduled:有没有被调度到节点上。

Initialized:所有 Init 容器(第 13 章)是不是都跑完了。

ContainersReady:Pod 里所有容器是不是都就绪。

Ready:Pod 能不能接流量。只有 ReadyTrue,Service 才会把请求转给它。

kubectl get pod nginx-demo -o jsonpath='{.status.conditions}'

这条命令能把这几个条件的答案打印出来。看 Ready 一直是 False?那八成是就绪探针没过,跳到第 14 章就对上了。

Note

除了上面四个,v1.36 里还有 DisruptionTarget(Pod 因驱逐/中断被终止)、PodReadyToStartContainers(容器开始启动前)等条件。平时排错盯紧 ReadyPodScheduled 就够。

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 容器怎么给主容器铺路。