使用AWS ECS Fargate进行水平和垂直自动缩放

问题描述 投票:0回答:1

我在这里有一个特定的用例。我需要自动缩放在ECS Fargate上运行的分布式Web应用程序。问题在于,所有节点都需要在内存中保留相同的数据(因此,增加节点数无助于内存压力)。因此,只有在水平(添加节点)和垂直(增加节点内存)的情况下进行扩展,才可以正确处理增加的负载。

水平自动缩放很简单。 AWS CDK为负载均衡的Fargate任务提供了很好的高级构造,并使其非常容易添加更多任务来处理CPU负载:

service = aws_ecs_patterns.ApplicationLoadBalancedFargateService(
    self,
    'FargateService',
    cpu=256,
    memory_limit_mib=512,
    ...
)

scalable_target = service.service.auto_scale_task_count(max_capacity=5)
scalable_target.scale_on_cpu_utilization('CpuScaling', target_utilization_percent=60)

我正在寻找的是垂直缩放部分。到目前为止,我最好的主意如下:

  1. [针对集群的内存使用情况创建CloudWatch警报。触发超过60%。
  2. 警报将消息发送到SNS主题,这将触发lambda函数。
  3. lambda描述当前任务定义并解析出CPU和内存参数。然后,它使用增加的内存(和CPU(如果需要,因为在Fargate中CPU和内存不是独立的值))创建任务定义的新版本。
  4. 最后,lambda使用新的任务定义更新服务。这将触发滚动更新,并导致群集中的节点数相同,但每个节点具有更大的内存。

您认为这可行吗?有更好的解决方案吗?您可以发现任何潜在的问题吗?

预先感谢您的任何想法!

amazon-ecs autoscaling aws-fargate aws-cdk
1个回答
1
投票

这似乎是解决问题的合理方法,并且可以工作。

[一个问题可能是,您无法跟踪IaC模板中增加的内存需求。这可能会导致您在运行更改服务中任何内容的堆栈更新时将服务“重置”为最小内存。

为了解决这个问题,您可以创建SSM-Parameters,其中包含reference in your template所占用的CPU和内存单元的值。您的Lambda也需要使用新值来更新它们。通过CloudFormation / CDK对服务进行更新的这种方式不应立即触发放大过程。

您仅在内存方面进行扩展,是否存在内存需求减少并且也可以缩减的情况? (这可以通过相同/或相似的机制来完成,只是要记住一点)

© www.soinside.com 2019 - 2024. All rights reserved.