面试知识库
中 进阶

Pod生命周期#

一句话答案#

Pod 状态流转:Pending→Running→Succeeded/Failed(节点失联、状态拿不到时为 Unknown),通过 liveness/readiness/startup 探针管理健康状态。

核心要点

Pod 阶段: Pending(调度中/拉镜像)→ Running → Succeeded/Failed;另有 Unknown(节点失联、拿不到状态)

三种探针:

探针作用失败后果
livenessProbe存活检查重启容器
readinessProbe就绪检查从 Service 摘除
startupProbe启动检查(保护慢启动应用,成功前不执行 liveness/readiness)超过 failureThreshold 重启容器

生命周期钩子: postStart(创建后)/ preStop(终止前,优雅停机;1.34 起原生 sleep 动作 GA,镜像里不需要 sleep 命令)

Init 容器与原生 sidecar: init 容器按顺序跑完才启动主容器;给 init 容器设 restartPolicy: Always 就是原生 sidecar(1.29 起默认开启,1.33 GA),它先于主容器启动、在主容器退出后才终止,不再阻塞 Job 结束

面试回答(2分钟版)

Pod是K8s最小调度单位,它的生命周期经历几个阶段:Pending表示已被接受但还在调度或拉镜像,Running表示至少一个容器在运行,最终进入Succeeded(正常结束)或Failed(异常退出)。Pod健康管理靠三种探针:startupProbe保护慢启动应用,在启动完成前其他探针不生效,避免被误杀;livenessProbe做存活检查,失败后kubelet会重启容器;readinessProbe做就绪检查,失败后Pod从Service端点摘除,不再接收流量但不重启。探针支持HTTP GET、TCP Socket和Exec三种检查方式。还有两个生命周期钩子:postStart在容器创建后执行,preStop在容器终止前执行,preStop是实现优雅停机的关键——可以在里面做连接排空、通知注册中心下线等操作,配合terminationGracePeriodSeconds设置等待时间。

追问与易错

追问方向:

  • “preStop 和优雅停机怎么配合?”→ K8s 发 SIGTERM 前先执行 preStop(通常 sleep 5s 等 Service 摘除 endpoints,1.30+ 可直接写 lifecycle.preStop.sleep.seconds),然后应用收到 SIGTERM 开始拒绝新请求、完成进行中请求、关闭连接池;terminationGracePeriodSeconds 超时后强制 SIGKILL
  • “startupProbe 和 initialDelaySeconds 有什么区别?”→ initialDelaySeconds 是固定等待时间(设短了误杀、设长了浪费),startupProbe 在启动阶段持续探测直到成功,更灵活;推荐用 startupProbe 替代 initialDelaySeconds
  • “Pod 状态一直 Pending 是什么原因?”→ 常见原因:节点资源不足(CPU/内存不够调度)、PVC 绑定失败(StorageClass 不存在或无可用 PV)、镜像拉取失败(ImagePullBackOff)、调度约束不满足(亲和性/污点)

易错点:

  • ❌ 把 CrashLoopBackOff / ImagePullBackOff 当成 Pod 阶段——phase 只有 Pending/Running/Succeeded/Failed/Unknown,这些是容器 waiting 状态的 reason
  • ❌ readiness 失败也会重启容器——readiness 只把 Pod 从 Service 后端摘除,只有 liveness(以及 startup)失败才触发重启
  • ❌ liveness 里检查 DB/Redis 等外部依赖——依赖一抖所有 Pod 一起被重启,故障放大;liveness 只查进程自身是否假死