【问题标题】:我应该使用 AWS Elastic Beanstalk 还是 Amazon EC2 Container Service (ECS) 来扩展 Docker 容器?
【发布时间】:2015-06-17 12:13:00
【问题描述】:

我开发了一个由多个微服务组成的基于 Docker 的应用程序。它必须使用 Amazon SQS 消息并对其进行处理。起初我想使用 AWS Elastic Beanstalk,但后来我被 EC2 容器服务迷住了。现在不知道该选哪一个了。

截至目前,Elastic Beanstalk 支持多容器环境。这很棒,因为每个微服务在 docker 容器中都有自己的应用程序服务器。下一个问题是缩放:

我不知道缩放机制是如何工作的。例如:我的 Elastic Beanstalk 环境中有 5 个 docker 容器。现在只有第五个 docker 容器处于重负载状态,因为它有大量的 SQS 消息要处理,其他四个几乎空闲,因为它们不需要太多 CPU 或者可能没有很多 SQS 消息。假设第 5 个容器运行 JBoss 应用程序服务器。据我所知,即使有足够的 CPU/内存可用,服务器也只能消耗有限数量的并行请求。

如果 JBoss Docker 容器无法处理大量请求,但有足够的 CPU/内存可用,当然我想在同一实例上自动启动第二个 Docker/JBoss 容器。但是,如果我没有足够的 CPU/内存,会发生什么?当然,我想使用第二个实例,它可以通过 EB 中的自动缩放组进行配置。现在第二个实例启动了,但是除了第 5 个容器之外的每个容器几乎都处于空闲状态,当然我不希望它们在第二个实例中也产生 4 个不必要的容器,这会浪费资源。只有第 5 个应该产生,其他的应该根据可配置的参数像第 5 个比例缩放,例如:CPU/内存/SQS。

我不完全知道 Amazon ECS 是否正在这样做,或者是否有可能,但我真的在互联网上找不到任何关于这个主题的资料,一般来说,基于实例进行扩展/容器。

【问题讨论】:

  • 你觉得你的问题解决了吗?我对 EB 也有类似的担忧,我怀疑它会在一个单独的实例中启动所有 5 个容器
  • 我也很困惑。选择的答案并没有真正解释缩放在这两种服务中是如何工作的。如果有足够的资源,ECS/EB 是否真的会启动另一个第 5 个容器,然后在同一个实例上并行运行?

标签: amazon-web-services jboss docker amazon-elastic-beanstalk amazon-ecs


【解决方案1】:

EB 与 ECS 真正归结为控制。你想控制你的扩展和容量,还是你想要更抽象,而是主要关注你的应用程序。 ECS 将为您提供控制,因为您必须指定集群中节点的大小和数量以及是否应使用自动扩展。使用 EB,您只需提供一个 Dockerfile,而 EB 负责扩展您的节点数量和大小的配置,您基本上可以忘记使用 EB 路由的基础设施。

这是 Docker 上的 EB 文档:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_docker.html

使用 ECS,您必须先构建基础架构,然后才能开始部署 Dockerfile,因此这实际上归结为 1)您对基础架构的熟悉程度和 2)您希望在基础架构上花费的工作量与应用程序。

【讨论】:

  • 是的,但是这两种服务的自动扩展机制是如何工作的,Elastic Beanstalk 是否按容器扩展容器,所以如果只有一个处于负载状态,它只会扩展这个,或者是否总是扩展实例并启动所有容器,无论它们处于什么负载下?
  • 现在 ECS 是 GA,EB 利用 ECS 来提供它的多容器基础架构。自动扩展是使用典型的 EC2 自动扩展组原语完成的。扩大或缩小规模的触发因素不是容器,而是实例节点。 IE。如果网络接口流量、CPU 负载或磁盘负载达到某个阈值,则集群可以横向扩展或横向扩展。因此,在您的示例中,如果第 5 个容器的节点处于高 CPU 负载下,您可以根据以下条件设置自动扩展组触发器那个。
  • 另请注意,您可以使用更受控的面向容器的 ECS 方法,并通过使用 AWS Fargate 推迟集群控制责任。
  • 定价如何?不一样吗?
【解决方案2】:

不要复活一个死问题,但希望这对某人有所帮助。

接受的答案不够明确:根据 OP 的描述,OP 想要 ECS,而不是 Multi-Container Elastic Beanstalk (MCEB)。据我所知,MCEB 从未尝试有效地将容器打包到实例中。 OP 在评论中问道,“如果只有一个负载,它只扩展这个,还是总是扩展实例并启动所有容器,无论它们处于什么负载下?”答案是“后者”; MCEB 扩展实例并启动所有容器,无论它们处于何种负载下。

编辑

不要使用你想象中的架构。

您的微服务有多微型?给他们每个人一个 t2.nano 会很荒谬吗?然后让它们每个都成为单容器 Docker EB 应用程序 - EB 工作程序应用程序可以由 SQS 消息驱动。或使用apex.run

编辑 1/31/18:

AWS Fargate 看起来很酷。

2019 年 6 月 5 日编辑:

如果您需要编排容器来满足需求,请使用 EKS。但实际上,尽量避免这种情况。分布式系统很难。

【讨论】:

  • 它正是这样做的。对我们来说这不是一个大问题,因为我们以堆栈方式构建我们的应用程序,通常可以将它们一起缩放。如果应用程序需要独立扩展,我会说这应该是 EB 上的另一个应用程序。我真的很努力想出一个需要这样做的好场景。我一直在阅读很多人表达这种愿望的案例,但我无法确定这只是学术问题、设计问题还是真正有效的案例。
猜你喜欢
  • 2015-05-01
  • 1970-01-01
  • 2014-11-08
  • 2016-12-08
  • 2017-07-26
  • 1970-01-01
  • 2017-05-07
  • 2015-08-22
  • 2021-11-25
相关资源
最近更新 更多