
Из того, что я прочиталздесьПоставщики ресурсов ECS должны (как правило) предотвращать немедленный сбой задач из-за ограничений ресурсов, переводя их в состояние «Выделение ресурсов» и запуская новый экземпляр EC2.
Это означает, например, что если вы вызываете API RunTask, а задачи не размещаются на экземпляре из-за нехватки ресурсов (то есть ни у одного активного экземпляра нет достаточного объема памяти, виртуальных ЦП, портов, ENI и/или графических процессоров для запуска задач),вместо немедленного сбоя задача перейдет в состояние подготовки(Однако следует отметить, что переход к выделению ресурсов происходит только в том случае, если вы включили управляемое масштабирование для поставщика емкости; в противном случае задачи, которые не могут найти емкость, будут немедленно завершаться ошибкой, как это было ранее).
Я настроил кластер ECS с группой автомасштабирования и поставщиком емкости ECS в terraform. Группа автомасштабирования настроена, min_size = 1
и она немедленно запускает один экземпляр... поэтому я уверен, что моя конфигурация запуска в порядке.
Однако, когда я многократно вызываю "RunTask" через API (задачи с memory=128
), я получаю задачи, которые не запускаются немедленно по причине RESOURCE:MEMORY
. Также не запускаются новые экземпляры.
Я не могу понять, что я неправильно настроил.
Все это было настроено в terraform:
resource "aws_ecs_cluster" "ecs_cluster" {
name = local.cluster_name
setting {
name = "containerInsights"
value = "enabled"
}
tags = var.tags
capacity_providers = [aws_ecs_capacity_provider.capacity_provider.name]
# I added this in an attempt to make it spin up new instance
default_capacity_provider_strategy {
capacity_provider = aws_ecs_capacity_provider.capacity_provider.name
}
}
resource "aws_ecs_capacity_provider" "capacity_provider" {
name = "${var.tags.PlatformName}-stack-${var.tags.Environment}"
auto_scaling_group_provider {
auto_scaling_group_arn = aws_autoscaling_group.autoscaling_group.arn
managed_termination_protection = "DISABLED"
managed_scaling {
maximum_scaling_step_size = 4
minimum_scaling_step_size = 1
status = "ENABLED"
target_capacity = 100
}
}
tags = var.tags
}
#Compute
resource "aws_autoscaling_group" "autoscaling_group" {
name = "${var.tags.PlatformName}-${var.tags.Environment}"
# If we're not using it, lets not pay for it
min_size = "1"
max_size = var.ecs_max_size
launch_configuration = aws_launch_configuration.launch_config.name
health_check_grace_period = 60
default_cooldown = 30
termination_policies = ["OldestInstance"]
vpc_zone_identifier = local.subnets
protect_from_scale_in = false
tag {
key = "Name"
value = "${var.tags.PlatformName}-${var.tags.Environment}"
propagate_at_launch = true
}
tag {
key = "AmazonECSManaged"
value = ""
propagate_at_launch = true
}
dynamic "tag" {
for_each = var.tags
content {
key = tag.key
propagate_at_launch = true
value = tag.value
}
}
enabled_metrics = [
"GroupDesiredCapacity",
"GroupInServiceInstances",
"GroupMaxSize",
"GroupMinSize",
"GroupPendingInstances",
"GroupStandbyInstances",
"GroupTerminatingInstances",
"GroupTotalInstances",
]
}
решение1
Похоже, это произошло из-за ошибки, которую я допустил при выполнении «RunTask» в API (задокументировано здесь). Я указал launchType
и не capacityProviderStrategy
.
Из документации RunTask:
При использовании автоматического масштабирования кластера необходимо указать
capacityProviderStrategy
, а неlaunchType
.
Похоже, в результате этого задачи запускаются при наличии ресурсов, но немедленно завершаются сбоем при их недостатке, не давая возможности автоматическому масштабированию отреагировать.
Мне удалось заставить его работать, просто удалив, launchType
потому что default_capacity_provider_strategy
он был установлен на кластере.