Как увеличить один контейнер с помощью 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-адреса "службы".
Мой совет
- Создать ALB/ELB
- Разделите все контейнеры на отдельные задачи.
- Создать "сервисы" для всех задач
- Свяжите каждый сервисный контейнер с ALB/ELB
- Обновите каждую конфигурацию службы для использования DNS:PORT ALB/ELB, используемого каждой службой
- Прекратите использовать rabitMQ и перейдите на SQS.
Таким образом, вы можете масштабировать каждую "услугу" индивидуально.
Если вы решите остаться с rabbitMQ, вам придется использовать ELB для контейнера rabbitMQ и вручную связать порт контейнера, используемый rabbitMQ, с ELB.
ALB автоматически обнаружат порты контейнеров, используемые вашими службами.
Смотрите это для более подробной информации о ALB и ECS: