Como aumentar um contêiner usando o Amazon EC2 Container Service

5

Eu sou novo usando o Amazon ECS e gostaria de saber como configurar serviços para aumentar ou diminuir um contêiner facilmente.

Aqui está minha arquitetura de projeto:

  • website: contêiner com o site, apenas servindo páginas em HTML e javascript / css / images. Escuta em 80.
  • api: container com a API desenvolvida no NodeJS servindo json. Escuta em 443.
  • rabbitmq: contêiner com rabbitmq. O contêiner da API está vinculado a ele.
  • worker: Um contêiner que aguarda pedidos do rabbitmq (também está vinculado a ele) e os processa, e envia as respostas de volta ao rabbitmq.

Por enquanto, acabei de criar uma definição de tarefa com todos os meus contêineres, e no meu cluster só tenho um serviço. Eu também tenho um balanceador de carga na API (para que eu possa acessá-lo a partir do site por meio de um nome DNS).

Funciona bem , mas eu quero ser capaz de lançar mais trabalhadores, sem lançar todo o resto, e eu não pareço ser capaz de fazer isso agora (me corrija se eu ' Estou errado). Então eu tenho algumas perguntas:

  • Preciso criar definições de tarefas separadas?
  • Preciso criar serviços separados?
  • Se eu criar uma definição de tarefa para cada contêiner (assim, frente com site , voltar com api , broker com rabbitmq e worker com trabalhador ), ainda sou capaz de vincular contêineres, mesmo que sejam não na mesma definição de tarefa?

Aqui está minha definição de tarefa atual:

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

Muito obrigado.

    
por Julien Fouilhé 24.05.2015 / 10:16

1 resposta

2

Do I need to create separate task definitions?

Sim

Do I need to create separate services?

Não necessariamente. Você pode simplesmente executar tarefas por conta própria sem o "serviço". Mas o "serviço" permite a associação com o balanceador de carga, o escalonamento automático do aplicativo e com implantações com tempo de inatividade zero.

A única maneira de "vincular link" aos seus contêineres é defini-los em uma definição de tarefa, como você está fazendo atualmente. Dessa forma, o ECS colocará todos os contêineres na mesma instância. Dividir em tarefas diferentes significa que não há vinculação, pois os contêineres podem ser iniciados em instâncias diferentes.

Portanto, se você decidir dividi-los, cada contêiner precisará se conectar a outros contêineres por meio de URLs "de serviço".

Meu conselho é para

  1. Criar ALB / ELB
  2. Divida todos os contêineres em tarefas individuais.
  3. Crie "serviços" para todas as tarefas
  4. Associe cada contêiner de serviços a ALB / ELB
  5. Atualize cada configuração de serviço para usar o DNS: PORT do ALB / ELB usado por cada serviço
  6. Pare de usar rabitMQ e migre para o SQS.

Dessa forma, você pode dimensionar cada "serviço" individualmente.

Se você decidir ficar com o rabbitMQ, precisará usar o ELB para o contêiner rabbitMQ e associar manualmente a porta do contêiner usada pelo rabbitMQ ao ELB.

Os ALBs descobrirão automaticamente as portas de contêiner usadas pelos seus serviços.

Veja isto para mais detalhes sobre ALB e ECS:

link

    
por 09.01.2017 / 19:08