当容器实例设置为“耗尽”时,我如何对需要很长时间才能停止的 Amazon ECS 任务进行问题排查?
上次更新日期:2022 年 4 月 28 日
我的 Amazon Elastic Container Service(Amazon ECS)任务需要很长时间才能变为“已停止”状态。或者,当容器实例设置为“耗尽”时,我的 Amazon ECS 任务停滞在“正在运行”状态。如何解决此问题?
简短描述
当您将 ECS 实例设置为耗尽时,Amazon ECS 将执行以下操作:
- 防止在容器实例上安排新任务
- 停止处于“正在运行”状态的容器实例上的任务
由于配置参数或任务出现问题,您的任务可能停滞在“正在运行”状态,或需要较长时间才能移至“已停止”状态。要解决这些问题,请考虑使用以下选项:
- 确认您的 DeploymentConfiguration 参数正确设置
- 确认取消注册延迟值正确设置
- 确认 ECS_CONTAINER_STOP_TIMEOUT 值正确设置
- 查找其他与任务相关的问题
解决方法
确认您的 DeploymentConfiguration 参数正确设置
- 打开 Amazon ECS 控制台。
- 在导航窗格中,选择 Clusters(集群),然后选择您的容器实例即将耗尽的集群。
- 选择 ECS 实例选项卡,然后在状态部分选择耗尽。
- 选择您的容器实例,然后找出即将耗尽或耗尽所花时间较长的任务对应的服务。
- 选择服务选项卡,选择选择该服务,然后选择部署。
- 检查 minimumHealthyPercent 和 maximumPercent 的值。
注意:根据服务的部署配置参数,停止和替换处于正在运行状态的容器实例上的服务任务:minimumHealthyPercent 和 maximumPercent。
确认取消注册延迟值正确设置
重要提示:以下步骤仅适用于使用应用程序负载均衡器或网络负载均衡器的服务。如果您的服务使用的是 Classic Load Balancer,请检查 Connection Draining 值。
- 打开 Amazon ECS 控制台。
- 在导航窗格中,选择 Clusters(集群),然后选择您的容器实例即将耗尽的集群。
- 选择 Services(服务)选项卡,然后选择堆栈停滞在 RUNNING(正在运行)状态的服务。
- 选择目标组名称。
- 在详细信息选项卡上,向下滚动,然后选择取消注册延迟复选框。
确认 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 连接到您的容器实例。
- 验证 Docker 守护程序和 Amazon ECS 容器代理正在为您的 Amazon Linux 1 AMIs 或 Amazon Linux 2 AMIs 运行。
- 根据由 logConfiguration 设置的日志驱动程序检查应用程序日志。
注意:例如,如果您的任务正在使用 awslogs 日志驱动程序,请检查您的 Amazon CloudWatch Logs 是否有问题。