我正在使用带有Jenkins ECS plugin的Jenkins代理/从属的ECS群集。
当作业请求构建节点时,插件会放置ECS任务。现在,我想根据需求扩展与ECS群集关联的Autoscaling组中的EC2实例。
可以通过EC2实例上的cronjob来完成3.点,该实例定期检查是否满足条件并删除EC2实例。
但我怎样才能完成2.点?如果无法放置任务,我无法创建触发的云监视器警报。
我该如何做到这一点?
答案 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希望我们过度配置我们的集群,这可能是高可用性的良好实践,但并不总是最好或最便宜的解决方案。