当前位置: 首页 > news >正文

容器的生命周期

一、容器生命周期核心阶段(5 个阶段)

容器从创建到销毁,会依次经历 Pending → Running → Terminating 三大宏观状态,细分后包含 5 个核心阶段,每个阶段对应明确的行为和触发条件。

阶段 核心行为 对应 Pod 状态 关键说明
1. 容器创建(Container Creating) Kubelet 调用容器运行时(containerd)拉取镜像、创建容器文件系统 Pod 状态:Pending 若镜像拉取失败 / 权限不足,Pod 会卡在 ImagePullBackOffErrImagePull
2. 容器启动前(PreStart Hook) 执行用户定义的启动前钩子(如初始化配置、创建目录) Pod 状态:Pending 钩子执行失败 → 容器启动失败,Pod 状态变为 Error
3. 容器运行中(Running) 容器进程启动,执行 command/args 定义的业务逻辑 Pod 状态:Running 运行中通过 Liveness/Readiness/Startup Probe 监控健康状态
4. 容器终止前(PreStop Hook) 执行用户定义的终止前钩子(如优雅关闭服务、保存数据) Pod 状态:Terminating 钩子执行超时会被强制终止(默认 30s,可通过 terminationGracePeriodSeconds 调整)
5. 容器销毁(Terminated) 容器进程退出,容器运行时清理容器资源(网络、存储) Pod 状态:Succeeded/Failed 正常退出 → Succeeded
异常退出 → Failed(可通过 exitCode 排查原因)

二、生命周期钩子(Lifecycle Hooks)

钩子是容器在启动前 / 终止前执行的自定义操作,支持 exec(执行命令)、httpGet(HTTP 请求)、tcpSocket(TCP 连接)三种方式。

钩子关键特性

  • preStart:容器创建后、进程启动前执行,失败则容器启动失败;
  • preStop:容器收到终止信号(如 kubectl delete pod)后执行,执行期间 Pod 仍处于 Running 状态,钩子执行完成后才会发送 SIGTERM 信号终止进程。
apiVersion: v1
kind: Pod
metadata:name: lifecycle-demo
spec:containers:- name: nginximage: nginx:1.25ports:- containerPort: 80lifecycle:# 启动前钩子:创建自定义目录preStart:exec:command: ["mkdir", "-p", "/data/logs"]# 终止前钩子:优雅关闭 NginxpreStop:exec:command: ["nginx", "-s", "quit"]terminationGracePeriodSeconds: 60  # 优雅终止宽限期(默认30s)

三、容器终止流程(优雅关闭关键步骤)

当 Pod 被删除(kubectl delete pod)或因副本缩容被终止时,会执行优雅关闭流程,避免业务中断或数据丢失,核心步骤如下:

  1. 触发终止:K8s 向 Pod 发送终止信号,Pod 状态变为 Terminating,并从 Service Endpoints 中移除(不再接收新流量);
  2. 执行 PreStop Hook:运行用户定义的终止前钩子(如关闭连接、保存数据);
  3. 发送 SIGTERM 信号:钩子执行完成后,向容器进程发送 SIGTERM 信号,通知进程优雅退出;
  4. 等待进程退出:等待 terminationGracePeriodSeconds 时长(默认 30s),若进程仍未退出;
  5. 强制终止:发送 SIGKILL 信号强制杀死进程,清理容器资源。

四、容器生命周期状态流转图

用户提交 Pod YAML → API Server 存储 ETCD → Scheduler 调度节点
→ Kubelet 拉取镜像 → 容器创建(Container Creating)
→ 执行 PreStart Hook → 启动容器进程 → 容器运行中(Running)
→ 执行 Startup/Liveness/Readiness Probe
→ 触发终止(删除 Pod/缩容)→ Pod 状态变为 Terminating
→ 执行 PreStop Hook → 发送 SIGTERM → 等待宽限期
→ 进程退出 → 容器销毁(Terminated)→ Pod 状态 Succeeded/Failed

五、应用场景

定义生命周期的主要目的是为了解决容器“生”与“死”过程中的痛点,确保业务的高可用性数据一致性

阶段 钩子名称 核心作用 典型应用场景
启动后 PostStart 初始化与预热 在容器主进程启动后立即触发。 1. 加载配置:从配置中心拉取最新配置文件。
2. 数据预热:将热点数据加载到缓存(Redis)中。
3. 依赖检查:等待数据库连接池建立完毕。
停止前 PreStop 优雅停机与流量平滑 在容器被终止前触发,K8s 会等待该钩子执行完毕或超时后才发送 SIGTERM 信号。 1. 流量摘除:通知负载均衡器(如 Nginx)将自己下线,停止接收新请求。
2. 数据落盘:将内存中的临时数据保存到磁盘或数据库。
3. 任务完成:等待当前正在处理的请求处理完毕后再关闭进程。

