Pod生命周期
Kubernetes Pod 生命周期
Pod 作为 Kubernetes 的最小调度单元,其生命周期管理是集群运维的核心知识。以下是 Pod 从创建到终止的完整生命周期解析:
Pod 生命周期阶段
- Pending(挂起)
- Pod 已被 API Server 接受
- 容器镜像正在下载或调度未完成
- 典型场景:等待节点资源分配或镜像拉取
- Running(运行中)
- Pod 已绑定到节点
- 至少一个容器正在运行(包括 pause 容器)
- 可能状态:所有容器运行中/部分容器启动中/部分容器失败但未达到重启策略阈值
- Succeeded(成功终止)
- 所有容器正常退出(exit code 0)
- 典型场景:Job/CronJob 类工作负载完成
- Failed(失败终止)
- 至少一个容器异常终止(非 0 退出码)
- 可能原因:容器执行失败/节点资源不足/OOMKilled
- Unknown(未知状态)
- 无法获取 Pod 状态信息
- 常见原因:节点失联/kubelet 进程异常
Pod 创建流程
用户发起请求:通过 kubectl 或 API 客户端向 API Server 提交 Pod 对象(YAML/JSON)。
API Server 处理:认证、鉴权、准入控制(Admission Webhook 等),将 Pod 对象持久化存入 etcd。
Scheduler 调度:
通过 watch 机制发现未调度的 Pod(spec.nodeName 为空)。
执行预选(过滤节点)和优选(打分),选择最合适的 Node。
将选定的 Node 名称写入 Pod 的 spec.nodeName,更新 etcd。
kubelet 创建 Pod(目标节点上的 kubelet):
监听到被分配到自己节点的 Pod,开始创建过程。
Init 容器阶段:按顺序逐个启动 initContainers,每个 Init 容器必须运行成功(退出码 0)后才会启动下一个;如果任一 Init 容器失败,kubelet 会根据 Pod 的 restartPolicy 决定是否重试(通常为 Always,即反复重试)。
主容器启动:所有 Init 容器成功完成后,kubelet 开始启动主容器。
通过容器运行时拉取主容器镜像,创建和启动容器。
启动后立即执行 postStart 钩子(如果定义):该钩子与容器主进程异步执行,不会阻塞容器进入 Running 状态;但若钩子执行失败,容器会被重启(根据 restartPolicy)。
网络配置:CNI 插件为 Pod 分配 IP,设置网络接口,完成后 Pod 可与其他 Pod 通信。
状态上报:kubelet 将 Pod 的状态(Init:Running、PodInitializing、Running 等)更新到 API Server,用户最终可以看到 Pod 成为 Running 状态。
Pod 删除流程
用户执行删除:kubectl delete pod ...,API Server 收到请求后,设置 Pod 的 deletionTimestamp 和 deletionGracePeriodSeconds(默认 30s)。
状态变为 Terminating:Pod 进入 Terminating 状态,但 kubelet 不会立即强杀。
执行 PreStop Hook(若配置):容器如果定义了 lifecycle.preStop,会先执行该钩子。
发送 SIGTERM:kubelet 向容器主进程发送 SIGTERM 信号,通知应用开始优雅退出。
等待宽限期:等待 terminationGracePeriodSeconds 设置的时间,让应用完成清理工作。
强制终止:超过宽限期后,kubelet 发送 SIGKILL 强制终止容器。
清理资源:容器删除后,kubelet 通知 API Server 移除 Pod 对象,相关资源(IP、卷等)被释放。
关键生命周期事件
Init Containers(初始化容器)
- 串行执行,全部成功后才启动主容器
- 典型用途:数据库迁移/配置文件生成/网络检查
容器探针(Probes)
| 探针类型 | 检查时机 | 失败后果 |
|---|---|---|
| Startup Probe | 容器启动后 | 阻止其他探针执行 |
| Liveness Probe | 运行期间定期检查 | 重启容器 |
| Readiness Probe | 服务就绪检查 | 从Service端点移除 |
容器钩子(Lifecycle Hooks)
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo Hello > /tmp/startup"]
preStop:
httpGet:
path: /graceful-shutdown
port: 8080Pod状态
| 状态 | 说明 |
|---|---|
| Pending | Pod 已被 API Server 接受,等待调度 |
| Running | Pod 已绑定到节点,容器运行中 |
| Succeeded | 所有容器正常退出 |
| Failed | 至少一个容器异常退出 |
| Unknown | 节点失联,状态未知 |
创建和终止
创建流程
- kubectl 向 API Server 发送请求
- Scheduler 调度 Pod 到节点
- Kubelet 创建容器
- 容器启动完成
终止流程
- 发送 SIGTERM 信号
- 等待优雅退出期(默认30s)
- 发送 SIGKILL 强制终止
初始化容器
初始化容器在主容器启动前运行。
initContainers:
- name: init-mysql
image: busybox:1.32
command: ["sh", "-c", "echo Waiting for MySQL..."]容器探测
| 探针 | 说明 | 失败动作 |
|---|---|---|
| Startup Probe | 容器启动检查 | 阻止其他探针 |
| Liveness Probe | 存活检查 | 重启容器 |
| Readiness Probe | 就绪检查 | 从 Service 移除 |
readinessProbe:
httpGet:
path: /healthz
port: 8080重启策略
restartPolicy: Always # Always | OnFailure | Never