将容量提供程序与 ECS 一起使用时,需要多长时间才能删除实例?

How long will it take for an instance to be removed when using capacity provider with ECS?

我已为 ECS 集群启用容量提供程序,并将 EC2 自动缩放组的最小、最大和所需计数分别设置为 1,3 和 2。此外,我还为 ECS 任务启用了自动缩放,最小值、最大值和所需计数分别为 2,6 和 2。

当我使用 Terraform 部署整个设置时,这两个任务中的每一个都在两个单独的实例上启动,当负载测试为 运行 时,ECS 任务和 EC2 实例成功扩展到 6 和 3 . 但是在负载测试完成后,ECS 任务被缩减,但 EC2 实例仍然没有被删除。

managed_scaling中的target_capacity是否表示用于为EC2集群创建自动缩放策略的阈值?

 resource "aws_autoscaling_group" "asg" {
  ...
  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.asg.arn
      managed_termination_protection = "ENABLED"

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

  
   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" "cluster" {
  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
  )
}

您已将容量提供程序的目标容量设置为 70,因此容量提供程序不想超过该利用率。

当您在 2 个不同的实例上有 2 个任务 运行 时,您将拥有 100% 的利用率,因为容量是根据 运行 非 daemonset 任务的实例数量来计算的。因此,如果您的目标容量小于 100,它就不会想要扩展以仅留下非空实例可用。

如果您的目标容量为 60,并且您的 ASG 被允许扩展到最多 4 个实例,它仍会尝试扩展到该数量并留下 2 个空实例,因为只有 1 个可用实例会留下容量66.6,高于较低的目标容量。

如果您刚开始使用容量提供程序,

This AWS deep dive blog post on ECS capacity providers 是一本好书。我想当我开始使用它们时我一定已经读了十几遍了,但我仍然觉得缩放机制有点不寻常。不过,它确实为我们解决了基于 ECS memory/CPU 预留的简单 ASG 扩展的一些关键问题。如果您不想要任何备用容量(例如,将目标容量设置为 100)并且不介意等待实例横向扩展,它还允许扩展到零。

  1. 确保容量提供程序及其支持的 Auto Scaling 都标记为受保护的缩减,并且所有 运行 个实例都被标记为这种方式,如果它们是在 Auto Scaling 参数更改之前创建的
  2. 减小自动缩放组的大小。这本身不会引起任何变化。但是,如果任何实例不受 Scale In 保护,它们将立即被丢弃,并且它们上的任务 运行 被终止
  3. 在“集群实例”选项卡中,标记负载最低的实例并将其设置为耗尽。这将开始逐步将任务移出该实例,并最终在它没有 运行 任务
  4. 时终止

注意:如果您的集群是通过模板创建的并分配了一些容量,您可能需要在耗尽的实例“重新出现”时跟踪保留该容量的警报,并将所有内容调整为您真正需要的数量