Ответ
Если не указать limits (лимиты) в спецификации ресурсов контейнера, у него не будет верхней границы потребления CPU и памяти. Это считается антипаттерном и может привести к серьезным проблемам в кластере.
Последствия отсутствия limits:
- "Шумный сосед" (Noisy Neighbor): Контейнер может потреблять все доступные ресурсы ноды (CPU и память), вызывая голодание и деградацию производительности других подов на той же ноде.
- Приоритет при OOM Kill: Когда на ноде заканчивается память,
kubeletдолжен завершить контейнер, чтобы освободить её. Контейнеры без установленныхlimitsне имеют гарантированного минимума (requests), поэтому система считает их наиболее "дешевыми" для убийства (OOM Killer). Они будут завершены в первую очередь. - Непредсказуемое планирование: Без
limitsпланировщику Kubernetes сложнее эффективно распределять поды по нодам, так как он не знает максимальных требований контейнера. - Отсутствие троттлинга CPU: Контейнер может использовать 100% CPU ядра, не будучи ограниченным, что приводит к латентности для других процессов.
Пример плохой конфигурации (без limits):
resources:
requests:
memory: "256Mi"
cpu: "100m"
# limits: НЕ УКАЗАНЫ - ОПАСНО!
Рекомендация: Всегда указывайте и requests, и limits в production-средах. limits должны быть основаны на нагрузочном тестировании и могут быть в 1.5-2 раза выше requests для памяти, чтобы дать приложению "буфер" для пиковой нагрузки, не ставя под угрозу стабильность ноды.