Amazon web services ECS通过容量提供程序扩展到ASG的最小容量

Amazon web services ECS通过容量提供程序扩展到ASG的最小容量,amazon-web-services,terraform,amazon-ecs,Amazon Web Services,Terraform,Amazon Ecs,我在ECS集群上配置了服务和容量提供商的目标跟踪策略,用于管理ASG自动缩放 在我的集群中,服务中的最小和最大任务数以及ASG中的最小和最大容量相同 当在行动中执行缩放时,任务减少到最小计数。但ASG仍有1个或多个未使用的(任务未放置在此EC2实例上)EC2实例 如何使用容量提供程序配置集群,以执行按最小计数ASG容量的扩展 # CLUSTER resource "aws_ecs_cluster" "default" { name

我在ECS集群上配置了服务和容量提供商的目标跟踪策略,用于管理ASG自动缩放

在我的集群中,服务中的最小和最大任务数以及ASG中的最小和最大容量相同

当在行动中执行缩放时,任务减少到最小计数。但ASG仍有1个或多个未使用的(任务未放置在此EC2实例上)EC2实例

如何使用容量提供程序配置集群,以执行按最小计数ASG容量的扩展


# CLUSTER
resource "aws_ecs_cluster" "default" {
  name               = local.name
  capacity_providers = [aws_ecs_capacity_provider.asg.name]
  tags               = local.tags

  default_capacity_provider_strategy {
    base = 0
    capacity_provider = aws_ecs_capacity_provider.asg.name
    weight = 1
  }
}

# SERVICE
resource "aws_ecs_service" "ecs_service" {
  name            = "${local.name}-service"
  cluster         = aws_ecs_cluster.default.id
  task_definition = aws_ecs_task_definition.ecs_task.arn
  health_check_grace_period_seconds = 60

  deployment_maximum_percent         = 50
  deployment_minimum_healthy_percent = 100


  load_balancer {
    target_group_arn = element(module.aws-alb-common-module.target_group_arns, 1)
    container_name   = local.name
    container_port   = 8080
  }

  lifecycle {
    ignore_changes = [desired_count, task_definition]
  }


}

# CAPACITY PROVIDER
resource "aws_ecs_capacity_provider" "asg" {
  name = aws_autoscaling_group.ecs_nodes.name

  auto_scaling_group_provider {
    auto_scaling_group_arn         = aws_autoscaling_group.ecs_nodes.arn
    managed_termination_protection = "DISABLED"

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

# SERVICE AUTOSCALING POLICY

resource "aws_appautoscaling_target" "ecs_target" {
  max_capacity       = 20
  min_capacity       = 2
  resource_id        = "service/${local.name}/${aws_ecs_service.ecs_service.name}"
  scalable_dimension = "ecs:service:DesiredCount"
  service_namespace  = "ecs"
}

resource "aws_appautoscaling_policy" "ecs_policy" {
  name = "${local.name}-scale-policy"
  policy_type = "TargetTrackingScaling"
  resource_id = aws_appautoscaling_target.ecs_target.resource_id
  scalable_dimension = aws_appautoscaling_target.ecs_target.scalable_dimension
  service_namespace = aws_appautoscaling_target.ecs_target.service_namespace

  target_tracking_scaling_policy_configuration {
    predefined_metric_specification {
      predefined_metric_type = "ECSServiceAverageCPUUtilization"
    }

    target_value = 2

  }


# ASG
resource "aws_autoscaling_group" "ecs_nodes" {
  name_prefix           = "${local.name}-node"
  max_size              = 20
  min_size              = 2
  vpc_zone_identifier   = local.subnets_ids
  protect_from_scale_in = false

  mixed_instances_policy {
    instances_distribution {
      on_demand_percentage_above_base_capacity = local.spot
    }
    launch_template {
      launch_template_specification {
        launch_template_id = aws_launch_template.node.id
        version            = "$Latest"
      }

      dynamic "override" {
        for_each = local.instance_types
        content {
          instance_type     = override.key
          weighted_capacity = override.value
        }
      }
    }
  }

  lifecycle {
    create_before_destroy = true
  }

  tag {
    key                 = "AmazonECSManaged"
    propagate_at_launch = true
    value               = ""
  }
}








原因可能是
预定义的度量规格
目标值=2
是cpu使用触发级别(百分比),而不是最小容量。该实例可能是由使用少量CPU的后台进程保持活动状态的

顺便说一句,托管\u终止\u保护设置可能值得重新启用

对2009年25月25日评论的回应更新:

好的,我在这里完全可能是错的(特别是因为我自己还没有使用这个功能),如果是这样,我很高兴从中学习

但我是这样阅读与您的配置相关的文档的:关键短语是目标容量值用作Amazon ECS托管目标跟踪缩放策略中使用的CloudWatch指标的目标值。您选择的cloudwatch指标是ECSServiceAverageCPUUutilization,这将在中讨论。因此,您配置的目标=2意味着平均CPU利用率为2%

我承认我错误地认为CPU指标是EC2实例级别的平均值。但在这两种情况下,将触发器值设置为2%CPU可能会在不需要时导致/保持缩放


也有可能你已经找到了对你所看到的行为的简单解释,也就是说,但是这种行为在任何时候都不能得到保证。然而,我怀疑这一说法更适用于目标100%的极端例子,在这个例子中,人们可以预期会看到异常,就像在类似的极端2%时可以预期的那样。

这可能与base=1设置有关吗?我尝试设置base=1或base=2,但有4个或3个实例,而不是1。。或者asg的最小容量(2)啊,我误解了最初的问题,但您对asg最小容量为2的澄清使问题更清楚。托管\u终止\u保护可能会导致终止实例的延迟,即使实例上没有正在运行的任务。您是否已将配置保留足够长的时间,以确保其行为不符合设计要求?有关示例,请参阅的“扩展”部分。我在asg中禁用了终止保护并禁用了受保护实例的扩展。ASG向外扩展到10,但仅向内扩展到6不是最小值(2),而是任务向最小值扩展(2)您能否将当前版本的代码,以及aws_autoscaling_group.ASG的代码和变量定义(包括目标跟踪扩展策略和保护配置中的ASG实例扩展)附加到帖子中?此外,是否涉及任何ELB?您是否检查过保护设置中的实例级扩展?也许我误解了什么,但如果我删除预定义的度量规范,当我的alb上有大量请求时,集群将如何扩展?我使用预定义的_metric\u type=“ECSServiceAverageCPUUtilization”作为操作扩展的度量。您不需要删除该设置,只需将
target\u value=
值增加到您想要的平均CPU利用率级别,作为触发器--75。例如,我以前曾尝试将target\u value=7,但这对我没有帮助:((和任务)(由该目标_值触发)始终缩放到最小值(2)…问题仅限于我仍然拥有的空ec2实例(未缩放到2)对于目标容量%,如果启用了托管扩展,请指定一个介于1和100之间的整数。目标容量值用作Amazon ECS托管目标跟踪扩展策略中使用的CloudWatch度量的目标值。此目标容量值以最大努力为基础进行匹配。例如,值100将导致Amazon自动缩放组中的EC2实例被完全利用,并且任何未运行任何任务的实例都将被缩放,但这一行为并非始终得到保证。AWS文档的这一部分