1

我想在 AWS ECS 上部署一个 Play Web 应用程序。我创建了一个包含 2 个运行 Web 服务的 EC2 实例的集群。每个实例都运行一个任务。集群由 AWS ELB 进行负载平衡。

将新的 docker 映像推送到存储库后,我创建了任务定义的新修订版,其中包括标记为latest. 当我更新服务以使用新的任务定义时,所有 EC2 实例都会立即更新它们的任务。即使我有 2 个 EC2 实例,我也会遇到停机时间,因为 AWS 会同时更新所有实例,而不是以滚动部署的方式一个接一个地更新一个实例。

我尝试在每个 EC2 实例上启动多个任务,但这显然是不可能的,因为每个任务都需要 Play 的默认端口 9000,并且我在服务的事件选项卡中收到“端口已在使用”错误消息。

我可以想到两种可能的解决方案:

  • 每个任务实例都使用动态端口而不是默认端口。(如何配置负载均衡器以“搜索”动态端口?)
  • 创建两个单独的 ECR 集群,将它们都放在一个负载均衡器目标组中,并在第一个集群完成更新后手动更改第二个集群的任务定义。(如何实现自动化 - 或者完全可以自动化?)

这些解决方案之一是可行的方法,还是有任何其他解决方案或此方案的最佳实践?

4

1 回答 1

0

好的,我找到了问题的根源。首先,我稍微混淆了术语。AWS Elastic Beanstalk 的文档解释了滚动更新和滚动部署之间的区别。我试图实现滚动部署,而不是滚动更新 - 我将相应地编辑我的问题。

此外,我注意到我更改了实例的“最小健康百分比”并无意中将设置保存为 0%。因此,ECS 正确地冒昧地同时重新部署了多个 EC2 实例,在我的集群上没有留下任何健康的实例。我在这里找到了一个非常有用的视频,作者介绍了升级 ECS 集群然后再次降级的过程。现在一切都按预期工作。

于 2017-02-02T14:49:32.893 回答