Pod 生命周期
学习目标
- 理解 Pod 的各个阶段(Phase)
- 理解容器的状态(State)
- 了解 Pod 的重启策略
核心概念
Pod 阶段(Phase)
Pod 的生命周期阶段:
Pending → Running → Succeeded/Failed
↓
Unknown
Pending: 等待调度或拉取镜像
Running: 至少一个容器正在运行
Succeeded: 所有容器成功退出
Failed: 至少一个容器失败退出
Unknown: 无法获取 Pod 状态
Pod 阶段详解
| 阶段 | 说明 | 典型场景 |
|---|
| Pending | 已创建但未运行 | 调度中、拉取镜像 |
| Running | 至少一个容器运行中 | 正常服务中 |
| Succeeded | 所有容器成功终止 | 批量任务完成 |
| Failed | 至少一个容器失败 | 应用崩溃、OOM |
| Unknown | 状态未知 | 节点通信故障 |
容器状态(State)
容器的三种状态:
Waiting 正在准备(拉取镜像、执行 Init)
Running 正在运行
Terminated 已终止(正常退出或被杀)
| 状态 | 说明 | 原因 |
|---|
| Waiting | 等待启动 | 拉取镜像、Init 容器 |
| Running | 正在执行 | 正常运行 |
| Terminated | 已结束 | 正常退出、OOM、信号杀死 |
容器终止原因
Terminated 状态的退出码:
Exit Code 0: 正常退出
Exit Code 1: 应用错误
Exit Code 137: SIGKILL (OOM 或强制杀死)
Exit Code 143: SIGTERM (优雅终止)
Pod 条件(Conditions)
Pod Conditions 表示更详细的状态:
Initialized: 所有 Init 容器完成
Ready: 可以提供服务
ContainersReady: 所有容器就绪
PodScheduled: 已调度到节点
类型: True / False / Unknown
重启策略(Restart Policy)
apiVersion: v1
kind: Pod
spec:
restartPolicy: Always
| 策略 | 行为 | 适用场景 |
|---|
| Always | 总是重启 | Web 服务器(默认) |
| OnFailure | 失败时重启 | 批量任务 |
| Never | 从不重启 | 一次性任务 |
生命周期钩子
apiVersion: v1
kind: Pod
spec:
containers:
- name: app
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo started"]
preStop:
exec:
command: ["/bin/sh", "-c", "echo stopping"]
| 钩子 | 触发时机 | 用途 |
|---|
| postStart | 容器创建后立即 | 初始化配置 |
| preStop | 容器终止前 | 优雅关闭、清理资源 |
完整生命周期流程
创建 Pod
↓
[PENDING]
├─ 调度到节点
├─ 拉取镜像
└─ 运行 Init 容器
↓
[RUNNING]
├─ postStart 钩子
├─ 主容器运行
├─ 存活探针检查
└─ 就绪探针检查
↓
[TERMINATING]
├─ preStop 钩子
├─ 发送 SIGTERM
├─ 等待优雅终止期
└─ 发送 SIGKILL
↓
[SUCCEEDED] 或 [FAILED]
Init 容器
apiVersion: v1
kind: Pod
spec:
initContainers:
- name: init-db
image: busybox
command: ['sh', '-c', 'until nslookup mysql; do echo waiting; done']
containers:
- name: app
image: my-app
| 特性 | 说明 |
|---|
| 执行顺序 | 按顺序依次执行 |
| 必须成功 | 所有 Init 容器成功后才启动主容器 |
| 用途 | 等待依赖服务、初始化配置 |
实践练习
练习 1:状态识别
给定以下场景,判断 Pod 处于哪个阶段:
- 正在拉取镜像
- 应用正在处理请求
- 批量任务执行完毕
- 内存溢出被杀死
练习 2:重启策略选择
为以下场景选择合适的重启策略:
- Web 服务器
- 数据处理任务
- 定时报告生成
练习 3:观察生命周期
运行一个 Pod 并观察其状态变化:
kubectl run test --image=nginx --restart=Never
kubectl get pod test -w
常见误解
1. Running 不代表健康
错误:Pod 是 Running 状态就一定正常
正确:Running 只表示容器在运行,不代表健康
需要配合探针(Liveness/Readiness)判断健康状态
2. 退出码的含义
错误:Exit Code 非 0 就是应用错误
正确:
- 137 (OOM) 是资源问题,不是应用问题
- 143 (SIGTERM) 是正常终止信号
小结
| 要点 | 说明 |
|---|
| Pod Phase | Pending / Running / Succeeded / Failed / Unknown |
| 容器状态 | Waiting / Running / Terminated |
| 重启策略 | Always / OnFailure / Never |
| 生命周期钩子 | postStart / preStop |
| Init 容器 | 主容器启动前的初始化容器 |
| 优雅终止 | SIGTERM → 等待 → SIGKILL |