首页/开发/CI/CD 与发布速查/preStop 钩子与摘流延迟
发布策略60 条

preStop 钩子与摘流延迟

preStop 在容器收到终止信号前同步执行:常用于等待负载均衡完成摘流、通知对端下线、留出请求处理时间,让滚动发布中的实例平滑退出。

CI/CD 与发布速查开发更新于 2026-10-13

preStop 钩子是什么

preStop 在容器收到终止信号前同步执行,是 Pod 终止流程的一部分:先跑钩子,再发 SIGTERM,宽限期耗尽后 SIGKILL。常用它等待负载均衡完成摘流、通知对端下线、留出存量请求处理时间,让滚动发布中的实例平滑退出,消除发布瞬间的零星 502。判断是否需要它,看发布期有没有零星请求失败:有就加摘流等待,没有就别加复杂度。

基本信息

执行时机Pod 终止流程开始、SIGTERM 之前
类型exec / httpGet,同步执行
计时占用 terminationGracePeriodSeconds 额度
常用模式sleep 让 LB 完成摘流
失败语义钩子失败不阻塞终止流程,进程照样会被终止
配合探针就绪探针先行摘流,preStop 兜住残余流量

典型使用场景

  • 滚动发布平滑退出:等待 LB 摘流完成再断开服务
  • 长连接排空:给 WebSocket、gRPC 流式连接留处理时间
  • 消费者优雅停止:停止拉取新消息、处理完在途消息再退出
  • 注册中心摘除:先通知注册中心下线,等调用方感知
  • 数据库收尾:等连接池归还、事务提交后再退出
  • 弹性缩容:缩容实例前等在途请求结束,避免容量瞬时下降
  • 维护重启:先摘流再重启,过程对用户基本无感

preStop 示例

preStop 示例
lifecycle:
  preStop:
    exec:
      command: ["sh", "-c", "sleep 5"]
# 应用侧同时处理 SIGTERM:
# 1) 停止接收新请求  2) 排空在途请求  3) 正常退出

关键参数

字段作用常见取值
terminationGracePeriodSeconds终止总宽限,覆盖钩子与排空30s 起步
preStop 时长摘流等待与通知5-15s,按 LB 感知时间
SIGTERM 处理应用排空存量请求由应用实现
SIGKILL宽限期结束后的强杀设计目标是走不到这里
sleep 时长按「LB 摘流感知时间 + 连接排空时间」估算;不同 LB 实现感知延迟不同。
preStop 与 SIGTERM 是接力关系:钩子负责摘流,应用负责把存量请求做完,两者缺一不可。
钩子是同步阻塞的:它结束之前不会发 SIGTERM,时间预算要把钩子与排空两段加起来。

易错点

  • preStop 时长超出宽限期:钩子被中断,进程被 SIGKILL,连接硬断
  • 只加 preStop 不改应用:应用忽略 SIGTERM,存量请求仍然失败
  • sleep 拍脑袋定值:太短照样 502、太长拖慢发布,用监控数据估算
  • preStop 里做重活:迁移或清理拖满宽限期,钩子只做摘流与等待
  • 所有容器同一套配置:sidecar 与主容器的退出节奏不同,按容器角色分别设置

数据来源与参考

  • Kubernetes 文档《Container Lifecycle Hooks》
  • Kubernetes 文档《Pod Lifecycle》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