跳至内容

常见问题解答: 停滞在某个生命周期状态的 Amazon ECS 任务

2 分钟阅读
0

我想知道为什么我的 Amazon Elastic Container Service (Amazon ECS) 任务停滞在特定的生命周期状态。

**问:**为什么我的 Amazon ECS 任务卡滞在“PROVISIONING(预置中)”状态?

当 Amazon Elastic Compute Cloud (Amazon EC2) 启动类型的 ECS 调度器找不到合适的 ECS 实例时,使用该启动类型的任务可能会保持“PROVISIONING(预置中)”状态。即使现有容器实例上有空间可供任务运行,也会发生这种情况。

处于“PROVISIONING(预置中)”状态的任务形成队列。Amazon ECS 向队列中添加了由于内存、端口、弹性网络接口、GPU 和 CPU 相关的资源限制而无法部署的任务。当有更多资源可用时,这些任务会转换到“RUNNING(正在运行)”状态。

如果您管理容量提供商的扩缩,则当任务无法在现有实例上获得足够的资源时,它们不会立即失败。相反,任务会进入“PROVISIONING(预置中)”状态。如果您不管理扩缩,则找不到容量的任务会立即失败。

当出现问题且处于 awsvpc 模式下的任务无法预置弹性网络接口时,它们可能会保持“PROVISIONING(预置中)”状态。当 AWS Fargate 任务出现问题无法预置弹性网络接口时,也可能保持“PROVISIONING(预置中)”状态。

**问:**为什么我的使用容量提供商的 Amazon ECS 任务会从“PROVISIONING(预置中)”状态转换为“STOPPED(已停止)”状态?

由于以下原因,ECS 可能会卡滞在“PROVISIONING(预置中)”状态:

  • 配置错误
  • 资源限制
  • 与容量提供商的规格不一致

要对这些问题故障排除,请执行以下操作:

  • 检查与容量提供商关联的自动扩缩组是否达到其最大实例数。如果达到最大限制,ECS 将无法预调配更多任务。

  • 如果您使用 Amazon EC2 启动类型,而您的自动扩缩组与启动模板关联,请检查用户数据。确保使用以下格式的正确集群名称:

    #!/bin/bash
    echo "ECS_CLUSTER=MyCluster" >> /etc/ecs/ecs.config
  • 确保将具有正确信任关系的 ecsInstanceRole 策略附加到与您的自动扩缩组关联的实例。

  • 检查 Amazon ECS 服务的事件。如果您看到以下错误,则表示实例已启动但没有为附加的负载均衡器进行设置:
    Target is in an Availability Zone that is not enabled for the load balancer(目标位于没有为负载均衡器启用的可用区)

  • 确保任务的指定子网和容量提供商管理的容器实例位于同一个可用区中。对于您在 aws-vpc 网络模式下使用容量提供商策略启动的任务,它们必须位于同一个可用区中。

  • 对于在 EC2 Linux 实例上使用 awsvpc 网络模式的任务,不会为弹性网络接口提供公共 IP 地址。要访问互联网,必须在配置为使用 NAT 网关的私有子网中启动任务。由于您在公共子网中启动的任务无法访问互联网,因此可能会卡滞在“PROVISIONING(预置中)”状态。

有关详细信息,请参阅查看 Amazon ECS 服务事件消息

**问:**为什么我的 Amazon ECS 任务卡滞在“PENDING(待处理)”状态?

当 Amazon ECS 等待容器代理执行进一步操作时,您的任务将进入“PENDING(待处理)”状态。在为任务提供资源之前,该任务将保持此状态。

有关详细信息,请参阅为什么我的 Amazon ECS 任务卡滞在“PENDING(待处理)”状态?

**问:**为什么我的 Amazon ECS 任务卡滞在“ACTIVATING(激活中)”状态?

当容器中的主进程转换到“RUNNING(正在运行)”状态并且 Amazon ECS 执行其他步骤时,您的任务将进入“ACTIVATING(激活中)”状态。例如,您必须为使用服务发现的任务创建服务发现资源。

对于属于使用多个弹性负载均衡目标组的服务一部分的任务,在此状态下进行目标组注册。当任务处于“ACTIVATING(激活中)”状态时,Amazon ECS 会等待目标组注册或服务发现资源上的相应操作完成。

