在K8S中,Pod声明周期有哪些?
在Kubernetes中,Pod的生命周期是从创建到终止的完整过程,包含多个阶段(Phase) 和状态(Condition),其流转受到容器状态、健康检查、重启策略等因素影响。核心生命周期阶段及关键节点如下:
一、Pod的核心阶段(Phase)
Pod的status.phase
字段定义了其生命周期的宏观阶段,共5种核心状态,反映Pod在集群中的整体状态:
1. Pending( pending )
- 含义:Pod已被API Server创建(记录到etcd中),但尚未完成调度或容器启动。
- 常见原因:
- 未被调度到节点(如资源不足、节点亲和性不满足、污点未容忍);
- 容器镜像正在拉取(网络慢或镜像体积大);
- 初始化容器(Init Containers)正在运行(未完成)。
2. Running( running )
- 含义:Pod已被调度到节点,且满足以下条件:
- 所有初始化容器(Init Containers)已成功执行完毕;
- 至少有一个应用容器处于运行状态(或正在启动/重启)。
- 注意:此阶段不代表应用“可用”(需通过就绪探针验证),仅表示Pod在节点上正常运行。
3. Succeeded( succeeded )
- 含义:Pod中所有容器均已成功终止(退出码为0),且不会被重启。
- 适用场景:一次性任务(如Job创建的Pod),任务完成后进入此状态。
4. Failed( failed )
- 含义:Pod中所有容器均已终止,但至少有一个容器是非正常终止(退出码非0)。
- 常见原因:应用崩溃、容器启动失败、存活探针检测失败导致容器被杀死等。
5. Unknown( unknown )
- 含义:API Server无法获取Pod的状态(通常是kubelet与API Server通信中断)。
- 常见原因:节点故障(如宕机、网络分区)导致kubelet无法上报Pod状态。
二、Pod生命周期中的关键节点
除了宏观阶段,Pod的生命周期还包含多个关键过程,影响其状态流转:
1. 初始化阶段(Init Containers)
- 作用:在应用容器启动前运行的“前置任务容器”,用于初始化配置(如拉取配置文件、等待依赖服务就绪)。
- 特点:
- 按定义顺序串行执行,前一个Init容器成功终止后,下一个才会启动;
- 若Init容器失败,kubelet会根据Pod的重启策略(RestartPolicy)重启Pod或终止;
- 初始化完成后,Init容器会被标记为“已完成”,不会再运行。
2. 应用容器的状态
Pod的阶段由其内部容器的状态决定,容器有3种核心状态(containerStatuses.state
):
- Waiting:容器正在等待启动(如镜像拉取中、依赖未满足),会包含
reason
说明原因(如ImagePulling
)。 - Running:容器已启动并正常运行(触发
started
事件)。 - Terminated:容器已终止,包含
exitCode
(0表示成功,非0表示失败)和终止原因(如Error
、Completed
)。
3. 健康检查与探针(Probe)
Kubernetes通过探针监控容器状态,直接影响Pod是否“可用”及是否重启,是生命周期的重要调控机制:
- 存活探针(Liveness Probe):检测容器是否“存活”,失败会触发容器重启(受重启策略控制)。
- 就绪探针(Readiness Probe):检测容器是否“就绪”(可接收请求),失败会将Pod从Service的Endpoints中移除(不影响容器运行)。
- 启动探针(Startup Probe):针对启动慢的应用,成功前会屏蔽存活/就绪探针,避免误判为故障。
4. 重启策略(RestartPolicy)
控制容器终止后是否重启,影响Pod状态流转:
Always
(默认):容器终止后总是重启(即使正常终止),适用于长期运行的服务(如Web应用)。OnFailure
:仅当容器非正常终止(exitCode≠0)时重启,适用于批处理任务。Never
:容器终止后从不重启,适用于一次性任务。
5. 终止过程(Termination)
当删除Pod(kubectl delete pod
)或Pod因故障被终止时,会经历以下步骤:
- 标记为Terminating:API Server将Pod状态更新为
Terminating
,并停止将新请求转发到该Pod(如从Service中移除)。 - 发送终止信号:kubelet向容器发送
SIGTERM
信号(默认优雅终止时间30秒,可通过spec.terminationGracePeriodSeconds
调整),通知应用“即将终止”。 - 强制终止:若优雅时间内容器未退出,kubelet发送
SIGKILL
信号强制杀死容器。 - 清理资源:删除Pod的网络规则、挂载卷等,最终从API Server中移除Pod记录。
三、生命周期流转示例
一个典型的Pod生命周期流转如下:
Pending
(调度中→拉取镜像→执行Init容器) → Running
(应用容器启动→存活/就绪探针通过) → (若为长期服务)持续Running
;(若为任务)容器完成→Succeeded
;(若应用崩溃)容器终止→Failed
(或因Always
策略重启→回到Running
)。
总结
Pod的生命周期是“阶段(Phase)+ 容器状态 + 调控机制(探针、重启策略)”的综合体现,核心阶段包括Pending、Running、Succeeded、Failed、Unknown,关键节点涉及初始化容器、健康检查、终止过程等。理解这些阶段有助于排查Pod故障(如Pending原因、启动失败等)和管理应用生命周期。