首页/开发/CI/CD 与发布速查/负载均衡摘流延迟与发布
发布策略60 条

负载均衡摘流延迟与发布

实例终止时流量系统的感知存在延迟:端点移除传播、负载均衡刷新、健康检查周期都要时间;发布缓冲按这些环节实测估算。

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

摘流缓冲是什么

实例终止时流量系统感知存在延迟:端点移除传播、负载均衡刷新、健康检查周期都要时间,期间新请求仍可能被转发到已经停止的实例。发布缓冲就是把这段窗口提前算进来:先摘流量、等缓冲、再停进程。涉及入口链路每一层——云负载均衡、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 截断。
多层入口逐层确认:各层摘流机制不同,端到端窗口是各层叠加,单看一层会低估。

易错点

  • 无缓冲直接终止实例:切换瞬间请求失败或连接重置
  • 只调大宽限期不改摘流:失败窗口被拉长而非消除
  • 照搬他人参数:入口链路不同感知耗时也不同,实测校准后再落值
  • 长连接场景忽略客户端侧:服务端摘流后客户端仍握着旧连接,需配置重试与优雅关闭
  • 健康检查周期压得过短:实例抖动被放大,反复进出后端列表反而更不稳定

数据来源与参考

  • Kubernetes 文档《Termination of Pods》
  • Kubernetes 文档《Container Lifecycle Hooks》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