1. Pod生命周期概述
Pod生命周期指Pod从创建到销毁的完整过程,是学习后续K8s控制器等知识的核心前提,Pod是K8s集群部署的最小单元,掌握其生命周期是使用K8s的基础。
每个Pod创建时首先会创建Pause容器(infra容器),核心作用是:初始化网络、挂载存储卷,实现Pod内所有容器的网络、IPC、PID共享,同时负责回收Pod内其他容器产生的僵尸进程/孤儿进程。
本小节会从0到1梳理Pod生命周期的完整流程,建议学习后自行绘制生命周期流程图,验证自身理解程度。
2. 初始化容器(Init Container)
Init Container是Pod生命周期中仅在初始化阶段存在的容器类型,核心特性如下:
- 执行顺序严格线性:多个Init Container必须串行执行,只有前一个Init Container成功退出(退出码为0)后,才会创建下一个Init Container,不支持并行执行。
- 存在“连坐”重试机制:如果任意一个Init Container执行失败(退出码非0),所有已执行的Init Container都会被销毁,需要从第一个Init Container重新全部执行,直到所有Init Container均成功退出(退出码均为0)才会进入下一阶段。
- 生命周期独立:仅存在于Pod初始化的前置阶段,不会伴随主容器运行,执行完初始化任务后就会退出,属于“过客”型容器。
- 可使用与主容器不同的镜像,适合执行风险较高的初始化操作,因生命周期极短,即使出现安全问题影响范围也极小。
2.1 典型使用场景
- 风险操作隔离:可将敏感、危险的初始化操作(如密钥处理、临时脚本执行)放在Init Container中执行,避免长期运行的主容器暴露风险,类比“开门时短暂降低安全性但必须实现进门功能”。
- 前置条件阻塞:利用Init Container的阻塞特性,在主容器创建前校验前置条件是否满足,只有条件满足后Init Container才会成功退出,主容器才会被创建。例如:部署依赖MySQL的LNMP Pod时,可在Init Container中写死循环探测MySQL服务是否可连通,只有MySQL就绪后Init Container才会退出,避免主容器在数据库未就绪时启动导致服务失败,解决多依赖Pod人工部署效率极低的问题。
3. 主容器(Main Container,业务容器)
主容器是Pod中承载实际业务逻辑的容器,核心特性如下:
- 数量无限制:一个Pod中可定义多个主容器,没有个数限制。
- 并行运行:多个主容器理论上支持并行创建、并行运行;老版本K8s中因镜像下载为线性执行,看起来像串行启动,新版本K8s已支持镜像并发下载,可实现真正的并行创建。
3.1 钩子(Hook)
钩子是Pod生命周期中特定时机触发的回调逻辑,由Pod所在节点的kubelet执行(而非集群唯一的控制器,避免控制器随节点数量增加压力过大),分为两类:
- PostStart(启动后钩子)
- 触发时机:容器初始化完成、执行完容器默认启动命令后触发,注意官方不保证启动后钩子在启动命令执行前完成,两者执行可能存在交叉重叠。
- 注意事项:如果启动后钩子用于编译可执行文件,而容器启动命令用于执行该文件,存在极大概率文件未编译完成就执行导致报错,解决方法是添加死循环判断文件是否存在后再执行启动命令。
- PreStop(关闭前钩子)
- 触发时机:Pod发起关闭时,会先拦截关闭信号,优先执行PreStop钩子,执行完成后再将关闭信号发送给容器。
- 作用:可实现优雅关闭逻辑,例如保存容器内的重要数据并上传到备份仓库、提前关闭服务避免连接损坏等。
- 注意:PreStop钩子存在无法正常执行完成的场景,后续章节会补充说明限制条件。
3.2 探针(Probe)
探针是kubelet定期对主容器执行的健康检查机制,用于判断容器的运行状态,分为两类:
- 就绪探测(Readiness Probe)
- 作用:判断容器是否已经准备好接收用户请求,类比“跑步比赛前裁判询问选手是否准备好”。
- 执行时机:一般会设置初始延迟时间,待容器正常启动后再执行探测,避免容器未启动时探测无意义。
- 效果:仅当Pod内所有主容器都通过就绪探测、标记为就绪状态后,该Pod才会被负载均衡加入后端,提供给用户访问;只要有一个主容器未就绪,Pod就不会接收负载均衡的流量,避免用户访问失败。
- 版本差异:老版本K8s中仅周期性执行探测,通过后就会停止探测;新版本K8s中会持续周期性执行探测,即使首次通过后,后续如果容器状态不满足就绪条件,也会被标记为未就绪,从负载均衡中移除。
- 存活探测(Liveness Probe)
- 作用:判断容器是否“活着”且能正常提供服务,类比“上课时检查学生是否真的在听课而非假装睡觉”。
- 执行逻辑:可自定义初始延迟时间,周期性执行探测;如果探测成功,不做任何操作;如果探测失败,说明容器出现假死(进程存在但无法提供服务),kubelet会按照Pod的重启策略销毁该容器并重新创建,保证运行的容器都能正常提供服务。
AI 总结
本小节核心讲解了Kubernetes中Pod的生命周期全流程,重点梳理了Pause容器的核心作用、初始化容器(Init Container)的线性串行执行、连坐重试、阻塞主容器等核心特性与落地场景,以及主容器的两类钩子(PostStart/PreStop)、两类探针(就绪/存活探测)的作用、执行逻辑与注意事项,是理解Pod运行机制、学习后续控制器知识的核心基础。