如何使用Amazon EC2 Container Service扩展一个容器

我是新的使用Amazon ECS,我想知道如何设置服务,以便容易地扩大/缩小一个容器。

这是我的项目架构:

  • 网站:容器与网站,只提供html页面和javascript / css /图像。 听80。
  • api:在NodeJS中开发的API服务json的容器。 听443。
  • rabbitmq:容器与rabbitmq。 api容器被链接到它。
  • worker:等待来自rabbitmq(也链接到它)的命令并处理它们的容器,然后将答案发送回rabbitmq。

现在,我只用我的所有容器创build了一个任务定义,而在我的集群中,我只有一个服务。 我也有API的负载平衡器(所以我可以从网站通过DNS名称访问它)。

它工作的很好 ,但是我希望能够发起更多的工作,而不需要启动其他任何东西,而且现在我似乎也无法做到这一点(纠正我,如果我错了)。 所以我有几个问题:

  • 我是否需要创build单独的任务定义?
  • 我是否需要创build单独的服务?
  • 如果我为每个容器创build一个任务定义(因此前面网站 ,带有API ,带有rabbitmq的 代理和带有worker的worker ),我仍然可以将容器链接在一起,即使它们不在同一个任务定义中。

这是我目前的任务定义:

{ "taskDefinitionArn": "arn:aws:ecs:ap-southeast-2:347930943102:task-definition/Flipendo:4", "revision": 4, "containerDefinitions": [ { "volumesFrom": [], "portMappings": [], "command": [], "environment": [ ], "essential": true, "entryPoint": [], "links": [ "rabbitmq" ], "mountPoints": [], "memory": 2048, "name": "worker", "cpu": 4096, "image": "flipendo/worker" }, { "volumesFrom": [], "portMappings": [], "command": [], "environment": [], "essential": true, "entryPoint": [], "links": [], "mountPoints": [], "memory": 2048, "name": "rabbitmq", "cpu": 2048, "image": "rabbitmq" }, { "volumesFrom": [], "portMappings": [ { "hostPort": 443, "containerPort": 3000 } ], "command": [], "environment": [ ], "essential": true, "entryPoint": [], "links": [ "rabbitmq" ], "mountPoints": [], "memory": 2048, "name": "api", "cpu": 2048, "image": "flipendo/api" }, { "volumesFrom": [], "portMappings": [ { "hostPort": 80, "containerPort": 3000 } ], "command": [], "environment": [ { "name": "API_PORT", "value": "443" }, { "name": "API_ADDR", "value": "load balancer dns server" } ], "essential": true, "entryPoint": [], "links": [ "api" ], "mountPoints": [], "memory": 1024, "name": "website", "cpu": 1024, "image": "flipendo/website" } ], "volumes": [], "family": "Flipendo" } 

非常感谢你。

 Do I need to create separate task definitions? 

 Do I need to create separate services? 

不必要。 你可以在没有“服务”的情况下自行运行任务。 但“服务”允许与负载平衡器,应用程序自动调整以及零停机时间部署关联。

“Docker链接”你的容器的唯一方法就是像你目前正在做的那样在一个任务定义中定义它们。 这样ECS将所有的容器放在同一个实例上。 拆分成不同的任务意味着没有链接,因为容器可能在不同的实例上启动。

因此,如果您决定拆分它们,那么每个容器将不得不通过“服务”URL连接到其他容器。

我的build议是

  1. 创buildALB / ELB
  2. 将所有容器拆分为单个任务。
  3. 为所有任务创build“服务”
  4. 将每个服务容器与ALB / ELB关联
  5. 更新每个服务configuration以使用由每个服务使用的ALB / ELB的DNS:PORT
  6. 停止使用rabitMQ并迁移到SQS。

这样您可以逐个缩放每个“服务”。

如果您决定继续使用rabbitMQ,则必须使用ELB for rabbitMQ容器,并手动将rabbitMQ使用的容器端口与ELB相关联。

ALB将自动发现您的服务使用的容器端口。

有关ALB和ECS的更多详细信息,请参阅此处:

https://aws.amazon.com/blogs/compute/microservice-delivery-with-amazon-ecs-and-application-load-balancers/