Назад | Перейти на главную страницу

Как масштабировать один контейнер с помощью Amazon EC2 Container Service

Я новичок в Amazon ECS и хотел бы знать, как настроить сервисы, чтобы легко масштабировать один контейнер вверх / вниз.

Вот моя архитектура проекта:

На данный момент я только что создал одно определение задачи со всеми моими контейнерами, а в моем кластере у меня есть только одна служба. У меня также есть балансировщик нагрузки в API (так что я могу получить к нему доступ с веб-сайта через DNS-имя).

Отлично работает, но я хочу иметь возможность запускать больше рабочих процессов, не запуская все остальное, и, похоже, я не могу это сделать прямо сейчас (поправьте меня, если я ошибаюсь). Итак, у меня есть несколько вопросов:

Вот мое текущее определение задачи:

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

Не обязательно. Вы можете просто запускать задачи самостоятельно, без «сервиса». Но «сервис» допускает связь с Load Balancer, автоматическим масштабированием приложений, а также без простоев развертываний.

Единственный способ «Docker link» ваши контейнеры - это определить их в одном определении задачи, как вы это делаете сейчас. Таким образом, ECS разместит все контейнеры в одном экземпляре. Разделение на разные задачи означает отсутствие связывания, поскольку контейнеры могут запускаться в разных экземплярах.

Поэтому, если вы решите разделить их, тогда каждый контейнер должен будет подключаться к другим контейнерам через «служебные» URL-адреса.

Мой совет:

  1. Создать ALB / ELB
  2. Разбейте все контейнеры на отдельные задачи.
  3. Создавайте «сервисы» для всех задач
  4. Свяжите каждый сервисный контейнер с ALB / ELB
  5. Обновите конфигурацию каждой службы, чтобы использовать DNS: ПОРТ ALB / ELB, используемый каждой службой
  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/