ECS ASG缩减政策建议

时间:2017-07-10 19:41:18

标签: amazon-web-services autoscaling amazon-ecs

我们正在使用 AWS ECS 来处理我们作为一组容器的服务。运行 Docker / ECS 代理的 EC2 实例位于自动扩展组中,其实例数基于自定义指标,以确保我们始终全局拥有足够的可用内存可以同时启动几个容器,但不能过多限制成本。

向上扩展时没有问题,但根据可用内存进行缩减意味着可以删除具有正在运行的容器的服务器(并且容器被任意杀死)。 直到最近才出现这个问题,因为每个关键服务至少运行两个任务,因此可以关闭一个任务,并且可以在没有任何服务中断的情况下重启其他任务。

但是我们现在有服务( Jenkins +远程从属服务器),最好不要被中断(或者它可能会削减slave - >主连接并使作业构建崩溃)。

我有一些想法可以解决这个问题,但我想知道是否有推荐, AWS 选项或一种聪明的方式来继续允许 ECS 集群缩小规模,同时避免伤亡......

2 个答案:

答案 0 :(得分:4)

好的,我通过使用终止保护添加了对自动缩放操作的控制。

每个 ECS 实例定期运行一个返回指标的脚本。 在这个脚本中,我添加了以下部分:

<input type="checkbox" th:field="*{zoneList}" th:value="${cList.zoneId}" id="zone" />

if [ $noContainersRunning == 1 ] && [ $asgProtection == true ]; then aws autoscaling set-instance-protection --region $region --instance-ids $instanceId --auto-scaling-group-name $asgId --no-protected-from-scale-in echo "Disabling scale-in protection" elif [ $noContainersRunning == 0 ] && [ $asgProtection == false ]; then aws autoscaling set-instance-protection --region $region --instance-ids $instanceId --auto-scaling-group-name $asgId --protected-from-scale-in echo "Enabling scale-in protection" fi 是一个变量,如果此实例上没有任何任务正在运行,则包含1; noContainerRunning此实例上的终止保护的当前状态)

因此,自动缩放组无法删除包含正在运行的容器的实例。如果所有实例至少运行一个容器,所需的计数将会关闭,但自动扩展将返回已取消:无法扩展直到实例再次运行0个容器

它工作得很好!

我还使用 bin-pack 任务展示位置模板重新创建了服务,以确保容器不会在群集的所有实例上传播。

答案 1 :(得分:-1)

我想你可能想考虑AWS Batch。基本上你有:

  • 计算环境:基本上是EC2实例,它们被分割成容器。这可以根据需要在其上运行的作业进行扩展和缩小。
  • 作业队列:在决定计算环境中哪些资源应该转到哪个作业时断言任务优先级的方法
  • 作业定义:基本上描述了整个计算环境的哪个部分被分割。它还描述了需要完成的实际计算工作。

总的来说,我个人会分成两个独立的计算环境:一个用于Jenkins工作,另一个用于其他工作。然后将作业队列分配给每个计算环境,以便您知道需要执行的任务。当完成与某个计算环境相关的队列中的工作时,Batch可以简单地拆除容器托管实例。需要再做一次工作吗?它将为您再次提升资源。这里的好处是,您的拆解可以更专注于完成的工作而不是OS资源指标。

如果您需要在某个时刻进行扩展,您可以简单地增加计算环境,添加更多计算环境,调整作业定义资源规格等。还可以选择利用现场实例来进行更好的成本控制。