在ECS上的任务定义之间启动和停止容器实例

时间:2018-02-05 11:52:54

标签: amazon-ec2 amazon-ecs

为了降低成本,我想停止并在群集中间任务中启动容器实例。任务一次又一次地运行,因此保持EC2在中间运行似乎并不有效。

允许此操作的最佳方式是什么?

我已经研究过cloudwatch调度程序触发的lambda函数,并考虑过自动缩放。

2 个答案:

答案 0 :(得分:0)

亚马逊并没有让这个令人难以置信的直截了当(尽管他们正试图用Fargate)。现在最好的解决方案(如果你不在Fargate是一个选项的区域)是试图让你想要的任务数量与自动缩放组中你想要的实例数一致。

我们设置它的方式是通过Lambda,基于Autoscaling事件触发(非常容易设置)。关于这一点的最不重要的部分是Lambda脚本,尽管它并不难以置信。向ASG添加标签,以帮助确定与其关联的集群/服务。当缩放事件触发您的脚本时,只需让您的脚本描述触发它的ASG,查找标签中的集群/服务,并更新所需的服务计数:

asgDetail = paginator_describe_asg.paginate(
    AutoScalingGroupNames=[
        asgName,
    ]
)

# set service desired count equal to ASG desired capacity
newDesiredCount = iter(asgDetail).next()['AutoScalingGroups'][0]['DesiredCapacity']
response = client_ecs.update_service(
    cluster = <ecs cluster>,
    desiredCount = newDesiredCount,
    service = <ecs service>
)

您不应该依赖CloudWatch的原因是因为它在粒度扩展方面做得不好。我的意思是,CloudWatch在您的ASG上监控的CPU是整体组平均值(我认为)。所以我们遇到的情况如下:

  • CloudWatch检测到主机为90%,期望为70%
  • CloudWatch启动4台主机
  • 服务检测任务为85%,期望为70%
  • 服务启动新任务
  • 服务检测任务为80%,期望为70%
  • 服务启动新任务
  • 服务检测任务为75%,期望为70%
  • 服务启动新任务
  • 服务检测任务为70%,无操作

虽然这是一个简单的例子,但很容易看出实例数量与实际运行的任务数量之间的不同步(也就是说,您可能最终因主机处于空闲状态而因为ECS未检测到它需要更多的能力。)

我们可以扩展3台主机吗?当然,但ECS可能仍然只放置2个任务(取决于每个任务的使用情况)。我们可以一次扩展一个主机吗?当然,但是很难解释爆发。

所有这一点,我现在推荐的最佳解决方案是使用Lambda脚本帮助保持您的ASG实例数= =您的ECS服务所需的任务数。

答案 1 :(得分:0)

我决定创建一个启动实例的lambda函数,并在容器实例启动时运行一个任务。然后我有一个云观察事件,观察任务更改状态为STOPPED,触发另一个停止实例的lambda。