gpt4 book ai didi

amazon-web-services - 亚马逊云服务器 : Auto-Scaling an EC2 Auto-Scaling Group with Single-Container Hosts

转载 作者:行者123 更新时间:2023-12-02 18:08:36 25 4
gpt4 key购买 nike

我有一个相当有趣的情况,我正在尝试弄清楚如何在 AWS ECS/EC2 上进行配置。

我有一个具有以下要求的 Dockerized 应用程序:

  • 非常低的 CPU 使用率(~256 个 CPU)
  • 适度的内存使用(~256 MB)
  • 每个容器都需要一个仅分配给该容器的公共(public) IP 地址(不与任何其他容器共享)。

由于成本原因,Fargate 不是一个选择,因此我们正在寻找基于 EC2 的解决方案。

由于 CPU 和内存使用率较低,并且我需要为每个容器提供唯一的公共(public) IP 地址,ECS 容量提供者的最佳选择似乎是使用最小实例的 EC2 自动扩展组 (t4g .nanot3a.nano 等),以及hostbridge 网络模式(任何一种模式都将限制为如果我明确指定静态主机/容器端口映射,则每个主机一个容器)。这为我提供了主机到容器的一对一映射,这正是我所需要的。

问题是,如何为此设置 ECS 集群管理的自动缩放?

我已经配置了一个 EC2 自动缩放组 (Terraform):

resource "aws_autoscaling_group" "ecs" {
name = "ecs"
vpc_zone_identifier = var.subnet_ids
min_size = 1
max_size = 20
capacity_rebalance = true
default_cooldown = 0
health_check_type = "EC2"
mixed_instances_policy {
...
}
instance_refresh {
strategy = "Rolling"
}
}

我已将自动扩展组配置为具有托管扩展的 ECS 容量提供程序:

resource "aws_ecs_capacity_provider" "ec2" {
name = "ec2"
auto_scaling_group_provider {
auto_scaling_group_arn = aws_autoscaling_group.ecs.arn
managed_scaling {
target_capacity = 100
instance_warmup_period = 30
minimum_scaling_step_size = 1
maximum_scaling_step_size = aws_autoscaling_group.ecs.max_size
status = "ENABLED"
}
managed_termination_protection = "DISABLED"
}
}

我已将此容量提供程序配置为 ECS 集群的唯一提供程序:

resource "aws_ecs_cluster_capacity_providers" "this" {
cluster_name = aws_ecs_cluster.this.name
capacity_providers = [
aws_ecs_capacity_provider.ec2.name
]
default_capacity_provider_strategy {
capacity_provider = aws_ecs_capacity_provider.ec2.name
weight = 100
base = 0
}
}

我已经设置了 ECS 服务:

resource "aws_ecs_service" "this" {
name = local.task_family
cluster = aws_ecs_cluster.this.id
task_definition = aws_ecs_task_definition.this.arn
desired_count = 1
launch_type = "EC2"
lifecycle {
ignore_changes = [desired_count]
}
}

我已经为 ECS 服务设置了一个 App Autoscaling Target:

resource "aws_appautoscaling_target" "ecs" {
min_capacity = 5
max_capacity = 20
resource_id = "service/${aws_ecs_cluster.this.name}/${aws_ecs_service.this.name}"
scalable_dimension = "ecs:service:DesiredCount"
service_namespace = "ecs"
}

我已经为该目标设置了应用程序自动缩放策略:

resource "aws_appautoscaling_policy" "ecs_policy" {
name = "ecs-scaling"
policy_type = "TargetTrackingScaling"
resource_id = aws_appautoscaling_target.ecs.resource_id
scalable_dimension = aws_appautoscaling_target.ecs.scalable_dimension
service_namespace = aws_appautoscaling_target.ecs.service_namespace

target_tracking_scaling_policy_configuration {
target_value = 70
scale_in_cooldown = 0
scale_out_cooldown = 0
predefined_metric_specification {
predefined_metric_type = "ECSServiceAverageCPUUtilization"
}
}
}

从部署、服务运行和我的应用程序正常运行的意义上说,它“有效”。但是,缩放不起作用。正如您在 aws_autoscaling_group 中看到的那样,我已将最小实例设置为 1 个实例,将最大实例设置为 20 个实例。在 aws_appautoscaling_target 中,我有最少 5 个(在生产中为 1 个,但在测试中为 5 个)和最多 20 个(最大值与最大实例数匹配,因为它是一对一的) .

当我部署它时,AWS 控制台中的 ECS 服务显示:

  • 所需数量:5
  • 待定计数:0
  • 运行次数:1

在事件日志中,它说:

service my-service was unable to place a task because no container instance met all of its requirements. The closest matching container-instance xyzabc1234 has insufficient memory available.

所以它试图达到所需的最小容器数量 (5),并且它认识到没有足够的 EC2 实例,但出于某种原因(这是我无法弄清楚的原因)它没有扩展数量EC2 实例的数量以满足所需的容器数量。

来自 AWS's documentation ,它说:

When launched tasks cannot be placed on available instances, the Auto Scaling group scales-out by launching new instances. When there are running instances with no tasks, the Auto Scaling group scales-in by terminating an instance with no running tasks.

由于无法将启动的任务放置在任何可用实例上,因此它应该自动扩展 Auto Scaling 组。

关于为什么它没有这样做有什么想法吗?

最佳答案

我发现了问题:

resource "aws_ecs_service" "this" {
...
launch_type = "EC2"
...
}

如果您指定启动类型,它将覆盖集群的默认容量提供程序策略,并且不会使用托管 EC2 自动缩放。正确的做法是:

resource "aws_ecs_service" "this" {
name = local.task_family
cluster = aws_ecs_cluster.this.id
task_definition = aws_ecs_task_definition.this.arn
desired_count = 1

capacity_provider_strategy {
capacity_provider = aws_ecs_capacity_provider.ec2.name
weight = 100
base = 0
}

lifecycle {
ignore_changes = [desired_count]
}
}

如果您不提供 launch_typecapacity_provider_strategy ,它应该使用集群的默认策略(确实如此),但 Terraform 显示出永久差异。

此更改后,一切都开始正常缩放!

关于amazon-web-services - 亚马逊云服务器 : Auto-Scaling an EC2 Auto-Scaling Group with Single-Container Hosts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72839842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com