优雅退出是什么
应用对 SIGTERM 的处理决定退出质量:停止接收新请求、处理完成在途请求、释放资源后以正常状态退出。发布与重启时旧实例先摘流再终止,配合探针与 preStop 钩子可以显著减少发布期的错误率尖峰;退出时限必须小于容器宽限期,否则会被强制终止,优雅逻辑形同虚设。
基本信息
| 信号 | 容器主进程收到 SIGTERM |
|---|---|
| 正确动作 | 停收新连接、处理在途请求、释放资源后退出 |
| 兜底 | 宽限期内未退出则被 SIGKILL 强制终止 |
| 语言侧 | 多数框架需要显式注册信号处理 |
| 时限 | 退出逻辑耗时小于宽限期 |
典型使用场景
- 滚动发布:旧实例优雅退出,流量无损转移。
- 缩容:控制器删除多余副本时的标准路径。
- 手动重启:滚动重启同样触发同一套退出逻辑。
- 消费端停机:先停止拉取新消息再处理完在途消息。
- 连接清退:退出前注销服务发现与域名记录。
Python 示例
Python 示例
import signal, sys
def handle(signum, frame):
server.shutdown()
sys.exit(0)
signal.signal(signal.SIGTERM, handle)退出阶段
| 阶段 | 动作 | 失败后果 |
|---|---|---|
| 摘流 | 探针失败或端点移除 | 新请求仍打到旧实例 |
| 终止信号 | 停收新连接、处理在途 | 在途请求失败 |
| 宽限期 | 等待退出完成 | 超时被强制终止 |
优雅退出时限要小于宽限期;停机与发布共用同一套退出逻辑,避免只在一个路径上验证。
顺序写进退出流程:停收新请求、等在途完成、销毁连接池与线程,步骤齐全才能干净退出。
preStop 钩子可做摘流缓冲:先让负载均衡感知下线,再发终止信号,减少竞态窗口。
长耗时任务要专门设计:批处理在收到信号后要么快速落盘检查点,要么调大宽限期。