Amazon ECS 容量提供商未在 target_capacity=100 时横向扩展实例

Ash*_*des 5 amazon-web-services amazon-ecs terraform terraform-provider-aws

我已启用 ECS 使用容量提供程序,这是我的配置详细信息

  • ECS 任务的自动缩放 min=2、desired=2、max=8 以及此任务的自动缩放策略跟踪 10% 的 CPU 利用率(用于验证任务是否横向扩展和收缩)
  • 容量提供者的自动缩放组,最小值 = 1,所需 = 2,最大值 = 4

最初部署后,2 个 ECS 任务在 2 个不同的 EC2 实例上运行,然后我运行负载测试来验证集群和 ECS 任务是否按预期扩展,但 ECS 任务所需计数更改为 8,并且只有 4 个 ECS 任务正在运行(预期为有 2 个 EC2 实例,我使用 t3.medium(3 ENI) 实例和 AWSVPC 进行部署)。

为什么集群没有扩展,因为已经有 4 个任务处于配置状态,容量提供者阈值为 100?

我正在使用 terraform 部署我的基础设施,容量提供商的详细信息如下,

resource "aws_autoscaling_group" "kong" {
  ...
  min_size             = var.asg_min_size
  max_size             = var.asg_max_size
  desired_capacity     = var.asg_desired_capacity
  protect_from_scale_in = true
  tags = [
    {
      "key"                 = "Name"
      "value"               = local.name
      "propagate_at_launch" = true
    },
    {
      "key"                 = "AmazonECSManaged"
      "value"               = ""
      "propagate_at_launch" = true 
    }
  ]
}

resource "aws_ecs_capacity_provider" "capacity_provider" {
   name = local.name

   auto_scaling_group_provider {
      auto_scaling_group_arn         = aws_autoscaling_group.kong.arn
      managed_termination_protection = "ENABLED"

      managed_scaling {
           maximum_scaling_step_size = 4
           minimum_scaling_step_size = 1
           status                    = "ENABLED"
           target_capacity           = 100
      }
   }

  
   provisioner "local-exec" {
      when = destroy

      command = "aws ecs put-cluster-capacity-providers --cluster ${self.name} --capacity-providers [] --default-capacity-provider-strategy []"
   }
}

resource "aws_ecs_cluster" "kong-reg-proxy" {
  name      = local.name
  capacity_providers = [
    aws_ecs_capacity_provider.capacity_provider.name,
  ]
  tags = merge(
    {
      "Name"        = local.name,
      "Environment" = var.environment,
      "Description" = var.description,
      "Service"     = var.service,
    },
    var.tags
  )
}
Run Code Online (Sandbox Code Playgroud)

mar*_*kin 0

将目标容量降低到 100% 以下是一种肮脏的伎俩。有了它,您就可以运行很少的备用 EC2 实例。也许这也是您想要的,但这样 ECS 就无法控制 EC2 自动缩放。您很可能已经为服务分配了 launch_type="EC2",就像这样

resource "aws_ecs_service" "foo" {
  ...
  launch_type = "EC2"
  ...
}
Run Code Online (Sandbox Code Playgroud)

您应该做的是使用容量提供程序策略分配服务,以便 ECS 可以管理处于 PROVISIONING 状态的任务并CapacityProviderReservation正确填充指标

resource "aws_ecs_service" "foo" {
  ...
  capacity_provider_strategy {
    capacity_provider = aws_ecs_capacity_provider.foo.name
    weight = 1
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅参考https://aws.amazon.com/en/blogs/containers/deep-dive-on-amazon-ecs-cluster-auto-scaling/