У нас есть кластер Kubernetes с 6 узлами, на котором работает около 20 больших рабочих нагрузок наборов реплик (службы Java). Запуск каждого модуля рабочей нагрузки (1 модуль на рабочую нагрузку) занимает в среднем около 30 секунд и использует много ресурсов ЦП. Это делает одновременный запуск нескольких модулей/рабочих нагрузок проблемой — до такой степени, что когда 2 или 3 запускаются одновременно на одном и том же узле, им требуется несколько минут для запуска и в конечном итоге их убивает проверка готовности. Зонд готовности довольно расслаблен, но продление льготного периода на неопределенный срок не кажется хорошей практикой.
Как можно себе представить, это делает блокирование и слив узла проблематичным — если мы сливаем узел, все поды перезапускаются одновременно где-то в другом месте и могут перегрузить воркер (или привести его к остановке, вызывая множественные перезапуски, которые в конечном итоге приводят к блокировкам базы данных). ).
Чтобы обойти это, я написал сценарий оболочки, который использует kubectl для перечисления модулей, перезапускает каждый (путем исправления метаданных), ждет, пока статус станет доступным, и переходит к следующему.
Скрипты отлично работают для исправления сервера или обновления рабочей нагрузки, но не решают проблему сбоя узла — все работает в AWS, и когда узел выходит из строя, создается новый с помощью автомасштабирования, но это означает, что 4 модуля пытаются перезапуститься одновременно. время (обычно в воскресенье утром в 3 часа ночи, конечно).
Одна из идей состоит в том, чтобы иметь контейнер инициализации, который знает о других запускаемых рабочих нагрузках — если в настоящее время на том же узле не запускаются другие рабочие нагрузки, тогда контейнер инициализации завершает работу, позволяя запуститься основному контейнеру. Для этого потребуется учетная запись службы и разрешения, но это может быть обходной путь, но мне было интересно, есть ли более стандартный способ сделать это с помощью конфигурации (правила сходства и т. д.)?