更新 AWS ECS 服务

Updating an AWS ECS Service

我在 AWS EC2 容器服务 (ECS) 上有一项服务 运行ning。我的设置相对简单。它使用单个任务定义和以下详细信息运行:

最初,我能够毫无问题地将必要的 EC2 实例注册到拥有该服务的集群。然后关联的任务在两个实例上启动 运行ning。正如预期的那样——考虑到 CPU 和内存预留——这些任务几乎占用了 EC2 实例的全部资源。

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

因此,我预计 1 个已注销的任务实例将被耗尽并脱机,以便任务新修订版的 1 个实例可以联机。然后该过程会自行重复,使部署进入成功状态。

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

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

我以前看过这个。如果您的端口映射试图将静态主机端口映射到任务中的容器,则您需要更多集群实例。

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

我遇到过同样的问题,任务曾经卡住并且没有 space 放置它们。 AWS 文档中关于 updating a service 的以下片段帮助我做出了以下决定。

If your service has a desired number of four tasks and a maximum percent value of 200%, the scheduler may start four new tasks before stopping the four older tasks (provided that the cluster resources required to do this are available). The default value for maximum percent is 200%.

我们应该有可用的集群资源/可用的容器实例来启动新任务,这样它们就可以开始,旧的任务可以耗尽。

这些是我做的事情

  1. 在进行服务更新之前,将大约 20% 的容量添加到您的集群。您可以使用 ASG(Autoscaling 组)命令行,将所需容量增加 20% 到您的集群。这样您在部署期间将有一些额外的实例。

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

但这是否意味着我会有额外的容器实例?

是的,在部署过程中您将添加一些实例,但是随着旧任务的耗尽,它们会一直存在。删除它们的方法是

创建一个 MemoryReservationLow 警报(在您的情况下约为 70% 的阈值),持续 25 分钟(更长的持续时间以确保我们已过度委托)。由于一旦您不使用这些额外的服务器,预订就会变少,因此可以将其删除。