跳至内容

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

3 分钟阅读
0

我的 Amazon Elastic Container Service (Amazon ECS) 任务卡滞在 PENDING(待处理)状态。

简短描述

以下情况会导致 Amazon ECS 任务卡滞在 PENDING(待处理)状态:

  • Docker 进程守护程序无响应。
  • 集群中存在资源限制。
  • Docker 映像很大。
  • Amazon ECS 容器代理在任务启动过程中断开了与 Amazon ECS 服务的连接。
  • Amazon ECS 容器代理需要很长时间才能停止现有任务。
  • 您未正确配置您的 Amazon Virtual Private Cloud (Amazon VPC) 路由。
  • 必要容器依赖于未处于 HEALTHY(运行状况良好)状态的非必要容器。
  • 您与 Amazon ECS 任务关联的 AWS Identity and Access Management (IAM) 角色缺失或不正确。
  • 您选择的 Windows 版本存在图像兼容性问题。

解决方法

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

Docker 进程守护程序无响应或集群中存在资源限制

在任务定义中,检查任务请求的内存或 CPU 是否超过了实例所能支持的容量。根据您的需求调整容器实例资源。

对于 CPU 问题,请完成以下步骤:

  1. 使用 Amazon CloudWatch 指标来检查您的容器实例是否已超过最大 CPU 配额。
  2. 根据需要增加容器实例的大小

对于内存问题,请完成以下步骤:

  1. 运行 free 命令,查看系统有多少可用内存。
  2. 根据需要增加容器实例的大小

对于 I/O 问题,请完成以下步骤:

  1. 运行 iotop 命令。
  2. 确定每项服务中每秒进行读写操作的次数 (IOPS) 最多的任务。
  3. 使用任务放置约束和策略将这些任务分发到不同的容器实例。
    -或-
    使用 CloudWatch 为 Amazon Elastic Block Store (Amazon EBS) 突增余额指标创建警报。然后,使用 AWS Lambda 函数或您自己的自定义逻辑均衡任务。

Docker 映像很大

映像越大,下载时间越长,任务处于 PENDING(待处理)状态的时间也会增加。

要加快过渡时间,请调整 ECS_IMAGE_PULL_BEHAVIOR 参数以使用映像缓存。例如,在 /etc/ecs/ecs.config 中将 ECS_IMAGE_PULL_BEHAVIOR 参数设置为 prefer-cached。如果您使用 prefer-cached,则当没有缓存映像时,Amazon ECS 会远程提取映像。否则,Amazon ECS 将使用实例上的缓存映像。

Amazon ECS 容器代理在启动过程中断开了与 Amazon ECS 服务的连接

要验证 Amazon ECS 容器代理的状态和连接,请根据您的 Amazon Linux 版本在容器实例上运行以下命令。

Amazon Linux 1:

sudo status ecs
sudo docker ps -f name=ecs-agent

Amazon Linux 2:

sudo systemctl status ecs
sudo docker ps -f name=ecs-agent

如果输出中的状态为 inactive(非活动),则代理已断开连接。要解决此问题,请运行以下命令来重启容器代理。

Amazon Linux 1:

sudo stop ecs
sudo start ecs

Amazon Linux 2:

sudo systemctl stop ecs
sudo systemctl start ecs

您收到的输出类似于以下消息:

ecs start/running, process abcd

要确定代理连接,请在相关时间范围内查看以下日志,查找错误警告代理过渡状态等关键词:

  • 查看 Amazon ECS 容器代理日志 /var/log/ecs/ecs-agent.log.yyyy-mm-dd-hh
  • 查看 Amazon ECS 初始化日志 /var/log/ecs/ecs-init.log
  • 查看 Docker 日志 /var/log/docker

使用日志中的信息来确定连接问题的根本原因。

**注意:**还可以使用 Amazon ECS 日志收集器收集 Amazon ECS 的常规操作系统 (OS) 日志、Docker 日志和容器代理日志。

要提取容器实例中的本地实时任务状态,请运行以下命令来查看容器实例中正在运行的任务的元数据:

curl http://localhost:51678/v1/metadata

您收到的输出结果类似于以下示例:

{  "Cluster": "CLUSTER_ID",
  "ContainerInstanceArn": "arn:aws:ecs:REGION:ACCOUNT_ID:container-instance/TASK_ID",
  "Version": "Amazon ECS Agent - AGENT "
}

在输出中,确保任务环境变量、CPU、内存和 IAM 角色配置正确。此外,请确保任务具有所需的密钥。

要查看有关服务中运行的所有任务的详细信息,请运行以下命令:

curl http://localhost:51678/v1/tasks

