ECS ASG 缩减政策建议

ECS ASG scaling down policy recommendations

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

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

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

我有一些想法来尝试解决这个问题,但我想知道是否有建议、AWS 选项或继续允许 [=19] 的聪明方法=]ECS集群缩减规模,同时避免人员伤亡...

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

  • 计算环境:本质上是划分到容器中的 EC2 实例。这会根据需要 运行 的作业进行放大和缩小。
  • 作业队列:一种在决定计算环境中的哪些资源应该分配给哪个作业时断言任务优先级的方法
  • 工作定义:基本上描述了整个计算环境的哪一部分被分割。它还描述了需要完成的实际计算工作是什么。

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

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

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

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

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

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

因此,自动缩放组将无法删除包含 运行ning 容器的实例。如果所有实例 运行 至少一个容器,desired 计数会下降,但自动缩放会 return cancelled: could not缩放 直到一个实例有 0 个容器 运行 再次

效果很好!

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