我应该使用AWS Elastic Beanstalk还是Amazon EC2容器服务(ECS)来扩展Docker容器?

orb*_*how 71 jboss amazon-web-services amazon-ecs docker amazon-elastic-beanstalk

我开发了一个基于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是否正在这样做,或者它是否可能,但我真的无法在互联网上找到关于这个主题的任何来源,一般来说,基于实例/容器进行扩展.

ala*_*ill 62

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是否按容器扩展容器,所以如果只有一个处于负载状态,它只会扩展这个,或者它总是扩展实例并开始全部容器,无论它们在什么负荷下? (7认同)
  • 现在ECS是GA,EB利用ECS提供其多容器基础设施.使用典型的EC2自动缩放组原语完成自动缩放.向上或向下扩展的触发因素不是容器,而是实例节点.即,如果网络接口流量,或CPU负载或磁盘负载达到某个阈值,则群集可以向外扩展或进入.因此在您的示例中,如果第5个容器的节点处于高CPU负载下,您可以设置基于自动缩放组的触发器在那. (6认同)

Sam*_* H. 9

不要复活一个死的问题,但希望这有助于某人.

接受的答案还不够明确:根据OP描述的内容,OP需要ECS,而非多容器弹性Beanstalk(MCEB).据我所知,MCEB从未试图有效地将容器打包到实例中.OP在评论中询问,"如果只有一个负载,它只扩展这个,或者它总是扩大实例并启动所有容器,无论它们在什么负载下?" 答案是"后者"; MCEB扩展实例并启动所有容器,无论它们处于什么负载下.

编辑

不要使用你想象的架构.

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

编辑1/31/18

AWS Fargate看起来很酷.