Вы должны полностью реструктурировать это, чтобы запустить один процесс на контейнер и один контейнер на модуль. Обычно вам не нужна система инициализации или менеджер процессов, такой как supervisord или runit (есть аргумент, чтобы иметь выделенный init, такой как tini , который может выполнять специальные действия pid-1).
Здесь вы упомянули две проблемы: перезапуск сбойных процессов и размещение процессов в кластере. Для обоих из них Kubernetes обрабатывает их автоматически для вас.
Если основной процесс в модуле завершается неудачей, Kubernetes перезапустит его. Вам не нужно ничего делать для этого. Если произойдет сбой несколько раз, он начнет задерживать перезапуски. Эта функция работает только в случае сбоя основного процесса - если основной процесс вашего контейнера является процессом супервизора, вы никогда не получите перезапуск модуля и не сможете напрямую заметить, если процесс вообще не запустится.
Обычно вы запускаете контейнеры через развертывания, которые имеют некоторое количество идентичных модулей реплики. Сам Kubernetes берет на себя ответственность за решение, какой узел будет запускать каждый модуль; вам не нужно указывать это вручную. Чем меньше стручки, тем легче их разместить. Поскольку вы контролируете количество реплик модуля, вы также хотите разделить задачи, такие как веб-серверы и работники очередей, чтобы вы могли масштабировать их независимо.
Kubernetes имеет некоторую возможность автоматического масштабирования, хотя Типичным направлением является определение размера кластера в зависимости от рабочей нагрузки: в облачной конфигурации, если вы добавите новый модуль, который запрашивает больше процессоров, чем доступно вашему кластеру, он предоставит новый узел. HorizonalPodAutoscaler - это что-то вроде расширенной настройки, но вы можете настроить его так, чтобы количество рабочих зависело от длины вашей очереди. Опять же, это работает лучше, если единственное, что он масштабирует, это рабочие стручки, а не набор несвязанных вещей, упакованных вместе.