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,时间预算要把钩子与排空两段加起来。