【问题标题】:Host Multiple applications in one container in AWS ECS(Fargate)在 AWS ECS(Fargate) 的一个容器中托管多个应用程序
【发布时间】:2021-04-08 06:15:11
【问题描述】:

我们的产品包含以下 .Net5 应用程序:

  1. 面向客户的前端网络应用
  2. 管理工具 - 用于管理活动
  3. 网络 API
  4. 工作器服务 - 用于后台作业

现在我们正在使用两个 AWS EC2 虚拟机(使用 AWS 负载均衡器进行负载均衡)在 IIS 上托管这些应用程序。此外,我们有 5 个不同的供应商(将来会更多)。因此,我们为每个供应商部署了这 4 个应用程序,即我们在每个 VM 上的 IIS 上托管了 20 个应用程序。

现在需要迁移到像 AWS Fargate 这样的无服务器容器服务。 这里的任何专家都可以建议采取以下任何一种方式:

  1. 集群中的 20 个容器镜像、20 个任务定义和 20 个服务
  2. 20个容器镜像,5个Task定义(每个有5个容器定义)和集群中的5个Service
  3. 5 个容器镜像(每个容器中有 4 个应用程序 - 如果可能的话)、5 个任务定义和 5 个集群中的服务

我不是容器服务方面的专家,所以我上面提到的三种方式有可能是完全虚构的,在这种情况下请提出合适的方式。 与 EC2 虚拟机相比,我的最终目标是找出以更具可扩展性(自动缩放)和成本效益的方式托管这些应用程序的可能性。

谢谢

【问题讨论】:

    标签: amazon-web-services amazon-ecs aws-fargate


    【解决方案1】:

    认为任务是管理和扩展的原子单元。它由 1 个(通常)或多个容器(在需要时)组成。如果您的应用程序有明确的界限,它需要与其他模块分开扩展,并且它有自己的生命周期,与其他模块/应用程序不同......那么它需要是它自己的任务。在该任务中,如果这是您的原子实体,您可能需要拥有多个容器。例如,在您拥有前端、应用服务器、索引服务、后端服务等的场景中……。这些模块中的每一个都需要有自己的任务。这些任务中的每一个都可以是一个或多个容器,具体取决于您的模块的构建方式。

    服务它只是一个构造,它允许您告诉 ECS“接受该任务并始终运行它的 x 实例”。 x 可以是一个固定数字,或者您可以告诉 ECS 根据工作负载扩展和扩展服务(根据任务数量)。

    根据您上面所说的,您的应用程序似乎由 4 个模块(网站、工具、API 和工作程序)组成。这意味着您可能正在查看 4 个任务定义。鉴于我了解您的应用程序不是多租户,您可能需要为特定用户(在您的情况下为“供应商”?)提供专用服务。

    因此,假设您有 5 个供应商,您可能会有 5 个用于 Web 模块的 ECS 服务、5 个用于工具模块的 ECS 服务、5 个用于 API 模块的 ECS 服务和 5 个用于工作模块的 ECS 服务.假设您可以使用不同供应商的环境变量自定义每个模块,您可能只需要 4 个任务定义,这些定义在您启动它们时会在运行时得到个性化。如果这不可能,那么您必须为每个模块和每个供应商定义一个任务。

    这是您应该如何看待它的高层次。如果您是 ECS 新手,也许更好的方法是使用我们使用 Docker 构建的 Docker/ECS integration 或简化上述许多概念的 Copilot CLI

    HTH

    【讨论】:

    • 另一个更紧凑但可扩展性较差的选项是为每个供应商提供服务。然后每个服务任务定义可以有 4 个容器。这将使解决方案更简单,但您将无法扩展特定容器。
    • 我认为您的建议是基于每个供应商 1 个任务定义的 1 项服务。理论上,1 个任务可以包含 4 个模块作为单独的容器,并且服务可以调度 1+ 个这些任务。正如您指出的那样,您将失去单个模块的可扩展性和生命周期(即,如果您需要部署 API 模块的新版本,则需要部署所有 4 个模块)。如果您想保持简单,它可能会起作用,但它有其权衡。
    猜你喜欢
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-06
    • 1970-01-01
    • 2020-10-03
    • 2020-09-05
    • 1970-01-01
    相关资源
    最近更新 更多