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

Динамическая маршрутизация HTTP-трафика в пользовательские контейнеры Docker

Я пытаюсь создать службу, которая будет запускать пользовательские java-процессы в контейнерах Docker в AWS (скорее всего, ECS). Один Java-процесс на контейнер для каждого пользователя. Единственное исключение из этого может быть при установке нового контейнера для того, что плохо себя ведет. Java-процесс - это пакетное программное обеспечение, которое нельзя изменить в соответствии с моими потребностями. По сути, я собираюсь создать службу SaaS на основе этого конкретного программного обеспечения, и я знаю, что будут детали лицензирования, которые необходимо согласовать с разработчиком программного обеспечения.

Java-процесс имеет собственный встроенный веб-сервер, который использует нестандартные порты, например (30000-30004) для доступа к своему веб-интерфейсу. Он может поддерживать HTTP или HTTPS в зависимости от конфигурации. Я планирую запускать как можно больше этих контейнеров на каждый экземпляр EC2, чтобы сделать его более рентабельным (это будет означать, что разные порты экземпляров EC2 будут сопоставлены с внутренними портами (30000–30004) контейнеров.

Я хотел бы обернуть встроенный пользовательский интерфейс java-процесса несколькими другими элементами, чтобы обеспечить контроль над Java-процессом (остановка, запуск и т. Д.) И обслуживать мой пользовательский интерфейс через другой веб-сервер или, возможно, шлюз API через Lambda. Это позволит пользователю запускать или останавливать свой экземпляр по мере необходимости, и вся система будет использовать эти запросы для запуска или остановки конкретного контейнера Docker пользователя.

Чтобы дать представление о масштабе, возможно, что одновременно могут быть десятки тысяч пользователей. Прогнозируемый размер рынка для этого проекта составляет около 100 000 пользователей. Возможный размер рынка составляет около 2 миллионов пользователей в месяц. На самом деле, это будет примерно 10 000 пользователей, из которых примерно 7 500 будут активны в течение любого месяца. Потенциальный масштаб этого, вероятно, исключает возможность использования Application Load Balancer с индивидуальной настройкой целевой и целевой группы для каждого экземпляра контейнера пользователя, поскольку ограничения на ALB допускают только 1000 целей и только 100 правил.

Чтобы дать представление о скорости изменений, отдельный контейнер может работать в течение нескольких часов или, возможно, дня или более, пока пользователь взаимодействует с ним. Но иногда его можно использовать только в течение нескольких минут. Контейнер для отдельного пользователя может понадобиться только раз в неделю или две, или он может использоваться ежедневно.

Теперь к вопросу, какие из лучших решений для обработки трафика маршрутизации к упомянутым контейнерам Docker? Я надеюсь разместить все это в моем собственном домене и использовать маршрутизацию на основе путей для получения запросов в соответствующие контейнеры.

Например:


Пользователи не должны иметь доступа ни к одному контейнеру, кроме того, который запускается специально для их сеанса. В java-процессе есть встроенная аутентификация, которая может помочь в этом.

По сути, я создаю мультитенантную службу из одного пользовательского программного обеспечения, я знаю, что мне придется создать довольно много пользовательских инструментов, и я не прочь сделать это. Я бы предпочел решения, которые хорошо работают с Python, когда требуется собственный код, но при необходимости приветствуются и другие языки. Я подозреваю, что мне нужно будет включить какой-то агент или сценарий запуска в контейнеры или в экземпляры EC2, выполняющие их, которые будут регистрировать контейнер в системе маршрутизации после запуска контейнера. Затем мне нужно было бы изучить аналогичный сценарий выключения для удаления регистрации контейнера, а также обычную систему для очистки в случае, если контейнер или экземпляр EC2 выйдет из строя без надлежащего выключения. Я уже изучил HAProxy и Nginx, и я готов услышать идеи по этому поводу, но другие варианты также очень приветствуются.

Заранее благодарим вас за ваши предложения!

Вы определенно правы в том, что вам нужно создать множество специальных инструментов для этого, но я думаю, что это можно сделать.

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

  • Правило 1: Путь начинается / user1, отправляйте трафик на TG1
  • Правило 2: Путь начинается / user2, отправляйте трафик на TG2
  • и т.д..
  • Правило N: правило по умолчанию, весь остальной трафик в TGN (ваш основной сайт, обработчик 404 и т. Д.)

Вам нужно будет создать инструменты для;

  • Подготовьте контейнер (ы), необходимый для обслуживания ваших пользователей. Контейнеры Docker могут использовать динамические порты, и один и тот же экземпляр EC2 / ECS может находиться в нескольких TG на разных портах. Когда контейнер станет активным, выясните, какие динамические порты он прослушивает.
  • Подготовьте TG для размещения этих контейнеров и зарегистрируйте соответствующие цели на соответствующих портах.
  • Обновите свой ALB, чтобы добавить новое правило для вашего пути, маршрутизирующего к только что созданному TG.
  • Перенаправить пользователя

Вероятно, вы можете сделать все это в рамках лямбда-функции. Я не вижу причин, по которым для их завершения потребуется больше, чем максимальное время жизни в 5 минут ... самая длинная часть будет ждать, пока контейнеры станут активными, и даже это не так уж и долго.