Что произойдет, если модуль Kubernetes превысит «лимит» своих ресурсов памяти?

#kubernetes

#kubernetes

Вопрос:

В документации Kubernetes немного неясно, что произойдет, если объем памяти модуля увеличится до такой степени, что он превысит значение, указанное в resources.limits .

https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/#how-pods-with-resource-limits-are-run

Это указывает, что если объем модуля превысит его limits значение, он «может быть» завершен. Что означает «может быть»? Какие условия приведут к его завершению, а какие позволят продолжить работу как есть?

Комментарии:

1. AFAIK, вы столкнетесь с тем, что модули, о которых идет речь, будут уничтожены и, таким образом, остановлены. Теперь, если вы имеете в виду ограничения запросов, просто модули будут удалены и не смогут быть запланированы

Ответ №1:

Вопрос: Что произойдет, если модуль Kubernetes превысит «лимит» своих ресурсов памяти?

Он будет перезапущен.

В отличие от удаления модуля Pod, если контейнер Pod отключен, он может быть перезапущен kubelet на основе его RestartPolicy .

Вы можете настроить отключение обработки ресурсов для вашего Node .

Удаление модулей конечного пользователя

Если kubelet не удается восстановить достаточный ресурс на узле, kubelet начинает удаление модулей.

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

Комментарии:

1. Как перезапустить? Отключает ли kubelet модуль и перезапускает ли его, или же ООМ-убийца ядра Linux принудительно отключает его? Что, если в kubelet все еще достаточно памяти, но достигнут предел модуля?

2. @SineSwiper: Он состоит из 5 этапов: 1) Состояние модуля устанавливается на «Завершение», и он перестанет получать запрос, 2) Вызывается предварительный перехватчик, 3) в модуль отправляется SIGTERM, 4) k8s ожидает в течение льготного периода, 5) отправляется SIGKILL: cloud.google.com/blog/products/containers-kubernetes /…

3. Я знаю, как работает жизненный цикл завершения Kube. Но ограничения памяти регулируются контрольными группами Linux, и когда у контрольных групп заканчивается память, это очень похоже на «уничтожение ООМ». В этот момент больше нечего завершать. В лучшем случае у вас есть модуль с мертвым контейнером SIGKILL’d.

4. Это действительно то, что я испытываю, когда мой модуль достигает предела памяти. Модуль завершает работу без какого-либо льготного периода, затем перезапускается k8s. Я бы ожидал запуска нового контейнера, а затем завершения старого… Если уничтожение выполняется ОС на основе контрольных групп, то k8s ничего не сможет сделать для повышения доступности.

5. Итак, чтобы быть немного более точным — CRI отвечает за создание контейнеров, обычно через cgroups. у контрольных групп есть псевдофайл «memory.oom_control», который определяет, будет ли процесс, выходящий за пределы своих ограничений памяти, остановлен или нет. Хотя верно, что большинство (если не все) CRI предпочитают уничтожать такие процессы (по уважительным причинам), технически это не гарантировано и зависит от CRI.

Ответ №2:

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