Skip to content

Pod生命周期

Kubernetes Pod 生命周期

Pod 作为 Kubernetes 的最小调度单元,其生命周期管理是集群运维的核心知识。以下是 Pod 从创建到终止的完整生命周期解析:

Pod 生命周期阶段

  1. Pending(挂起)
    • Pod 已被 API Server 接受
    • 容器镜像正在下载或调度未完成
    • 典型场景:等待节点资源分配或镜像拉取
  2. Running(运行中)
    • Pod 已绑定到节点
    • 至少一个容器正在运行(包括 pause 容器)
    • 可能状态:所有容器运行中/部分容器启动中/部分容器失败但未达到重启策略阈值
  3. Succeeded(成功终止)
    • 所有容器正常退出(exit code 0)
    • 典型场景:Job/CronJob 类工作负载完成
  4. Failed(失败终止)
    • 至少一个容器异常终止(非 0 退出码)
    • 可能原因:容器执行失败/节点资源不足/OOMKilled
  5. Unknown(未知状态)
    • 无法获取 Pod 状态信息
    • 常见原因:节点失联/kubelet 进程异常

Pod 创建流程

  1. 用户发起请求:通过 kubectl 或 API 客户端向 API Server 提交 Pod 对象(YAML/JSON)。

  2. API Server 处理:认证、鉴权、准入控制(Admission Webhook 等),将 Pod 对象持久化存入 etcd。

  3. Scheduler 调度:

    • 通过 watch 机制发现未调度的 Pod(spec.nodeName 为空)。

    • 执行预选(过滤节点)和优选(打分),选择最合适的 Node。

    • 将选定的 Node 名称写入 Pod 的 spec.nodeName,更新 etcd。

  4. kubelet 创建 Pod(目标节点上的 kubelet):

  5. 监听到被分配到自己节点的 Pod,开始创建过程。

    • Init 容器阶段:按顺序逐个启动 initContainers,每个 Init 容器必须运行成功(退出码 0)后才会启动下一个;如果任一 Init 容器失败,kubelet 会根据 Pod 的 restartPolicy 决定是否重试(通常为 Always,即反复重试)。

    • 主容器启动:所有 Init 容器成功完成后,kubelet 开始启动主容器。

    • 通过容器运行时拉取主容器镜像,创建和启动容器。

    • 启动后立即执行 postStart 钩子(如果定义):该钩子与容器主进程异步执行,不会阻塞容器进入 Running 状态;但若钩子执行失败,容器会被重启(根据 restartPolicy)。

    • 网络配置:CNI 插件为 Pod 分配 IP,设置网络接口,完成后 Pod 可与其他 Pod 通信。

  6. 状态上报:kubelet 将 Pod 的状态(Init:Running、PodInitializing、Running 等)更新到 API Server,用户最终可以看到 Pod 成为 Running 状态。

Pod 删除流程

  1. 用户执行删除:kubectl delete pod ...,API Server 收到请求后,设置 Pod 的 deletionTimestamp 和 deletionGracePeriodSeconds(默认 30s)。

  2. 状态变为 Terminating:Pod 进入 Terminating 状态,但 kubelet 不会立即强杀。

  3. 执行 PreStop Hook(若配置):容器如果定义了 lifecycle.preStop,会先执行该钩子。

  4. 发送 SIGTERM:kubelet 向容器主进程发送 SIGTERM 信号,通知应用开始优雅退出。

  5. 等待宽限期:等待 terminationGracePeriodSeconds 设置的时间,让应用完成清理工作。

  6. 强制终止:超过宽限期后,kubelet 发送 SIGKILL 强制终止容器。

  7. 清理资源:容器删除后,kubelet 通知 API Server 移除 Pod 对象,相关资源(IP、卷等)被释放。

关键生命周期事件

Init Containers(初始化容器)

  • 串行执行,全部成功后才启动主容器
  • 典型用途:数据库迁移/配置文件生成/网络检查

容器探针(Probes)

探针类型检查时机失败后果
Startup Probe容器启动后阻止其他探针执行
Liveness Probe运行期间定期检查重启容器
Readiness Probe服务就绪检查从Service端点移除

容器钩子(Lifecycle Hooks)

yaml
lifecycle:
  postStart:
    exec:
      command: ["/bin/sh", "-c", "echo Hello > /tmp/startup"]
  preStop:
    httpGet:
      path: /graceful-shutdown
      port: 8080

Pod状态

状态说明
PendingPod 已被 API Server 接受,等待调度
RunningPod 已绑定到节点,容器运行中
Succeeded所有容器正常退出
Failed至少一个容器异常退出
Unknown节点失联,状态未知

创建和终止

创建流程

  1. kubectl 向 API Server 发送请求
  2. Scheduler 调度 Pod 到节点
  3. Kubelet 创建容器
  4. 容器启动完成

终止流程

  1. 发送 SIGTERM 信号
  2. 等待优雅退出期(默认30s)
  3. 发送 SIGKILL 强制终止

初始化容器

初始化容器在主容器启动前运行。

yaml
initContainers:
  - name: init-mysql
    image: busybox:1.32
    command: ["sh", "-c", "echo Waiting for MySQL..."]

容器探测

探针说明失败动作
Startup Probe容器启动检查阻止其他探针
Liveness Probe存活检查重启容器
Readiness Probe就绪检查从 Service 移除
yaml
readinessProbe:
  httpGet:
    path: /healthz
    port: 8080

重启策略

yaml
restartPolicy: Always # Always | OnFailure | Never