如何使用 Amazon EC2 容器服务扩展一个容器

如何使用 Amazon EC2 容器服务扩展一个容器

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

这是我的项目架构:

  • website:包含网站的容器,仅提供 html 页面和 javascript/css/images。监听 80。
  • api:使用 NodeJS 开发的提供 json 服务的 API 容器。监听 443。
  • rabbitmq:带有 rabbitmq 的容器。api 容器与其链接。
  • worker:等待来自rabbitmq的命令(它也链接到它)并处理它们,然后将答案发送回rabbitmq的容器。

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

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

  • 我需要创建单独的任务定义吗?
  • 我需要创建单独的服务吗?
  • 如果我为每个容器创建一个任务定义(因此正面网站后退api经纪人rabbitmq工人工人),即使它们不在同一个任务定义中,我是否仍然能够将容器链接在一起?

这是我当前的任务定义:

{
  "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"
}

非常感谢。

答案1

Do I need to create separate task definitions?

是的

Do I need to create separate services?

不一定。您可以直接运行任务,而无需“服务”。但“服务”允许与负载均衡器、应用程序自动扩展以及零停机部署关联。

“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/

相关内容