更新AWS ECS服务

时间:2017-01-14 22:30:44

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

我在AWS EC2 Container Service(ECS)上运行了一项服务。我的设置相对简单。它使用单个任务定义和以下详细信息进行操作:

  • 所需容量设置为2
  • 最低健康状况设定为50%
  • 最高可用设置为200%
  • 以80%CPU和内存预留运行的任务

最初,我能够在没有问题的情况下获得注册到群集的必要EC2实例。然后,关联的任务开始在两个实例上运行。正如预期的那样 - 考虑到CPU和内存预留 - 这些任务占用了几乎所有EC2实例的资源。

有时,我希望任务使用正在运行的应用程序的新版本。为了实现这一点,我创建了任务的修订版,取消注册了以前的版本,然后更新了服务。请注意,我已将最低健康百分比设置为始终要求2 * 0.50 = 1实例运行,并设置最大健康百分比以允许最多2 * 2.00 = 4个实例运行。

因此,我预计将取消注册的任务实例中的一个被排空并脱机,以便可以将该任务的新修订版的一个实例联机。然后,该过程将重复进行,使部署成功。

不幸的是,集群什么也没做。在events日志中,它告诉我它不能放置新任务,即使我上面描述的过程允许它这样做。

如何让群集执行我期望的行为?当我手动将另一个EC2实例注册到集群然后在更新完成后将其拆除时,我才能做到这一点(这是不可取的)。

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,其中任务被卡住并且没有空间放置它们。来自AWS文档updating a service的以下片段帮我做出了以下决定。

  

如果您的服务具有所需的四个任务数和一个最大值   百分比值为200%,调度程序可能会在之前启动四个新任务   停止四个较旧的任务(假设集群资源   要求这样做是可用的)。最大值的默认值   百分比是200%。

我们应该有群集资源可用/容器实例可用让新任务开始,以便它们可以启动,旧版本可以耗尽。

这些是我做的事情

  1. 在执行服务更新之前,请为群集添加20%的容量。您可以使用ASG(自动扩展组)命令行,并从所需的容量中将20%添加到您的群集。这样,您将在部署期间获得一些额外的实例。

  2. 获得实例后,新任务将快速开始旋转,旧任务将开始耗尽。

  3. 但这是否意味着我将拥有额外的容器实例?

    是的,在部署期间,您将添加一些实例,但随着较旧的任务耗尽,它们将会闲置。删除它们的方法是

    创建MemoryReservationLow警报(在您的情况下约为70%的阈值),持续25分钟(持续时间更长,以确保我们已经过度调试)。

    ,如果您没有使用这些额外的服务器,预订将会降低。

答案 1 :(得分:0)

我之前见过这个。如果端口映射正在尝试将静态主机端口映射到任务中的容器,则需要更多群集实例。

这也可能是因为没有足够的可用内存来满足任务中容器请求的内存(软或硬)限制。