alb如何实现服务滚动升级

在阿里云应用型负载均衡(ALB)中,实现服务器组内后端服务的滚动升级(Rolling Update),核心目标是:在不中断业务的前提下,逐批替换或更新后端服务器实例。ALB本身不直接提供“滚动升级”功能,但可通过其连接优雅中断权重控制健康检查机制弹性伸缩(ESS)或外部编排工具(如 Kubernetes)协同配合来实现平滑滚动升级。


1.移除服务器 + 连接优雅中断实现滚动升级(推荐)

这是最符合 ALB 设计语义、且能确保优雅下线的方式。

1.1前提条件

  • 服务器组已开启连接优雅中断(Connection Drain)功能,并设置合理的超时时间(如 300 秒)。
  • 后端服务支持快速启动和健康就绪探针(用于新实例上线)。

1.2操作步骤(以单台服务器为例,可循环执行)

  1. 将待升级服务器从 ALB 服务器组中移除
    调用 API RemoveServersFromServerGroup,将目标 ECS/ECI 实例从服务器组中删除。

  2. 触发连接优雅中断
    ALB 检测到服务器被移除后:

    • 不再分配新请求
    • 已有连接在 ConnectionDrainTimeout 时间内继续传输
    • 超时后主动断开残留连接,保障业务平稳下线。
  3. 对已移除的服务器执行升级操作

    • 停止应用;
    • 更新代码/镜像/配置;
    • 重启服务并验证本地功能。
  4. 将升级后的服务器重新加入服务器组
    调用 AddServersToServerGroup 添加回原服务器组,权重设为正常值(如 100)。

  5. 等待健康检查通过
    ALB 会自动对新加入的服务器执行健康检查,仅当状态为“健康”时才开始分发流量

  6. 重复上述过程,逐台处理其余服务器

提示:此方式依赖“显式移除”动作才能激活连接优雅中断。仅将权重设为 0 不会触发优雅中断,存量长连接可能长期滞留。


2.权重置 0 + 健康检查控制辅助实现(适用于特定场景)

该方式适用于无法立即移除服务器的场景(如使用固定 IP 列表),但无法保证连接优雅中断生效

2.1操作流程

  1. 将目标服务器权重调整为 0
    调用 UpdateServerGroupServersAttribute 接口,设置 Weight=0
    → ALB 停止分配新请求,但已有连接继续存在

  2. 等待业务自然释放连接

    • 依赖客户端主动关闭连接;
    • 或依赖 ALB 的空闲超时(默认 900 秒)自动断开;
    • 无主动断开机制,不适合有长连接(如 WebSocket)的场景。
  3. 执行升级操作(同上)

  4. 升级完成后,恢复权重为正常值(如 100)

⚠️ 风险提示:此方式不会触发连接优雅中断,若存在长连接,可能导致:

  • 后端资源无法及时释放;
  • 升级期间仍有旧版本处理请求;
  • 无法精确控制下线时间窗口。

3.弹性伸缩(ESS)或 Kubernetes自动化滚动升级(生产推荐)

在云原生或自动扩缩场景中,建议通过更高层编排工具联动 ALB

场景 1:使用弹性伸缩(ESS)

  • 创建伸缩组并关联 ALB 服务器组;
  • 配置生命周期挂钩(Lifecycle Hook):
    • 实例缩容前,先从 ALB 移除(触发优雅中断);
    • 执行自定义脚本完成清理;
    • 完成后通知 ESS 继续终止实例。

场景 2:使用Kubernetes + ALB Ingress Controller(ACK)

  • Pod 进入 Terminating 状态时,ALB Ingress Controller 自动将其从服务器组移除
  • 若服务器组开启连接优雅中断,则自动进入优雅下线流程;
  • 新 Pod 就绪并通过健康检查后,自动加入流量池。

最佳实践:在 Kubernetes 中设置 preStop 钩子 + terminationGracePeriodSeconds,与 ALB 优雅中断时间对齐,实现双重保障。


3.关键配置解读

配置项 推荐值 说明
连接优雅中断超时 300 秒 根据业务最长事务时间设定,避免过早断连
健康检查间隔/阈值 间隔 2s,不健康阈值 2 次 快速感知新实例就绪状态
调度算法 加权轮询(WRR) 兼容性最好,支持权重动态调整
服务器组类型 服务器类型(ECS/ECI)或 IP 类型 根据部署架构选择