Я потратил целый день, пытаясь разобраться в управлении ресурсами 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 не запускался? Какую политику выселения я могу установить, чтобы кубелет начинал выселять поды, когда доступно менее гигабайта памяти?
system.slice
cgroup, так что в любом случае это не имеет значения. Я экспериментировал сsystem-reserved
. Фактически, мне удалось вызвать систему выселения кубелета, просто увеличивeviction-hard
лимит. Однако суть вопроса в том, что если я скажу выселить поды, когда доступная память меньше 1 ГБ, кубелет не будет придерживаться этого из-за разницы в вычислениях. Итак, вопрос: как мне правильно настроить это, чтобы кубелет в нужный момент задействовал логику выселения? - person Simon   schedule 19.10.2020