Я разработал приложение на основе Docker, состоящее из нескольких микросервисов. Он должен принимать сообщения Amazon SQS и обрабатывать их. Сначала я хотел использовать AWS Elastic Beanstalk, но потом упал на EC2 Container Service. Теперь не знаю, какой выбрать.
На данный момент Elastic Beanstalk поддерживает многоконтейнерные среды. Это здорово, потому что у каждого микросервиса есть собственный сервер приложений внутри контейнера докеров. Следующая проблема - масштабирование:
Я не знаю, как работает механизм масштабирования. Например: у меня есть 5 контейнеров докеров в моей среде Elastic Beanstalk Environment. Теперь только пятый контейнер докеров находится под большой нагрузкой, потому что он имеет огромное количество сообщений SQS для обработки, остальные четыре почти простаивают, потому что им не требуется много ЦП или, возможно, не так много сообщений SQS. Предположим, 5-й контейнер запускает сервер приложений JBoss. Насколько мне известно, сервер может использовать только ограниченное количество параллельных запросов, даже если имеется достаточно ЦП / памяти.
Если контейнер JBoss Docker не может обрабатывать количество запросов, но достаточно ЦП / памяти, конечно, я хочу автоматически запускать второй контейнер Docker / JBoss на том же экземпляре. Но что произойдет, если мне не хватит процессора / памяти? Конечно, я хочу запустить второй экземпляр, который можно настроить с помощью группы автоматического масштабирования в EB. Теперь запускается второй экземпляр, но каждый контейнер, кроме 5-го, почти бездействует, конечно, я не хочу, чтобы они создавали 4 ненужных и во втором экземпляре, что было бы пустой тратой ресурсов. Должен появиться только 5-й, а остальные должны масштабироваться как 5-я шкала на основе настраиваемых параметров, таких как, например: CPU / memory / SQS.
Я точно не знаю, делает ли это Amazon ECS или возможно ли это вообще, но я действительно не могу найти в Интернете какой-либо источник по этой теме, которая в целом называется масштабированием на основе экземпляров / контейнеров.
Ответы:
EB vs ECS действительно сводится к контролю. Вы хотите контролировать свое масштабирование и емкость или хотите, чтобы это было более абстрактно и вместо этого сосредоточилось в основном на своем приложении? ECS предоставит вам контроль, так как вы должны указать размер и количество узлов в кластере, а также следует ли использовать автоматическое масштабирование. С EB вы просто предоставляете Dockerfile, а EB позаботится о масштабировании предоставления количества и размера узлов, вы в основном можете забыть об инфраструктуре с маршрутом EB.
Вот документация EB по Docker: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_docker.html
С ECS вам нужно будет сначала построить инфраструктуру, прежде чем вы сможете начать развертывание Dockerfile, поэтому на самом деле все сводится к 1) вашему знакомству с инфраструктурой и 2) уровню усилий, которые вы хотите потратить на инфраструктуру по сравнению с приложением.
источник
Не воскрешать мертвый вопрос, но, надеюсь, это кому-то поможет.
Принятый ответ недостаточно ясен: исходя из того, что описал OP, OP хочет ECS, а не Multi-Container Elastic Beanstalk (MCEB). Насколько я могу судить, MCEB никогда не пытается эффективно упаковывать контейнеры в экземпляры. OP спрашивает в комментарии: «Если только один находится под нагрузкой, он масштабирует только этот, или он всегда масштабирует экземпляры и запускает все контейнеры, независимо от того, под какой нагрузкой они находятся?» И ответ - «последнее»; MCEB масштабирует экземпляры и запускает все контейнеры, независимо от их нагрузки.
редактировать
Не используйте ту архитектуру, которую вы себе представляете.
Насколько микро ваши микросервисы? Было бы смешно дать каждому по t2.nano? Затем сделайте их каждое приложение Docker EB с одним контейнером - рабочие приложения EB могут управляться сообщениями SQS. Или используйте apex.run .
Изменить 31.01.18:
AWS Fargate кажется довольно крутым.
Изменить 6/5/19:
Используйте EKS, если вам нужно организовать контейнеры, чтобы утолить зуд. Но на самом деле постарайтесь этого избежать. Распределенные системы - это сложно.
источник