Поды выселены из-за памяти или OOMKilled - PullRequest
0 голосов
/ 08 мая 2020

Новое в кубернетах. Я пытаюсь запустить под K8S (на GCP) с обдувом. Первые запуски завершились как "выселенные"

Узлу не хватало ресурсов: памяти. База контейнера использовала 5168120Ki, что превышает его запрос 0.

Я не понимаю конца этого сообщения. Оно превышает на 0?

Затем я начал читать документацию и узнавать о запросах и ограничениях ЦП и памяти. Я запустил свою программу Python на своей машине и вижу, что мне нужно около 800 МБ ОЗУ. Затем я решил установить request = 1G и limit = 2G. С этим набором у меня другая ошибка OOMKilled.

Я даже пробую 3G, но у меня то же самое. Мой кластер состоит из 2 узлов, 4 виртуальных ЦП, 15 Гб оперативной памяти.

Почему меня выселили в первом случае и OOM во втором?

1 Ответ

2 голосов
/ 08 мая 2020

Учитывая это сообщение об ошибке, вам необходимо установить ограничение памяти не менее 5 ГиБ. (И если вас это удивит, вы можете попытаться реплицировать свою рабочую нагрузку за пределы Kubernetes с помощью профилировщика кучи, чтобы увидеть, что происходит.)

В первой ситуации самому узлу не хватает памяти ( все эти 15 ГБ используются некоторым набором процессов). Здесь планировщик Kubernetes просматривает модули, работающие на узле, и находит те, которые значительно превышают запросы ресурсов. В сообщении об ошибке говорится, что вы используете на 5 ГиБ памяти больше, чем запрашивали, и ничего не запрашивали, поэтому вас выселяют. Модуль должен быть запланирован на другом узле.

Во второй ситуации вы ограничили объем памяти, который можно использовать, 2 или 3 ГиБ. Однако из первого сообщения об ошибке процесс хочет использовать 5 ГиБ. Когда вы достигнете этого настроенного предела, вы получите OOMKilled (нехватку памяти) и будете перезапущены.


Правильная установка этих ограничений - это немного искусство. Первое, что нужно знать, это сколько памяти фактически использует ваш процесс. Если вы можете запустить его в автономном режиме, базовые инструменты c, такие как top или ps, могут сказать вам это; Если у вас настроены метрики Kubernetes, инструмент мониторинга, такой как Prometheus, также может определять использование памяти для каждого модуля. Вам нужно установить предел памяти, по крайней мере, на самый большой объем памяти, который вы ожидаете от модуля (иначе он будет убит OOM).

Запросы памяти менее научны c. Если на узле 15 ГиБ ОЗУ, планировщик разрешит там работать подам с общим объемом запрошенной памяти 15 ГиБ. Если вы установите запросы ресурсов, близкие к лимитам ресурсов или равные им, тогда на узле сможет работать меньше других модулей; у узла меньше шансов исчерпать память; у отдельной капсулы меньше шансов быть выселенным; и если поды в совокупности не используют всю запрошенную память, то какой-то ресурс не будет использоваться. Установка более низкого запроса ресурсов позволяет большему количеству модулей работать на узле и более высокому использованию физических ресурсов (и, возможно, меньшему количеству узлов), но если это превышает 100%, вещи будут вытеснены.

Я обычно устанавливаю запросы ресурсов вокруг типичное использование процесса, из того же мониторинга, который вы использовали для определения предела. Я также видел очень разумные предложения по установке запросов и ограничений, чтобы избежать выселения подов. Это зависит от вашей терпимости к перезапуску подов по сравнению с вашей терпимостью к запуску (и оплате) дополнительных узлов с более низким коэффициентом использования.

...