**问:**为什么使用服务发现的任务卡滞在“ACTIVATING(激活中)”状态?

AWS CloudTrail 事件历史记录中查找相应的服务发现服务相关的 API 调用,例如以下调用:

  • CreatePrivateDnsNamespace
  • CreateService
  • RegisterInstance
  • UpdateInstanceCustomHealthStatus

前面的 API 操作在 AmazonECSServiceRolePolicy AWS 托管式策略中定义。如果 API 调用失败并显示错误代码(例如 SeviceNotFoundInternalFailure),请确保遵循服务发现注意事项

**问:**为什么使用弹性负载均衡目标组的任务卡滞在“ACTIVATING(激活中)”状态?

当 Amazon ECS 需要很长时间才能确定容器的运行状况时,任务可能会卡滞在“ACTIVATING(激活中)”状态。要计算所需的总时间,请将参数 HealthCheckIntervalSecondsHealthyThresholdCount 相乘。要加快运行状况检查流程,请减少检查次数和两次检查之间的间隔。检查 CloudTrail 事件以确定是否报告了任何弹性负载均衡 RegisterTargets 相应的 API 调用错误或故障。

**问:**为什么我的 Amazon ECS 任务本应处于“STOPPED(已停止)”状态,却卡滞在“RUNNING(正在运行)”状态?

应用程序出现问题或任务配置错误可能会导致您的任务保持“RUNNING(正在运行)”状态。

要对这些问题故障排除,请执行以下操作:

  • 查看应用程序日志中是否存在任何错误或有关容器无法退出原因的信息。基本容器退出后,任务将过渡到“STOPPED(已停止)”状态。
  • 如果任务是 Amazon ECS 服务的一部分,请验证您的 DeploymentConfiguration 参数是否设置正确。
  • 如果任务是使用负载均衡器的 Amazon ECS 服务的一部分,请验证注销延迟参数是否设置正确。
  • 检查 ECS_CONTAINER_STOP_TIMEOUT 值是否设置正确。
  • 为您的任务启用 Amazon ECS exec。然后,使用 ECS exec 登录容器,以便对应用程序上的问题进行故障排除。

有关详细信息,请参阅容器实例设置为“DRAINING(正在耗尽)”时,需要很长时间才能停止一些 Amazon ECS 任务,如何故障排除此问题?

**问:**为什么我的 Amazon ECS 任务卡滞在“DEACTIVATING(停用中)”状态?

在“DEACTIVATING(停用中)”状态下,Amazon ECS 会在任务停止之前执行其他步骤。例如,对于属于使用多个弹性负载均衡目标组的服务一部分的任务,会在此状态下注销目标组。

以下原因可能会导致您的任务保持“DEACTIVATING(停用中)”状态:

  • 在任务可以从目标组注销之前,删除与弹性负载均衡目标组相关的资源。
  • 创建 Amazon ECS 服务时作为参数指定的自定义角色没有所需的弹性负载均衡权限。
  • 当任务处于活动状态时,您删除了自定义角色。

验证您在服务定义中指定的目标组和 AWS Identity and Access Management (IAM) 角色是否存在。此外,请确保服务定义包含所需的信任策略和弹性负载均衡权限。

要优化任务从“DEACTIVATING(停用中)”状态过渡所需的时间,请调整 deregistration_delay.timeout_secondsderegistration_delay.timeout_seconds 参数。有关详细信息,请参阅负载均衡器连接耗尽

**问:**为什么我的 Amazon ECS 任务卡滞在“DEPROVISIONING(取消预置中)”状态?

Amazon ECS 在任务停止之后但任务转换为“STOPPED(已停止)”状态之前执行其他步骤。例如,对于使用 awsvpc 网络模式的任务,Amazon ECS 会分离并删除弹性网络接口。

以下原因可能会导致您的任务保持“DEPROVISIONING(取消预置中)”状态:

  • 在任务终止之前,您删除了与服务关联的服务相关角色。该服务预定义了服务相关角色,并包含该服务代表您调用其他 AWS 服务所需的所有权限。运行以下命令以检查服务相关角色是否与您的服务相关联:

    $aws ecs describe-services --cluster CLUSTER-NAME --services SERVICE-NAME
  • 在任务从目标组注销之前,您删除了目标组。

AWS 官方已更新 2 年前