Что такое Limit (лимит) у Pod в Kubernetes?

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

Ответ

В Kubernetes Limit (лимит) — это максимальное количество вычислительных ресурсов (CPU и памяти), которое контейнер внутри Pod может использовать. Это жесткая граница.

Практическое значение лимитов:

  • Память (memory): Если контейнер пытается использовать памяти больше, чем его лимит, он будет завершен с ошибкой OOMKilled (Out Of Memory). Kubernetes перезапустит Pod в соответствии с политикой restartPolicy.
  • CPU: Контейнеру не позволят использовать больше CPU, чем указано в лимите. Ядро Linux (cgroups) будет его ограничивать, что может привести к троттлингу (throttling) и снижению производительности.

Пример определения лимитов в манифесте Pod:

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
  - name: app-container
    image: myapp:latest
    resources:
      requests:  # Гарантированный минимум
        memory: "256Mi"
        cpu: "250m"
      limits:    # Максимально допустимый предел
        memory: "512Mi"
        cpu: "500m"

Критически важные моменты для DevOps-инженера:

  1. Лимиты vs Requests: limits и requests — разные вещи. requests используются планировщиком (scheduler) для размещения Pod на узле с достаточными свободными ресурсами. limits — это ограничение во время выполнения.
  2. Безопасность узла: Правильно настроенные лимиты предотвращают ситуацию, когда один «прожорливый» Pod исчерпывает все ресурсы узла, вызывая проблемы у других Pod'ов ("noisy neighbor").
  3. Обязательность настройки: В продакшене настройка лимитов (и requests) считается best practice. Их отсутствие может привести к нестабильности кластера.
  4. Соотношение: Лимит памяти должен быть всегда больше или равен request'у памяти, иначе Pod не будет создан. Для CPU это правило не такое строгое, но разумное соотношение также важно.