使用 AWS ECS Fargate 进行水平和垂直自动扩展

0x3*_*dfb 6 amazon-ecs autoscaling aws-fargate aws-cdk

我这里有一个具体的用例。我需要自动扩展在 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)
Run Code Online (Sandbox Code Playgroud)

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

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

你认为这可行吗?还有更好的解决办法吗?您可以发现任何潜在的问题吗?

预先感谢您的任何想法!

Mau*_*ice 4

这似乎是解决此问题的合理方法并且可行。

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

为了解决这个问题,您可以创建SSM 参数来保存您在模板中引用的CPU 和内存单元的值。您的 Lambda 还需要使用新值更新它们。这样,通过 CloudFormation/CDK 更新服务不应立即触发扩展过程。

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