将容量提供程序与 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)并且不介意等待实例横向扩展,它还允许扩展到零。
- 确保容量提供程序及其支持的 Auto Scaling 都标记为受保护的缩减,并且所有 运行 个实例都被标记为这种方式,如果它们是在 Auto Scaling 参数更改之前创建的
- 减小自动缩放组的大小。这本身不会引起任何变化。但是,如果任何实例不受 Scale In 保护,它们将立即被丢弃,并且它们上的任务 运行 被终止
- 在“集群实例”选项卡中,标记负载最低的实例并将其设置为耗尽。这将开始逐步将任务移出该实例,并最终在它没有 运行 任务
时终止
注意:如果您的集群是通过模板创建的并分配了一些容量,您可能需要在耗尽的实例“重新出现”时跟踪保留该容量的警报,并将所有内容调整为您真正需要的数量
我已为 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)并且不介意等待实例横向扩展,它还允许扩展到零。
- 确保容量提供程序及其支持的 Auto Scaling 都标记为受保护的缩减,并且所有 运行 个实例都被标记为这种方式,如果它们是在 Auto Scaling 参数更改之前创建的
- 减小自动缩放组的大小。这本身不会引起任何变化。但是,如果任何实例不受 Scale In 保护,它们将立即被丢弃,并且它们上的任务 运行 被终止
- 在“集群实例”选项卡中,标记负载最低的实例并将其设置为耗尽。这将开始逐步将任务移出该实例,并最终在它没有 运行 任务 时终止
注意:如果您的集群是通过模板创建的并分配了一些容量,您可能需要在耗尽的实例“重新出现”时跟踪保留该容量的警报,并将所有内容调整为您真正需要的数量