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

K8s学习笔记(十七) pod优雅终止流程

在 Kubernetes 中,容器生命周期钩子(Lifecycle Hooks)postStartpreStop)与Pod 优雅终止流程是保障应用 “平稳启动” 和 “体面下线” 的核心机制。它们就像应用的 “启动助手” 和 “终止管家”,确保应用在生命周期的关键节点能执行自定义逻辑,避免异常。

1 两个核心钩子:postStart 和 preStop

容器生命周期钩子是 K8s 在容器启动后终止前触发的 “回调函数”,允许用户注入自定义逻辑(如初始化、清理操作)。

1.1 postStart:容器启动后的 “初始化钩子”

作用:容器启动后立即执行的自定义逻辑(如初始化配置、注册服务、创建临时文件等)。

执行时机:容器的主进程(command定义的命令)启动后尽快执行(但不保证严格顺序,可能在主进程启动前或后,取决于容器运行时)。

特点

  • 不阻塞容器启动:即使postStart执行失败(如脚本报错),容器仍会显示 “运行中”(但 K8s 会记录事件)。
  • 无返回值:K8s 只关心是否触发,不依赖其执行结果。

使用场景

  • 向应用写入启动参数(如从环境变量生成配置文件);
  • 通知服务注册中心 “容器已启动”;
  • 调整容器内部权限(如chmod修改目录权限)。

配置示例

给 Nginx 容器启动后创建一个started标记文件:

apiVersion: v1
kind: Pod
metadata:name: poststart-demo
spec:containers:- name: nginximage: nginx:alpinelifecycle:postStart:exec:  # 执行命令:创建标记文件command: ["sh", "-c", "echo 'Container started at $(date)' > /usr/share/nginx/html/started.html"]ports:- containerPort: 80

验证:容器启动后,进入容器查看文件是否创建:

kubectl exec -it poststart-demo -- cat /usr/share/nginx/html/started.html
# 输出:Container started at Wed Oct 8 12:00:00 UTC 2025
1.2 preStop:容器终止前的 “清理钩子”

作用:容器被终止前执行的自定义逻辑(如优雅关闭连接、保存数据、注销服务等)。

执行时机:容器收到终止信号前,是 Pod 优雅终止流程的核心步骤(后面详细讲)。

特点

  • 阻塞终止流程:preStop执行期间,容器不会被强制终止(执行时间计入 “宽限期”)。
  • 失败不影响终止:即使preStop执行失败,K8s 仍会继续终止容器。

使用场景

  • Web 服务:处理完当前请求后再退出(如nginx -s quit);
  • 数据库客户端:关闭连接池,避免 “僵尸连接”;
  • 微服务:主动从注册中心注销,防止其他服务调用无效节点。

配置示例

Nginx 终止前执行优雅关闭命令:

apiVersion: v1
kind: Pod
metadata:name: prestop-demo
spec:containers:- name: nginximage: nginx:alpinelifecycle:preStop:exec:  # 优雅关闭Nginx,处理完现有请求command: ["sh", "-c", "nginx -s quit; sleep 5"]  # 等待5秒确保请求处理完ports:- containerPort: 80terminationGracePeriodSeconds: 30  # 宽限期30秒(包含preStop执行时间)

2 Pod 的优雅终止流程:从 “删除” 到 “彻底退出”

当你执行kubectl delete pod <name>或 Pod 因故障被终止时,K8s 不会直接 “杀死” 容器,而是按 “优雅流程” 处理,确保服务平稳下线。整个流程分为 5 个关键步骤,preStop是其中的核心环节:

步骤 1:标记 Pod 为 “终止中”(Terminating)
  • API Server 接收删除请求,给 Pod 添加metadata.deletionTimestamp(终止开始时间),Pod 状态变为Terminating
  • Service 自动将该 Pod 从 Endpoint 列表中移除(不再接收新流量),避免新请求进入。
步骤 2:执行 preStop 钩子(关键!)
  • kubelet 调用容器的preStop钩子,执行自定义清理逻辑(如处理存量请求、保存数据)。
  • 注意preStop的执行时间会占用 “宽限期”(terminationGracePeriodSeconds,默认 30 秒)。如果preStop执行时间超过宽限期,后续步骤会提前触发。
步骤 3:发送 SIGTERM 信号(请求终止)
  • preStop执行完成(或超时)后,kubelet 向容器主进程发送SIGTERM信号(“温柔请求”:请你自己退出)。
  • 应用收到SIGTERM后,应主动停止工作(如关闭监听端口、结束子进程)。
