【问题标题】:How to deploy continuously using just One EC2 instance with ECS如何使用 ECS 仅使用一个 EC2 实例进行持续部署
【发布时间】:2016-11-14 10:45:44
【问题描述】:

我想使用带有 ECS 的 一个 EC2 实例 持续部署我的 nodejs webapp。我无法为此应用创建多个实例。

我目前的持续集成流程: Travis 从 github 构建代码,构建标签并推送 docker 镜像并通过ECS Deploy shell script 部署到 ECS。

每次部署时,都会发生以下错误。因为我的 webapp 总是使用端口 80。

The closest matching container-instance ffa4ec4ccae9
is already using a port required by your task
  1. ECS真的可以用一个实例吗? (文档不清楚)
  2. 如何解决 ECS 上的这个端口问题? (停止正在运行的容器)
  3. 在不使用负载均衡器的情况下如何完成这项工作?
  4. 除了最佳实践之外,我还有什么遗漏或做的事情吗?

【问题讨论】:

  • 如果您的应用程序在部署时不能容忍离线,您应该考虑选择仅拥有 1 个 EC2 实例。

标签: amazon-web-services amazon-ec2 continuous-integration travis-ci amazon-ecs


【解决方案1】:

主要问题是端口冲突,在集群中的同一节点上部署任务的第二个实例时会发生这种情况。除此之外,没有什么可以阻止您拥有多个容器实例(例如,当不使用负载均衡器时;绑定到任何端口)。

为解决此问题,Amazon introduced 在最近的更新中添加了动态端口功能:

动态端口可让您更轻松地在集群中启动任务,而无需担心端口冲突。以前,要使用 Elastic Load Balancing 将流量路由到您的应用程序,您必须在 ECS 任务中定义一个固定的主机端口。这增加了操作复杂性,因为您必须跟踪每个应用程序使用的端口,并且降低了集群效率,因为每个实例只能放置一个任务。现在,您可以在 ECS 任务定义中指定一个动态端口,当容器在 EC2 实例上调度时,它会为容器提供一个未使用的端口。 ECS 调度程序使用此端口自动将任务添加到应用程序负载均衡器的目标组。首先,您可以从 EC2 控制台或使用 AWS 命令​​行界面 (CLI) 创建应用程序负载均衡器。在 ECS 控制台中使用将主机端口设置为 0 的容器创建任务定义。此容器在调度时会自动接收临时端口范围内的端口。

【讨论】:

    【解决方案2】:

    这是一种使用绿/蓝部署模式的方法:

    1. 将您的容器托管在端口 8080 和 8081(或您想要的任何端口)上。我们称 8080 绿色和 8081 蓝色。 (您可能必须将网络模式从桥接切换到主机才能使其在单个实例上工作)。
    2. 使用 Elastic Load Balancing 将流量从 80/443 重定向到绿色或蓝色。
    3. 部署时,使用脚本将 ELB 上的活动侦听器交换为其他颜色/容器。

    这还允许您回滚到“上次已知良好”状态。

    更多信息请参见http://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-load-balancing.html

    【讨论】:

    • 如果您将网络切换到主机并公开两个端口,并且可能在 ECS 上使用 nginx 或其他东西,使用单个实例可能可以在没有 ELB 的情况下做到这一点主机重定向流量。但是,使用负载均衡器会给您带来许多其他好处,我强烈建议您使用它。
    猜你喜欢
    • 2019-07-28
    • 2020-02-06
    • 2012-12-08
    • 2018-10-24
    • 2021-04-19
    • 2018-03-24
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多