alb如何实现服务滚动升级
在阿里云应用型负载均衡(ALB)中,实现服务器组内后端服务的滚动升级(Rolling Update),核心目标是:在不中断业务的前提下,逐批替换或更新后端服务器实例。ALB本身不直接提供“滚动升级”功能,但可通过其连接优雅中断、权重控制、健康检查机制与弹性伸缩(ESS)或外部编排工具(如 Kubernetes)协同配合来实现平滑滚动升级。
1.移除服务器 + 连接优雅中断实现滚动升级(推荐)
这是最符合 ALB 设计语义、且能确保优雅下线的方式。
1.1前提条件
- 服务器组已开启连接优雅中断(Connection Drain)功能,并设置合理的超时时间(如 300 秒)。
- 后端服务支持快速启动和健康就绪探针(用于新实例上线)。
1.2操作步骤(以单台服务器为例,可循环执行)
将待升级服务器从 ALB 服务器组中移除
调用 APIRemoveServersFromServerGroup,将目标 ECS/ECI 实例从服务器组中删除。触发连接优雅中断
ALB 检测到服务器被移除后:- 不再分配新请求;
- 已有连接在
ConnectionDrainTimeout时间内继续传输; - 超时后主动断开残留连接,保障业务平稳下线。
对已移除的服务器执行升级操作
- 停止应用;
- 更新代码/镜像/配置;
- 重启服务并验证本地功能。
将升级后的服务器重新加入服务器组
调用AddServersToServerGroup添加回原服务器组,权重设为正常值(如 100)。等待健康检查通过
ALB 会自动对新加入的服务器执行健康检查,仅当状态为“健康”时才开始分发流量。重复上述过程,逐台处理其余服务器
提示:此方式依赖“显式移除”动作才能激活连接优雅中断。仅将权重设为 0 不会触发优雅中断,存量长连接可能长期滞留。
2.权重置 0 + 健康检查控制辅助实现(适用于特定场景)
该方式适用于无法立即移除服务器的场景(如使用固定 IP 列表),但无法保证连接优雅中断生效。
2.1操作流程
将目标服务器权重调整为 0
调用UpdateServerGroupServersAttribute接口,设置Weight=0。
→ ALB 停止分配新请求,但已有连接继续存在。等待业务自然释放连接
- 依赖客户端主动关闭连接;
- 或依赖 ALB 的空闲超时(默认 900 秒)自动断开;
- 无主动断开机制,不适合有长连接(如 WebSocket)的场景。
执行升级操作(同上)
升级完成后,恢复权重为正常值(如 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 类型 | 根据部署架构选择 |