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

Jul*_*lhé 5 amazon-ec2 amazon-web-services docker amazon-ecs

我是使用 Amazon ECS 的新手,我想知道如何设置服务以便轻松扩展/缩减一个容器。

这是我的项目架构:

  • 网站:网站的容器,仅提供 html 页面和 javascript/css/images。听80。
  • api:在 NodeJS 中开发的 API 容器,提供 json 服务。在 443 上收听。
  • rabbitmq:带有rabbitmq的容器。api 容器链接到它。
  • worker:等待来自rabbitmq的订单(它也链接到它)并处理它们,然后将答案发送回rabbitmq的容器。

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

它工作正常,但我希望能够启动更多的工作人员,而不启动其他一切,而且我现在似乎无法做到这一点(如果我错了,请纠正我)。所以我有几个问题:

  • 我需要创建单独的任务定义吗?
  • 我需要创建单独的服务吗?
  • 如果我为每个容器创建一个任务定义(因此前面website后面apibrokerrabbitmqworkerworker),我是否仍然能够将容器链接在一起,即使它们不在同一个任务定义中?

这是我当前的任务定义:

{
  "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"
}
Run Code Online (Sandbox Code Playgroud)

非常感谢。

小智 2

Do I need to create separate task definitions?
Run Code Online (Sandbox Code Playgroud)

是的

Do I need to create separate services?
Run Code Online (Sandbox Code Playgroud)

不必要。您可以简单地自行运行任务,而无需“服务”。但“服务”允许与负载均衡器、应用程序自动缩放以及零停机部署关联。

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

因此,如果您决定拆分它们,那么每个容器都必须通过“服务”url 连接到其他容器。

我的建议是

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

这样您就可以单独扩展每个“服务”。

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

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

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

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