无法放置任务时缩放ECS EC2实例

时间:2017-06-18 10:58:00

标签: amazon-web-services amazon-ecs

我正在使用带有Jenkins ECS plugin的Jenkins代理/从属的ECS群集。

当作业请求构建节点时,插件会放置ECS任务。现在,我想根据需求扩展与ECS群集关联的Autoscaling组中的EC2实例。

  1. 詹金斯经常闲着。在这种情况下,我不希望自动缩放组中有任何实例。
  2. 如果请求了节点(因此也是ECS任务)并且无法放置,我想将EC2实例添加到自动缩放组。
  3. 如果某个实例处于空闲状态且在结算时间之前不久,我希望删除该实例。
  4. 可以通过EC2实例上的cronjob来完成3.点,该实例定期检查是否满足条件并删除EC2实例。

    但我怎样才能完成2.点?如果无法放置任务,我无法创建触发的云监视器警报。

    我该如何做到这一点?

3 个答案:

答案 0 :(得分:1)

当无法放置任务时,意味着将该任务放在ECS群集中将超过MemoryReservation或CPUReservation。您可以为这些ECS指标中的一个或两个设置Cloudwatch警报,以及在ECS集群中添加和删除EC2实例的自动扩展策略。

这与自动扩展策略相结合,可以在ecs上扩展您的ECS服务:服务:DesiredCount维足以让您添加您的ECS群集所需的基础EC2实例。

例如,您的ECS服务的ScalingPolicy可能是"当我们将70%的分配内存用于此服务时,将2添加到DesiredCount"。添加1个服务任务后,您的ECS Cluster MemoryReservation指标可能会超过" 80"阈值,此时Cloudwatch警报将触发ECS MemoryReservation上的某个阈值,并使用自动扩展策略添加另一个EC2节点,现在可以放置第二个任务。

答案 1 :(得分:0)

对于第2点,解决此问题的一种方法是在没有足够的cpu单元放置新的jenkins从属时进行自动缩放。

您应该使用群集上的cpu预留指标进行扩展。 http://docs.aws.amazon.com/AmazonECS/latest/developerguide/cloudwatch-metrics.html#cluster_reservation

答案 2 :(得分:0)

实现此目的的一种相当愚蠢的方法:您可以使用Lambda函数来检测服务何时runningCount + pendingCount < desiredCount超过X秒。 (我还没有测试过。) 提出了类似的解决方案here

只有在无法放置任务时,似乎没有适当的扩展解决方案。也许AWS希望我们过度配置我们的集群,这可能是高可用性的良好实践,但并不总是最好或最便宜的解决方案。