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

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

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

  • веб-сайт: контейнер с веб-сайтом, обслуживающий только html-страницы и javascript/css/images. Слушает на 80.
  • api: контейнер с API, разработанным в NodeJS и обслуживающим json. Слушает на 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. Обновите каждую конфигурацию службы для использования DNS:PORT 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/

Другие вопросы по тегам