Amazon web services ECS通过容量提供程序扩展到ASG的最小容量
我在ECS集群上配置了服务和容量提供商的目标跟踪策略,用于管理ASG自动缩放 在我的集群中,服务中的最小和最大任务数以及ASG中的最小和最大容量相同 当在行动中执行缩放时,任务减少到最小计数。但ASG仍有1个或多个未使用的(任务未放置在此EC2实例上)EC2实例 如何使用容量提供程序配置集群,以执行按最小计数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
# 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文档的这一部分