Pod 生命周期与钩子

Pod 从创建到销毁会经历若干阶段(Phase),容器进程在这些阶段中还可能被重启、被打探针检查、被钩子回调。搞清楚这套机制,才能解释"Pod 明明在 Running,为什么流量还是断了"这类现象。

Pod 的阶段

Pod 生命周期阶段图 kubectl get pods 的 STATUS 列取自 Pod 的 phase:

阶段含义
Pending已被集群接受,但容器还没全部创建(等调度、拉镜像)
RunningPod 已绑定节点,至少一个容器在运行
Succeeded所有容器正常退出(0 码),一次性任务成功
Failed容器以非 0 码退出,任务失败
Unknownapiserver 暂时拿不到 Pod 状态(如节点失联)
kubectl get pods -w          # -w 持续观察状态变化
# NAME   READY   STATUS    RESTARTS   AGE
# web-0  1/1     Running   0          5m

restartPolicy 重启策略

容器退出后是否重启、重启谁,由 restartPolicy 决定:

取值行为适用
Always退出即重启(默认)常驻服务类 Pod
OnFailure非 0 码退出才重启任务型
Never退出后不重启任务型

注意 Job 的 Pod 只允许 OnFailure 或 Never;而 restartPolicy 是 Pod 级别,会作用到 Pod 内所有容器。

initContainers 初始化容器

initContainers 在主容器启动前按顺序逐个执行,全部成功才轮到正式容器,适合做"等待依赖就绪、预置数据"等一次性工作:

apiVersion: v1
kind: Pod
metadata:
  name: app-with-init
spec:
  initContainers:
    - name: wait-db              # 等待数据库可连再启动主容器
      image: busybox:1.36
      command: ["sh", "-c", "until nc -z db-svc 3306; do sleep 2; done"]
  containers:
    - name: app
      image: myapp:1.0

初始化容器失败会按 restartPolicy 重试,一直失败 Pod 就停在 Pending(Init:CrashLoopBackOff)。

探针:startup / liveness / readiness

探针让 kubelet 主动检查容器状态(完整细节见第 21 章),先记住三者分工:

探针检查什么失败后果
startupProbe应用是否启动完成失败则杀容器重启,保护慢启动应用
livenessProbe进程是否还活着失败则杀掉容器重启
readinessProbe是否准备好接收流量失败则从 Service 端点摘除,不杀容器

生命周期钩子 postStart / preStop

容器可在启动后、终止前各执行一次回调:

spec:
  containers:
    - name: app
      image: myapp:1.0
      lifecycle:
        postStart:
          exec:
            command: ["sh", "-c", "echo started > /tmp/started"]
        preStop:               # 常用于优雅下线:先通知、再等流量排空
          exec:
            command: ["sh", "-c", "curl -X POST http://127.0.0.1:8080/shutdown"]

终止流程与 terminationGracePeriodSeconds

删除 Pod 时不是立刻杀掉,而是走"优雅终止":

  1. Pod 被打上删除标记,从 Service 端点摘除,不再接收新流量。
  2. 执行 preStop 钩子(如有),给应用发送 SIGTERM。
  3. 应用应在宽限期内自行退出;超时后 kubelet 发送 SIGKILL 强杀。
  4. 宽限期由 terminationGracePeriodSeconds 控制,默认 30 秒,可按应用需要调大:
spec:
  terminationGracePeriodSeconds: 60   # 给优雅下线留 60 秒

小结:Pod 状态沿 Pending → Running → Succeeded/Failed 推进;initContainers 负责启动前置,三类探针负责健康把关,preStop 与宽限期负责优雅退出。把 restartPolicy 与 phases 对应起来看,排查"重启循环"会快很多。

笔记加载中…