步骤 4:等待容器自行退出
  • 容器收到SIGTERM后,进入 “自我终止” 阶段。K8s 会等待容器主动退出,等待时间仍计入宽限期。
步骤 5:强制终止(SIGKILL)
  • 若宽限期结束后容器仍未退出,kubelet 发送SIGKILL信号(“强制命令”:立即终止),确保容器退出。
流程时间线示例(宽限期 30 秒):
t=0:执行kubectl delete pod,Pod标记为Terminating,从Service移除  
t=1s:执行preStop(假设耗时10秒:如nginx -s quit + sleep 5)  
t=11s:preStop完成,发送SIGTERM信号  
t=11s~t=30s:容器收到SIGTERM后自行退出(若25秒时退出,流程结束)  
t=30s:若容器仍未退出,发送SIGKILL强制终止  

3 关键参数与注意事项

3.1 宽限期(terminationGracePeriodSeconds)
  • 定义 Pod 从 “标记为 Terminating” 到 “被强制终止” 的最长时间(默认 30 秒)。
  • 需根据preStop执行时间和应用退出耗时调整:
    • preStop需要 20 秒,应用退出需要 10 秒,宽限期应≥30 秒;
    • 若设置为 0,会直接发送 SIGKILL,跳过preStop和 SIGTERM(不推荐,可能导致数据丢失)。
3.2 postStart 的坑:不要依赖执行顺序
  • postStart可能在容器主进程启动前执行(如容器运行时先触发钩子,再启动主进程),因此不能用它做 “主进程依赖的初始化”(如创建主进程必须的配置文件)。
  • 这类场景应使用init 容器(确保在主进程启动前完成)。
3.3 preStop 的坑:避免无限阻塞
  • preStop脚本不能是无限循环(如while true; do sleep 1; done),否则会耗尽宽限期,导致容器被强制终止,清理逻辑失败。
3.4 与健康探针的配合
  • 终止流程中,就绪探针(readinessProbe)会自动失败(因为 Pod 已标记为 Terminating),确保 Service 不再转发新流量,与preStop配合处理存量请求。

4 总结:钩子与优雅终止的关系

  • postStart:确保容器启动后能执行初始化操作(如注册、配置),让应用 “平稳启动”;
  • preStop:是优雅终止的核心,确保容器终止前能 “体面下线”(处理请求、保存数据);
  • 优雅终止流程:通过 “标记 Terminating→preStop→SIGTERM→SIGKILL” 的步骤,结合宽限期,平衡 “快速终止” 和 “安全下线” 的需求。
http://www.dtcms.com/a/461553.html

相关文章:

  • Redis-基础介绍
  • Redis常用数据库及单线程模式
  • Subword-Based Tokenization策略之BPE与BBPE
  • 网站关键词用热门的还是冷门青岛天河小学网站建设
  • 个人域名备案 网站名称一元购网站建设流程图
  • 企业级灰度发布架构:基于Nginx的精细化流量治理与平滑演进实践
  • 【滑动窗口专题】第一讲:长度最小的子数组
  • 软考-系统架构设计师 基于架构的软件开发方法详细讲解
  • 电子电气架构 --- 操作系统的基本概念
  • 苏州做网站公司电话wordpress资源分享网
  • 手机能建设网站企业的做网站
  • Unity笔记(十一)——换装、Spine骨骼动画、3D动画相关
  • 面向汽车网络安全的轻量级加密技术
  • 《投资-114》价值投资者的认知升级与交易规则重构 - 从大规模分工的角度看,如何理解“做正确的事”,即满足下游正确的需求
  • 添加一路AXI总线对DDR进行读写时,XDMA测试不通过
  • 基于python的机器学习(十)—— 评估算法(三)
  • 男女做那个的的视频网站检察院门户网站建设成效
  • Oracle的SID是什么
  • Oracle大会临近,23ai 本地版会发布吗?
  • 【Python刷力扣hot100】11. Container With Most Water
  • 通信建设网站做网站主页上主要放哪些内容
  • 《常用 IDL(接口定义语言)详解与对比》
  • 做二手房产网站多少钱河南建设工程信息网站
  • K230基础-获取触摸坐标
  • Linux应用--网络编程
  • 鸟哥的Linux私房菜 第三部分: 学习shell与shell script
  • 鸿蒙中 UDP 数据包发不出去?一文教你从权限到代码彻底排查!
  • 前端小白学习路线(参考)
  • 大连工业大学图书馆网站建设优化培训班
  • 浅谈 富文本编辑器