您收到的输出结果类似于以下示例:

{  "Tasks": [
    {
      "Arn": "arn:aws:ecs:REGION:ACCOUNT_ID:task/TASK_ID",
      "DesiredStatus": "RUNNING",
      "KnownStatus": "RUNNING",
      ... ...
    }
  ]
}

在前面的命令输出中,检查本地代理和 Amazon ECS 服务之间是否存在差异。使用此信息来确定任务停滞的位置和原因。

Amazon ECS 容器代理需要很长时间才能停止现有任务

当 Amazon ECS 发送从 PENDING(待处理)状态启动到 RUNNING(正在运行)状态的新任务时,容器代理可能有现有任务要停止。在这种情况下,代理在先停止现有任务之前不会启动新任务。

要在容器实例级别控制容器的停止和启动超时,请在 /etc/ecs/ecs.config调整 ECS_CONTAINER_STOP_TIMEOUTECS_CONTAINER_START_TIMEOUT 变量的环境变量ECS_CONTAINER_STOP_TIMEOUT 设置了一个时间长度,当您的容器不自行退出时,经过这段时间后,Amazon ECS 会强制终止这些容器。Linux 和 Windows 的默认停止超时值为 30 秒。ECS_CONTAINER_START_TIMEOUT 设置了一个时间长度,在经过这段时间后,Amazon ECS 容器代理将不再尝试启动该容器。Linux 的默认启动超时值为 3 分钟,Windows 的默认启动超时值为 8 分钟。

如果代理版本为 1.26.0 或更高版本,则可以在每个任务中定义停止和启动超时参数。请注意,当您更改参数时,任务可能会更改为 STOPPED(已停止)状态。例如,容器实例 A 依赖容器实例 B 达到 COMPLETE(完成)、SUCCESS(成功)或 HEALTHY(运行状况良好)状态。您没有为容器实例 B 指定 startTimeout 值。如果容器实例 B 在超时时间内未达到所需状态,则容器实例 A 无法启动。

有关容器依赖项的示例,请参阅 GitHub 网站上的示例: 容器依赖项

您未正确配置您的 Amazon VPC 路由

检查运行 Amazon ECS 或 AWS Fargate 任务的 VPC 子网的配置。您的子网必须有权访问 Amazon ECS 或 Amazon Elastic Container Registry (Amazon ECR)。要解决配置问题,请确保子网的路由表具有互联网网关或 NAT 网关。如果在没有通往互联网的出口路由的子网中启动任务,请使用 AWS PrivateLink。此配置允许您使用私有 IP 地址访问 Amazon ECS API。

此外,请确保您的安全组规则允许通过配置的所需端口进行入站和出站通信。

必要容器实例依赖于未处于 HEALTHY(运行状况良好)状态的非必要容器实例

如果必要容器实例所依赖的非必要容器实例无法处于 HEALTHY(运行状况良好)状态,则您的任务将卡滞在 PENDING(待处理)状态。您会收到消息“stoppedReason":"Service ABCXYZ: task last status remained in PENDING too long”(stoppedReason:服务 ABCXYZ:任务上次状态停留在 PENDING (待处理) 过久)

要解决此问题,请确保非必要容器实例按预期运行。如果您无法解决潜在问题,请更新容器实例的任务定义,并将必要参数设置为 true。如果任务仍处于停止状态,请检查停止原因。有关更多故障排除步骤,请参阅为什么我的 Amazon ECS 任务停止了?

IAM 角色缺失或配置错误

如果任务位于没有所需权限的容器实例中,则您会收到与以下示例类似的错误:

“(服务测试) 无法启动任务,错误是 ECS 无法代入为该任务提供的角色‘arn:aws:iam::111111111111:role/test-fTa-T3J4hVnyL53E’。请验证传递的角色是否具有正确的信任关系和权限,以及您的 IAM 用户是否有权传递此角色。)”

要解决此问题,请确保容器实例具有所需的权限

此外,如果您没有为容器实例使用经过 Amazon ECS 优化的亚马逊机器映像 (AMI),请检查您的 Amazon ECS 代理配置

您选择的 Windows 版本存在映像兼容性问题

当您在 Windows Fargate 任务中使用的映像与您的平台不兼容时,任务会失败。要检查您的映像是否与 Windows 服务器主机兼容,请参阅 Microsoft 网站上的 Windows 容器版本兼容性。然后,检查运行 Windows 任务的先决条件

此外,请确保您定义的映像 URL 准确无误。

相关信息

容器依赖项

GitHub 网站上的 amazon-ecs-agent

AWS 官方已更新 1 年前