私有子网ECS Fargate搭配Application Load Balancer容器循环重启问题咨询
问题排查与解决建议
1. 优先排查容器主进程逻辑
你给出的容器退出码为0,说明主进程是正常执行结束退出,而非异常崩溃,这是最高概率的触发重启的原因:
- 你的容器启动命令是执行
/tmp/init.sh,如果该脚本仅为初始化逻辑,执行完成后就退出,且脚本内部启动的业务进程是后台运行(加了&参数),那么主进程(执行脚本的bash)退出后,容器就会被判定为结束运行,ECS会自动重启任务。 - 修复方案:
- 在init.sh的最后,用
exec命令启动你的业务服务进程,让业务进程接替bash成为PID 1主进程,持续保持运行 - 若需要同时运行多个进程,可引入supervisor等进程管理工具作为容器主进程,保证业务进程持续在线
- 在init.sh的最后,用
2. 调整健康检查相关配置
你的初始化脚本本地执行需要数分钟,默认的健康检查配置大概率没有预留足够的初始化时间:
- 调整ECS服务的健康检查宽限期:在ECS服务配置中设置
healthCheckGracePeriodSeconds参数,值要大于你的脚本最长初始化时间,比如初始化需要5分钟就设置为360,该时间内ECS不会因为健康检查失败排空任务。 - 调整ALB目标组健康检查参数:
- 把不健康阈值调高到
10,健康检查间隔设置为30,累计给足5分钟的初始化等待时间 - 确认健康检查的端口指定为
9003,检查路径是你业务服务暴露的可访问路径(比如/或者/health),避免路径配置错误导致健康检查失败
- 把不健康阈值调高到
3. 验证网络配置正确性
逐一核对以下配置避免网络不通导致健康检查失败:
- 确认ECS任务的安全组入站规则,允许ALB安全组的IP段访问
9003端口 - 确认ALB的HTTPS监听器配置正确,证书有效,转发规则指向绑定了ECS服务的9003端口IP目标组
- 确认VPC内网没有ACL规则拦截9003端口的通信
4. 排查容器运行日志
到CloudWatch Logs中查看对应ECS任务的容器日志,确认/tmp/init.sh的执行过程,排查是否有初始化报错、业务服务启动失败的情况,可在init.sh中增加打印日志的逻辑,确认脚本是否执行完成、业务服务是否成功监听9003端口。
内容的提问来源于stack exchange,提问作者Dave Michaels
相关产品推荐
相关产品推荐

