Имеет ли смысл запускать несколько похожих процессов в контейнере? - PullRequest
2 голосов
/ 19 марта 2020

краткая справка, чтобы дать контекст по этому вопросу.

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

Одним из микросервисов, которые мы планируем перенести, является работник ETL, который прослушивает сообщения в SQS и выполняет многоэтапную обработку.

Он построен с использованием PHP Laravel, и мы используем supervisord для управления количеством процессов, запускаемых на каждом рабочем экземпляре в aws ec2. Каждый процесс в основном выполняет команду laravel для опроса различных очередей на наличие новых сообщений. Мы также периодически корректируем число процессов, чтобы максимизировать использование вычислительной мощности каждого экземпляра.

Итак, вопросы:

все еще возможен ли этот метод развертывания при переходе на k8s? Есть ли еще необходимость «максимизировать» использование вычислений? Не лучше ли просто запустить 1 процесс в каждом контейнере, используя «контейнерный путь» (не уверен, как называется инструмент. Runit?)

Я читаю из нескольких источников (например, https://devops.stackexchange.com/questions/447/why-it-is-recommended-to-run-only-one-process-in-a-container) что для контейнера идеально подходит только 1 процесс. Есть также случай восстановления аварийных процессов и того, как запуск supervisord может повлиять на то, как контейнер выполняет восстановление. Но я не совсем уверен, применимо ли это для нашего варианта использования.

1 Ответ

5 голосов
/ 19 марта 2020

Вы должны полностью реструктурировать это, чтобы запустить один процесс на контейнер и один контейнер на модуль. Обычно вам не нужна система инициализации или менеджер процессов, такой как supervisord или runit (есть аргумент, чтобы иметь выделенный init, такой как tini , который может выполнять специальные действия pid-1).

Здесь вы упомянули две проблемы: перезапуск сбойных процессов и размещение процессов в кластере. Для обоих из них Kubernetes обрабатывает их автоматически для вас.

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

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

Kubernetes имеет некоторую возможность автоматического масштабирования, хотя Типичным направлением является определение размера кластера в зависимости от рабочей нагрузки: в облачной конфигурации, если вы добавите новый модуль, который запрашивает больше процессоров, чем доступно вашему кластеру, он предоставит новый узел. HorizonalPodAutoscaler - это что-то вроде расширенной настройки, но вы можете настроить его так, чтобы количество рабочих зависело от длины вашей очереди. Опять же, это работает лучше, если единственное, что он масштабирует, это рабочие стручки, а не набор несвязанных вещей, упакованных вместе.

...