Как я могу правильно установить лимиты выселения Kubernetes pod, чтобы избежать системного OOM killer

Я потратил целый день, пытаясь разобраться в управлении ресурсами Kubernetes. В частности, я пытаюсь настроить пороги выселения и резервирование ресурсов таким образом, чтобы всегда был доступен как минимум 1 ГБ памяти.

Переход к документации, касающейся резервирования ресурсов и вне- обработка ресурсов, я решил, что достаточно установить следующую политику выселения:

--eviction-hard=memory.available<1Gi

Однако на практике это вообще не работает, поскольку вычисление, которое делает кубелет, похоже, отличается от вычислений, которые выполняет ядро, когда ему нужно определить, нужно ли вызывать OOM-убийцу. Например. когда я загружаю свою систему кучей модулей, запускающих искусственный захват памяти, я получаю следующий отчет от free -m:

Total:      15866
Used:       14628
free:       161
shared:     53
buff/cache: 1077
available:  859

Согласно ядру доступно 859 Мбайт памяти. Тем не менее, kubelet не ссылается на свою политику выселения. Фактически, я смог вызвать системный убийца OOM до того, как была вызвана политика вытеснения кубелета, даже при невероятно медленном увеличении использования памяти (чтобы позволить циклу управления уборкой кубелета засыпать 10 секунд в соответствии с его конфигурацией по умолчанию).

Я нашел этот скрипт, который раньше был в документации Kubernetes и должен рассчитывать доступную память так же, как и Kubelet. Я запустил его параллельно с free -m выше и получил следующий результат:

memory.available_in_mb 1833

Это разница почти в 1000 миллионов!

Теперь я понимаю, что расчет был разработан специально, но это оставляет мне очевидный вопрос: как я могу надежно управлять использованием системных ресурсов, чтобы системный убийца OOM не запускался? Какую политику выселения я могу установить, чтобы кубелет начинал выселять поды, когда доступно менее гигабайта памяти?


person Simon    schedule 15.10.2020    source источник
comment
Указано ли резервирование ресурсов с помощью _1 _? github.com/kubernetes/community/blob/master/contributors/   -  person Mariusz K.    schedule 16.10.2020
comment
Не специально для кубелет. Кубелет работает в system.slice cgroup, так что в любом случае это не имеет значения. Я экспериментировал с system-reserved. Фактически, мне удалось вызвать систему выселения кубелета, просто увеличив eviction-hard лимит. Однако суть вопроса в том, что если я скажу выселить поды, когда доступная память меньше 1 ГБ, кубелет не будет придерживаться этого из-за разницы в вычислениях. Итак, вопрос: как мне правильно настроить это, чтобы кубелет в нужный момент задействовал логику выселения?   -  person Simon    schedule 19.10.2020


Ответы (1)


Согласно документации https://kubernetes.io/docs/tasks/administer-cluster/reserve-compute-resources/, вы должны добавить флаг Kubelet --system-reserved=memory=1024Mi

person paltaa    schedule 15.10.2020
comment
Я тоже работал с этим. Я связал ту же страницу документации. Это ничего не меняет в способе вычисления доступной памяти, и когда вызывается диспетчер выселения, он меняет только расчет расписания AFAIK. - person Simon; 16.10.2020