在AWS上启动100个相同的Docker机器的最佳方法

63次阅读
没有评论

问题描述

需要在AWS上进行大规模测试,系统由两个主要部分组成:Manager和Nodes。只有一个Manager服务器,但有100个Nodes。Manager和Nodes都是Docker镜像。
用户希望能够在AWS上启动一个设置,其中一个Manager实例和100个Nodes实例(每个服务器一个实例)被启动。
用户想知道应该使用什么工具来实现这个需求。Manager和Nodes应该能够相互通信,而Nodes不应该以任何方式进行负载均衡。因此,它们需要一个专用的内部IP,Manager可以与之通信。
用户已经研究了ECS和CloudFormation+EC2与自定义AMI,但不确定哪种方法更适合。
用户希望有一个脚本,可以定期运行以启动服务器,并轻松关闭它们。
用户对在AWS上如何轻松启动这个设置有什么建议吗?

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

使用AWS Fargate可以实现在不启动ECS集群的EC2实例的情况下运行Docker容器。您只需调度任务(或服务),每个任务都有自己的IP地址,它们可以相互通信。
您还可以使用AWS Service Discovery来简化任务IP地址的注册和查找。
需要注意的是,默认的Fargate并发限制是20个任务/服务,如果您需要100个任务,您需要提高服务限制。我们将并发任务数提高到了200个,因为我们的处理在Fargate上并行运行了160多个容器,而无需管理任何EC2实例。
以下是如何使用Fargate启动100个容器的方法:
1. 在CI/CD流水线中构建容器镜像并上传到ECR。
2. 在源代码中包含一个CloudFormation(CFN)模板,在流水线的部署阶段创建/更新CFN堆栈,该堆栈创建具有所有容器参数的ECS TaskDefinition。
3. 编写一个使用Python编写的调度器作业,并由CloudWatch Event(类似于cron的调度器)触发,该作业查找TaskDefinition ARN并从单个TaskDef运行160多个任务。您可以为每个任务提供额外的参数,或覆盖某些配置等。或者不提供任何参数,只是启动它。
我们以前使用EC2/ECS,需要额外的步骤-将ECS AutoScaling组扩展到数十个节点以支持我们的工作负载,然后在最后将其缩减为0。除此之外,无论您是在Fargate上运行还是在EC2/ECS上运行,都是相同的。
希望对您有所帮助 :)

方案2

您可以使用Terraform来实现这个需求。它可以启动任意数量的实例,为您创建网络、安全组、ECS、IAM等,并在需要时轻松终止。这是目前在行业中广泛使用的工具。
以上是两种在AWS上启动100个相同的Docker机器的解决方案。您可以根据自己的需求选择适合您的方法。

正文完