摘流缓冲是什么
实例终止时流量系统感知存在延迟:端点移除传播、负载均衡刷新、健康检查周期都要时间,期间新请求仍可能被转发到已经停止的实例。发布缓冲就是把这段窗口提前算进来:先摘流量、等缓冲、再停进程。涉及入口链路每一层——云负载均衡、Ingress 或网关、服务网格、Pod 探针,各层缓存端点的时间不同,按实际链路逐环节实测估算,而不是套固定秒数。
基本信息
| 组成 | 端点传播 + 健康检查周期 + 连接排空 |
|---|---|
| 缓冲手段 | preStop sleep、宽限期、探针阈值 |
| 验证 | 发布期错误率与连接重置计数 |
| 差异 | 不同流量入口感知机制不同,按实际入口实测 |
| 常见链路 | 云负载均衡 → Ingress/Gateway → 服务网格 → Pod,逐层叠加 |
典型使用场景
- 发布缓冲估算:滚动更新前先算清各环节耗时,再定终止等待时长
- 缩容下线:主动摘流量、排空连接,最后才停进程
- 探针调优:压缩健康检查周期可缩短感知窗口,但要防抖动
- 偶发排障:发布期零星连接重置,回溯是否缓冲不足
- 多层入口:外部负载均衡与集群内入口各自维护后端列表,逐层确认
- 验收标准:用错误率与连接重置计数验证缓冲是否真的生效
缓冲估算口径
缓冲估算口径
摘流缓冲 ≈ 端点传播时间 + 健康检查周期 + 在途请求最长时间
端点传播:控制面到数据面移除后端记录,云负载均衡与网格各有刷新节奏
健康检查:周期越长摘除判定越慢,留给它的时长要覆盖一整个周期
在途请求:按 P99 耗时量级估算,长连接还要把空闲连接的关闭时机算进来
(用发布期实测数据校准,而不是套固定值)K8s 终止缓冲配置
K8s 终止缓冲配置
spec:
terminationGracePeriodSeconds: 30 # 宽限期:给排空留足时间
containers:
- name: app
lifecycle:
preStop:
exec:
command: ["sh", "-c", "sleep 10"] # 先等摘流完成再退出
# preStop 结束后才发 SIGTERM,sleep 值按实测缓冲设置缓冲环节逐项读法
| 环节 | 含义 | 调优方向 |
|---|---|---|
| 端点传播 | 后端列表移除实例的传播耗时 | 以实测校准,通常无需改动 |
| 健康检查周期 | 按周期探测判定实例不可用 | 压缩周期可缩短窗口,但过短会放大抖动 |
| 连接排空 | 已建立连接处理完或超时关闭 | 长连接需客户端配合优雅关闭 |
| 宽限期 | 终止前最多等待时长 | 必须大于前几项之和,否则会被强杀 |
先实测再定值:用压测流量在预发环境滚一轮,量出每个环节的耗时,再设 preStop 与宽限期。
preStop 与宽限期的关系:preStop 在宽限期内执行,sleep 太接近上限会被 SIGKILL 截断。
多层入口逐层确认:各层摘流机制不同,端到端窗口是各层叠加,单看一层会低估。