Перестаньте использовать CPU Limits в k8s
Многие люди думают, что вам нужны ограничения по использованию ЦПУ на Kubernetes, но это не так. В большинстве случаев, ограничения по использованию ЦПУ на Kubernetes только вредят. Фактически, они являются одной из главных причин ограничения использования ЦПУ на Kubernetes.
Ограничения по CPU в Kubernetes - это антипаттерн
Многие считают, что в Kubernetes необходимы ограничения по CPU, но это не так. В большинстве случаев ограничения по CPU в Kubernetes больше вредят, чем помогают.
Я объясню, почему ограничения по CPU вредны, используя три аналогии между подами, испытывающими нехватку CPU, и жаждущими исследователями, заблудившимися в пустыне. Давайте назовем наших отважных исследователей Маркусом и Терезой.
В наших историях CPU будет водой, а нехватка CPU будет означать смерть. Как и CPU, вода в нашем рассказе будет возобновляемым ресурсом. Простыми словами, если у вас 100% использования CPU в определенную минуту, это не "исчерпывает" CPU на следующую минуту. CPU возобновляется в каждый следующий момент времени.
Три красочные аналогии о лимитах CPU в Kubernetes
Маркус и Тереза путешествуют по пустыне. У них есть волшебная бутылка с водой, которая производит 3 литра в день. Каждому человеку нужен 1 литр в день, чтобы выжить.
История 1 - без лимитов, без запросов: Маркус жадный и выпивает всю воду до того, как Тереза успеет выпить. Тереза умирает от жажды. Это произошло из-за отсутствия лимитов и запросов. Маркус мог выпить всю воду, вызвав нехватку CPU, и Тереза была ограничена в использовании CPU.
История 2 - с лимитами, с или без запросов: Однажды Терезе становится очень плохо, и ей нужно дополнительно воды. Маркус выпивает свой литр, и остается два литра. Тереза пьет один литр, и остается один литр. Маркус не позволяет Терезе выпить его, потому что ее лимит составляет 1 литр в день, и она умирает от жажды. Это происходит, когда есть лимиты CPU. Ресурсы доступны, но их нельзя использовать.
История 3 - без лимитов, с запросами: Однажды Маркусу становится очень плохо, и ему нужно дополнительно воды. Он пытается выпить всю бутылку, но его останавливают, когда остается только 1 литр. Этот литр сохраняется для Терезы, потому что ей нужен 1 литр в день. Она пьет свой 1 литр. Ничего не остается. Они оба выживают. Это происходит, когда у вас нет лимитов CPU, но есть запросы. Все в порядке.
Вышеуказанные истории удивительно точно объясняют, почему лимиты CPU считаются вредными.
Не нравятся аналогии? Я написал более техническое объяснение этого, объясняя предупреждение Prometheus о троттлинге CPU, CPUThrottlingHigh.
Предотвращение троттлинга CPU и нехватки CPU без лимитов
Многие люди считают, что для предотвращения взаимного влияния одного пода на другой под необходимы лимиты. Это не так! Вы можете удалить лимиты CPU в Kubernetes и всё равно предотвратить ситуацию, когда ресурсоемкий под может вызвать нехватку CPU! Секрет заключается в определении только запросов CPU.
Вот фрагмент из оригинальной документации Kubernetes:

Важная часть выделена. Поды всегда получают CPU, указанный в их запросах CPU! (Они также могут использовать избыточный CPU, если у них нет лимита.)
Отключите лимиты CPU! Если вы укажете точные запросы CPU для всех ваших подов в Kubernetes, то никто не сможет ограничивать их, потому что CPU будет зарезервирован для них, если им это нужно. Это не имеет ничего общего с лимитами.
Запросы против Лимитов в Kubernetes
Давайте суммируем разницу между лимитами и запросами CPU в таблице:

Я понимаю, что мы упрощаем сценарий и предполагаем, что либо все поды имеют лимиты CPU, либо ни один из них их не имеет, и аналогично для запросов CPU, то это действительно облегчает логику управления ресурсами в Kubernetes. Этот подход делает все проще для понимания причин.
Лучшие практики для лимитов и запросов CPU в Kubernetes
Давайте подведем итог:
- Используйте запросы CPU для всех подов (если вам нужна помощь в их настройке, обратитесь к KRR).
- Убедитесь, что они точно определены.
- Не используйте лимиты CPU.
- Тим Хокин (один из оригинальных сопровождающих Kubernetes в Google) рекомендует то же самое уже несколько лет.
А что насчет лимитов и запросов памяти?
Все в этой заметке касается CPU, а не памяти. Память отличается, потому что она несжимаема - после предоставления памяти вы не можете ее отнять без завершения процесса. Кратко говоря, нашей основной рекомендацией является:
- Всегда использовать лимиты памяти.
- Всегда использовать запросы памяти.
- Всегда устанавливать запросы памяти равными лимитам.