Amazon Elastic Container Service(Amazon ECS)任务需要很长时间才能变为“已停止”状态。或者,当容器实例设置为“正在耗尽”时,Amazon ECS 任务停留在“正在运行”状态。如何解决此问题?
简短描述
将 ECS 实例设置为正在耗尽时,Amazon ECS 会执行以下操作:
- 阻止计划将新任务置放在容器实例上
- 停止容器实例上处于“正在运行”状态的任务
由于配置参数或任务出现问题,任务可能会停留在“正在运行”状态,或者需要更长的时间才能变为“已停止”状态。要解决这些问题,请考虑以下选项:
解决方法
确认 DeploymentConfiguration 参数设置正确无误
- 打开 Amazon ECS 控制台。
- 在导航窗格中,选择集群,然后选择容器实例即将耗尽的集群。
- 选择 ECS 实例选项卡,然后在状态部分选择正在耗尽。
- 选择容器实例,然后为即将耗尽或需要很长时间才能耗尽的任务找出相应的服务。
- 选择服务选项卡,选择相应服务,然后选择部署。
- 查看 minimumHealthyPercent 和 maximumPercent 的值。
注意:容器实例上处于正在运行状态的服务任务将停止并根据服务的部署配置参数(minimumHealthyPercent 和 maximumPercent)加以替换。
确认“取消注册延迟”值设置正确无误
**重要信息:**以下步骤仅适用于使用应用程序负载均衡器或网络负载均衡器的服务。如果服务使用的是经典负载均衡器,请检查连接耗尽值。
- 打开 Amazon ECS 控制台。
- 在导航窗格中,选择集群,然后选择容器实例即将耗尽的集群。
- 选择服务选项卡,然后选择堆栈停留在正在运行状态的服务。
- 选择目标组名称。
- 在详细信息选项卡上,向下滚动,然后选中取消注册延迟复选框。
确认 ECS_CONTAINER_STOP_TIMEOUT 值设置正确无误
- 使用 SSH 连接到容器实例。
- 运行 docker inspect ecs-agent --format '{{json .Config.Env}}' 命令。
- 检查 ECS_CONTAINER_STOP_TIMEOUT 是否有值。
**注意:**ECS_CONTAINER_STOP_TIMEOUT 是一个 ECS 容器代理参数,用于定义 Amazon ECS 在结束容器之前需要等待多长时间。任务停止后,开始计时。如果在运行步骤 2 中的命令后未在输出结果中看到 ECS_CONTAINER_STOP_TIMEOUT 参数,则说明 Amazon ECS 使用的是默认值(30 秒)。
查找其他与任务相关的问题
- 使用 SSH 连接到容器实例。
- 验证 Amazon Linux 1 AMI 或 Amazon Linux 2 AMI 上的 Docker 进程守护程序和 Amazon ECS 容器代理是否正在运行。
- 根据 logConfiguration 设置的日志驱动程序检查应用程序日志。
**注意:**例如,如果任务使用 awslogs 日志驱动程序,请检查 Amazon CloudWatch Logs 是否存在问题。