Что произойдет, если не указать Limits для контейнера в Kubernetes?

«Что произойдет, если не указать Limits для контейнера в Kubernetes?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Последствия отсутствия limits:

  1. "Шумный сосед" (Noisy Neighbor): Контейнер может потреблять все доступные ресурсы ноды (CPU и память), вызывая голодание и деградацию производительности других подов на той же ноде.
  2. Приоритет при OOM Kill: Когда на ноде заканчивается память, kubelet должен завершить контейнер, чтобы освободить её. Контейнеры без установленных limits не имеют гарантированного минимума (requests), поэтому система считает их наиболее "дешевыми" для убийства (OOM Killer). Они будут завершены в первую очередь.
  3. Непредсказуемое планирование: Без limits планировщику Kubernetes сложнее эффективно распределять поды по нодам, так как он не знает максимальных требований контейнера.
  4. Отсутствие троттлинга CPU: Контейнер может использовать 100% CPU ядра, не будучи ограниченным, что приводит к латентности для других процессов.

Пример плохой конфигурации (без limits):

resources:
  requests:
    memory: "256Mi"
    cpu: "100m"
  # limits: НЕ УКАЗАНЫ - ОПАСНО!

Рекомендация: Всегда указывайте и requests, и limits в production-средах. limits должны быть основаны на нагрузочном тестировании и могут быть в 1.5-2 раза выше requests для памяти, чтобы дать приложению "буфер" для пиковой нагрузки, не ставя под угрозу стабильность ноды.