使用 AWS ECS Fargate 进行水平和垂直自动扩展
Posted
技术标签:
【中文标题】使用 AWS ECS Fargate 进行水平和垂直自动扩展【英文标题】:Horizontal and vertical autoscaling with AWS ECS Fargate 【发布时间】:2020-04-24 23:22:54 【问题描述】:我在这里有一个特定的用例。我需要自动扩展在 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)
我正在寻找的是 垂直缩放 部分。到目前为止,我最好的想法是:
-
为集群的内存使用情况创建 CloudWatch 警报。触发率超过 60%。
警报向 SNS 主题发送消息,触发 lambda 函数。
lambda 描述当前任务定义并解析出 CPU 和内存参数。然后它创建一个新版本的任务定义,增加内存(如果需要,还增加 CPU,因为 CPU 和内存在 Fargate 中不是独立的值)。
最后,lambda 用新的任务定义更新服务。这应该会触发滚动更新并导致集群具有相同数量的节点,但每个节点都有更大的内存。
你认为这可行吗?有没有更好的解决方案?您可以发现任何潜在问题吗?
提前感谢您的任何想法!
【问题讨论】:
【参考方案1】:这似乎是解决此问题的合理方法,并且可行。
一个问题可能是,您没有跟踪 IaC 模板中增加的内存需求。当您运行更改服务中任何内容的堆栈更新时,这可能会导致服务“重置”到最小内存。
要解决这个问题,您可以创建 SSM-Parameters 来保存 CPU 和内存单元的值,您可以使用 reference in your template。您的 Lambda 还需要使用新值更新它们。这样通过 CloudFormation/CDK 更新服务不应立即触发扩展过程。
您只是在内存方面扩大规模,是否存在内存需求减少而您也可以缩小规模的情况? (这可以通过相同/或类似的机制来完成,只是需要牢记)
【讨论】:
这是一个非常好的观点!参数存储在这里看起来是最好的选择。为了简单起见,我只提到了放大。缩小可以通过相同的机制来实现。它甚至可以是单个 SNS 主题和 Lambda。由于内存值将在消息中发送,因此 lambda 可以做出相应的反应(放大或缩小)。以上是关于使用 AWS ECS Fargate 进行水平和垂直自动扩展的主要内容,如果未能解决你的问题,请参考以下文章