ECS ASG缩减政策建议

arv*_*tal 0 amazon-web-services amazon-ecs autoscaling

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

向上扩展没有问题,但是根据可用内存进行向下扩展意味着可以删除具有正在运行的容器的服务器(并且可以任意杀死这些容器)。直到最近这才成为问题,因为每个关键服务都在运行至少两个任务,因此一个任务可以关闭并可以在其他地方重新启动而不会中断任何服务。

但是我们现在拥有的服务(Jenkins +远程从属服务器)最好不要被中断(否则它可能会切断从属服务器->主服务器连接并导致作业构建崩溃)。

我有一些想法可以尝试解决这个问题,但是我想知道是否有建议,AWS选项或聪明的方法来继续进行ECS集群的缩减,同时避免人员伤亡...

arv*_*tal 5

好的,我通过玩终止保护来增加了对自动缩放操作的控制。

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

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
Run Code Online (Sandbox Code Playgroud)

noContainerRunning如果该实例上没有正在运行的任务,则该变量将包含1,并且该实例asgProtection上的终止保护的当前状态为变量)

因此,自动缩放组将无法删除包含正在运行的容器的实例。如果所有实例至少运行一个容器,则所需的计数将减少,但自动缩放将返回取消:在实例再次运行0个容器之前无法缩放

运行良好!

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