如何配置ECS在排空旧任务前等待负载均衡健康检查通过?
ECS部署时避免目标组无健康实例的平滑部署配置
问题核心是ECS默认部署逻辑仅以「容器进程启动」作为任务运行的判定标准,没有绑定负载均衡的健康检查状态作为任务切流、下线的判断依据,才会出现新任务还没就绪就把旧任务杀掉的流量空窗。按以下步骤配置即可解决:
1. 开启部署时等待目标组健康检查(核心必开)
在ECS服务的部署配置页,打开等待目标组健康检查开关。开启后ECS不会在新任务刚注册到目标组就立刻注销旧任务,会持续轮询目标组的实例状态,直到新任务被ALB标记为healthy,才会触发旧任务的注销流程,从根源上避免新任务未就绪就切流的问题。
2. 调整部署容量阈值
- 将服务部署配置中的
最小健康任务百分比设为100%:保证部署全流程中,始终有等同于期望副本数的任务处于可用状态,不会提前下线旧任务腾挪资源。 - 将
最大任务百分比设为200%:部署时会先启动等量的新任务副本,等新副本全部通过健康检查后,再批量下线旧副本,全程没有容量缺口。如果集群资源比较紧张,这个值最低不要低于150%,保证至少能先启动1台新副本完成健康校验再推进切流。
3. 对齐多层健康检查规则
- 任务定义层面必须配置容器健康检查:不要只靠容器进程启动判定任务就绪,要给容器配置HTTP/TCP类型的健康检查,探测应用的实际就绪端口/健康检查端点(比如
/healthz),只有通过容器健康检查的任务,才会被ECS注册到ALB目标组。容器健康检查的启动宽限期要匹配应用实际启动耗时,比如普通Go应用设10-20秒、Java SpringBoot应用设40-60秒即可,不要设太长拖慢部署节奏,也不要设太短导致应用还没启动完就被误判不健康。 - ALB目标组层面调整健康检查阈值:建议设为连续2次检查成功即判定健康、检查间隔15秒,平衡健康判定的准确性和部署速度,避免等待太久拉长部署周期,也不会因为偶发的启动抖动误判状态。
4. 配置优雅下线规则避免在途请求报错
- 把ALB目标组的
注销延迟设为30-60秒,不要设为0:旧任务从目标组注销时,ALB会在这段时间里停止给旧任务转发新请求,等待旧任务把已经接收的存量请求处理完再断开连接。 - 任务定义里的
停止超时时间不要短于注销延迟时长,保证旧任务收到SIGTERM终止信号后,有足够时间处理完存量请求再退出,不会被强制杀掉导致请求5xx。
配置完成后的部署流程会变为:
- 旧版本任务正常运行承载流量
- 提交新任务定义后,ECS按最大任务百分比阈值启动新任务
- 新任务启动完成、通过容器级健康检查后,才会被注册到ALB目标组
- ALB对新任务做健康探测,直到新任务连续通过检查被标记为健康
- ECS确认新任务全部可用后,才会把旧任务从目标组注销
- 等待注销延迟时长结束、旧任务处理完所有在途请求后,再终止旧任务
全程目标组始终有健康实例承载流量,不会出现1-2分钟的流量中断空窗。
内容的提问来源于stack exchange,提问作者Ian Ling
相关产品推荐
相关产品推荐