实战案例:Web 应用的优雅启停

假设你有一个 Java Spring Boot 应用,部署在 Kubernetes 中。为了保证升级时不丢单、启动时不报错,你需要配置生命周期钩子。

场景描述

  1. 启动时:应用启动后,需要先执行一个脚本 warmup.sh 来预热缓存,预热完成后才能对外提供服务。
  2. 停止时:应用收到停止指令后,不能马上关闭,需要先从注册中心注销,并处理完剩余请求(耗时约 10 秒),然后再关闭。
apiVersion: apps/v1
kind: Deployment
metadata:name: web-app-lifecycle
spec:replicas: 3selector:matchLabels:app: web-apptemplate:metadata:labels:app: web-appspec:containers:- name: spring-boot-appimage: my-app:v1.0ports:- containerPort: 8080# 1. 启动后钩子 (PostStart)lifecycle:postStart:exec:command:- /bin/sh- -c- |echo "容器已启动,正在执行缓存预热..."# 模拟调用内部接口进行预热curl -s http://localhost:8080/api/warmupecho "预热完成!"# 2. 停止前钩子 (PreStop)preStop:exec:command:- /bin/sh- -c- |echo "容器即将停止,正在摘除流量并处理剩余请求..."# 模拟从注册中心注销curl -X POST http://discovery-service/unregister# 模拟等待当前请求处理完成 (比如等待 10 秒)sleep 10echo "清理完成,准备关闭。"# 配合就绪探针,确保预热完成后才接入流量readinessProbe:httpGet:path: /actuator/healthport: 8080initialDelaySeconds: 5periodSeconds: 5
http://www.jsqmd.com/news/556020/

相关文章:

  • Jaspersoft Studio 动态字体颜色设置实战指南
  • ClawdBot个人AI助手5分钟快速部署:零基础搭建本地智能聊天机器人
  • 新中大SE系统反月结避坑指南:从月结修复到重新记账的完整操作解析
  • VeraCrypt终极语言切换指南:30+语言一键切换,打造个性化加密体验
  • 铜钟音乐:专注纯净听歌体验的终极免费音乐平台指南
  • 中医贴敷技术培训,简单易学好创收,守嘉教你实用技能 - 品牌排行榜单
  • Simple Comic:Mac平台的开源漫画阅读解决方案
  • 告别窗口混乱:Loop如何让macOS窗口管理效率提升300%
  • qData v1.2.0发布,完善数据中台能力
  • OpenClaw安全实践:百川2-13B本地化部署的权限管控要点
  • 分割回文串-leetcode
  • AI-Agent元年来了!2026年全面爆发,掌握Agent工程化思维,从0到1打造爆款智能体!
  • 白帽 SEO 与网站分析数据的关系是什么
  • Mplus路径系数差异比较实战:两种方法详解与选择指南
  • 罗技鼠标PUBG压枪宏:三步实现稳定射击的终极指南
  • SequenceInputStream的源码和Vector.class的一些函数说明(windows操作系统,JDK8)
  • Java开发者必看:Lingbot深度模型服务端集成与高并发处理
  • 在职零基础备考西药执业药师,我的题库选择心路历程 - 医考机构品牌测评专家
  • Qwen3-0.6B-FP8企业实操:HR部门用其批量生成岗位JD与面试题
  • 检索模型bi-encoder笔记
  • 保姆级教程:手把手教你用LoRA微调通义千问3.5-2B模型,代码即用,小白也能轻松入门!
  • 文脉定序系统一键部署教程:基于Ubuntu 20.04的快速环境搭建
  • GemPy:重新定义三维地质建模的数学引擎与行业变革
  • OpenVoice语音合成技术全解析:从痛点突破到多场景落地实践
  • 如何零代码搭建专业Web直播系统?Jessibuca完全指南
  • 中药执业药师四科老师实力排名榜(2026版) - 医考机构品牌测评专家
  • 大模型训练崩了怎么办?Python调试3步定位法:从CUDA错误到梯度爆炸一网打尽
  • 2步实现格式自由:Save Image as Type让网页图片转换体验升级10倍
  • Firedrake实战指南:如何用有限元方法高效求解复杂偏微分方程
  • 用友U8 API开发实战:手把手教你使用API资源管理器完成单据操作