【问题标题】:why are my Fargate tasks stuck on pending?为什么我的 Fargate 任务卡在待处理状态?
【发布时间】:2020-09-09 23:52:01
【问题描述】:

我正在使用 Terraform 设置一个包含三个 apache 服务器任务的小型 Fargate 集群。任务挂起,然后集群停止它们并创建新的挂起任务,然后循环继续。

AWS docs 说这可能是因为:

  • Docker 守护进程无响应

文档说设置 CloudWatch 以查看 CPU 使用情况并在需要时增加容器大小。我已将 CPU/内存都提高到 1024/2048,但这并没有解决问题。

  • Docker 镜像很大

不太可能?图片不过是httpd:2.4

  • ECS 容器代理在任务启动过程中失去了与 Amazon ECS 服务的连接

文档提供了一些在容器实例中运行的命令。要做到这一点,看起来我必须要么set up AWS Systems Manager要么SSH in directly。如果我的 Terraform 配置没有任何问题,我会选择这条路线。

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

不太可能,因为我正在启动一个全新的 ECS 集群


以下是我的 Terraform 文件的 ECS 和 IAM 部分。为什么我的 Fargate 任务会卡在待处理状态?

#
# ECS
#
resource "aws_ecs_cluster" "main" {
  name = "main-ecs-cluster"
}

resource "aws_ecs_task_definition" "app" {
  family                   = "app"
  network_mode             = "awsvpc"
  requires_compatibilities = ["FARGATE"]
  cpu                      = 256
  memory                   = 512
  execution_role_arn       = aws_iam_role.task_execution.arn
  task_role_arn            = aws_iam_role.task_execution.arn
  container_definitions = <<DEFINITION
  [
    {
      "image": "httpd:2.4",
      "cpu": 256,
      "memory": 512,
      "name": "app",
      "networkMode": "awsvpc",
      "portMappings": [
        {
          "containerPort": 80,
          "hostPort": 80,
          "protocol": "tcp"
        }
      ]
    }
  ]
  DEFINITION
}

resource "aws_ecs_service" "main" {
  name            = "tf-ecs-service"
  cluster         = aws_ecs_cluster.main.id
  task_definition = aws_ecs_task_definition.app.arn
  desired_count   = 2
  launch_type     = "FARGATE"

  network_configuration {
    security_groups = [aws_security_group.main.id]
    subnets         = [
      aws_subnet.public1.id,
      aws_subnet.public2.id,
    ]
  }
}

#
# IAM
#
resource "aws_iam_role" "task_execution" {
  name               = "my-first-service-task-execution-role"
  assume_role_policy = data.aws_iam_policy_document.task_execution.json
}

data "aws_iam_policy_document" "task_execution" {
  statement {
    actions = ["sts:AssumeRole"]

    principals {
      type        = "Service"
      identifiers = ["ecs-tasks.amazonaws.com"]
    }
  }
}

resource "aws_iam_role_policy_attachment" "task_execution" {
  role       = aws_iam_role.task_execution.name
  policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"
}

【问题讨论】:

  • 可能有很多原因,错误的凭据,没有连接到容器注册表来提取图像(例如 ecr)。如果你去 ecs 控制台,去任务或服务应该有一些关于它为什么无法启动的消息或信息。你检查过 ecs concole 和 tasks 是否有任何消息?
  • 在 ECS 控制台我看到Stopped reason: Task failed to start
  • 但是如果你去详细了解,比如screenshot,通常那里有更多信息。你的情况没有别的了?
  • 由于您使用awsvpc,请检查您是否为它们启用了公共 IP(假设您在公共子网中运行您的 ecs 服务)。您还指的是哪些容器实例? fargate 没有它们供您登录或在它们上执行任何命令。
  • 没有任务在私有子网中。看起来我的选项是公共子网、NAT 网关或从 ECR 实例中存在的图像中提取。 source

标签: amazon-web-services terraform aws-fargate


【解决方案1】:

根据 cmets 中的讨论,确定问题是由 Fargate 任务的缺乏互联网访问权限引起的。

这是因为任务在私有子网中运行,而任务使用来自 docker hub 的 httpd 映像。从中心拉取图像需要互联网访问。

可能的解决方案是使用 NAT 网关/实例、使用公共子网中的任务或在 ECR 中使用自定义映像。

【讨论】:

【解决方案2】:

由于许多安全原因,公共子网/公共 IP 可能不是正确的解决方案。

考虑将您的任务放在私有子网中。

  1. 如果您配置通过 NAT 连接到互联网,您将能够拉取图像 pulling image from ECR using routing through NAT gateway

或者你可以使用更好的解决方案:

  1. 您的 ECS FARGATE 可以从 ECR 中提取图像,即使您将其放置在 PRIVATE 子网而未连接到互联网。 请查看AWS PrivateLink for ECR 图:pulling image from ECS using PrivateLink - VPC endpoints

【讨论】:

    猜你喜欢
    • 2018-09-18
    • 2018-04-08
    • 1970-01-01
    • 2019-04-28
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    相关资源
    最近更新 更多