Как правильно управлять автоматическим масштабированием приложений Java Spring в Kubernetes? - PullRequest
2 голосов
/ 29 мая 2019

Я пытаюсь настроить автомасштабирование в Kubernetes (размещено в Google Kubernetes Engine) для моего приложения Java Spring.Я столкнулся с двумя проблемами:

  1. Приложение Spring с самого начала использует большое количество процессоров (что-то вроде 250mCPU *, но иногда даже 500mCPU), что действительно нарушает автоматическое масштабирование, потому что в некоторых случаяхэто приложение, после более или менее 1 минуты (запуск контекста Spring и т. д.), использует только 50мкпу.Поскольку в некоторых средах в этом приложении используется небольшое количество mCPU (и почти во всех средах ночью), я хотел бы установить запрошенное значение cpu = 200mCPU max (= 80% предельного значения CPU) (или даже меньше!).Так что тогда автомасштабирование будет иметь гораздо больше смысла.Но я не могу этого сделать из-за того тяжелого начала Spring, которое не закончится, если я дам ему слишком мало процессора.

  2. Когда приложение начинает получать трафик (когдановый модуль создается из-за события автоматического масштабирования) в начале его использование процессора может перейти к чему-то вроде 200% от стандартного использования, а затем вернуться к этому 100% - это не похоже, что это происходит из-за слишком большого количества запросовдля этого нового модуля, похоже, JVM просто медленнее в начале, и он получает слишком много трафика в начале.Похоже, что JVM потребуется что-то вроде разогрева (так что не перебрасывайте 1 / n трафика на новый модуль внезапно, но переключайте трафик на этот новый модуль медленнее).Благодаря такому поведению автомасштабирование иногда сходит с ума - когда ему действительно требуется всего один модуль, он может масштабировать их много, а затем уменьшать ...

* в GKE 1000mCPU= 1 ядро ​​

На загруженных изображениях мы видим графики процессора.Во-первых, мы видим, что загрузка процессора после запуска намного меньше, чем в начале.Во второй мы можем обнаружить обе проблемы: высокая загрузка ЦП в начале, затем льготный период (начальная проверка готовности * задержка еще не закончилась), а затем высокий пик в начале приема трафика.

* Я установил начальную задержку датчика готовности дольше, чем загрузка контекста.

Диаграмма 1 Диаграмма 2

Единственное, что я обнаружил в интернете, - это добавление контейнера в этот модуль, который ничего не будет делать, кроме «сна x», а затем умрет.И добавьте к этому контейнеру запрошенный mCPU в количестве, которое будет использоваться при запуске приложения Spring (тогда мне придется увеличить ограничение ЦП для этого контейнера приложения Spring, но в любом случае это не должно повредить, поскольку автоматическое масштабирование должно предотвращать голодание других приложений Spring.приложения в узле).

Буду очень признателен за любой совет.

...