Что такое лимиты (limits) и запросы (requests) ресурсов в Kubernetes?

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

Ответ

Requests и Limits — это механизмы управления вычислительными ресурсами (CPU и память) для контейнеров в Kubernetes, определяемые в спецификации Pod.

  • requests (запросы): Гарантированный минимум ресурсов, который Kubernetes резервирует для контейнера. Планировщик (Scheduler) использует эту информацию для размещения пода на ноде, где достаточно свободных ресурсов.
  • limits (лимиты): Максимальное количество ресурсов, которое контейнер может использовать. Если контейнер пытается превысить лимит, Kubernetes его ограничивает.

Поведение при превышении:

  • CPU: Если контейнер пытается использовать больше CPU, чем его limit, ядро ОС ограничивает (throttles) его, не давая превысить лимит. Контейнер не завершается.
  • Память: Если контейнер использует больше памяти, чем его limit, он рассматривается как кандидат на завершение. Если память на ноде становится критически низкой, контейнер с наибольшим превышением может быть принудительно завершен (OOMKilled).

Пример конфигурации в манифесте:

apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: app
    image: myapp:latest
    resources:
      requests:
        memory: "256Mi"
        cpu: "250m" # 250 милли-CPU (0.25 ядра)
      limits:
        memory: "512Mi"
        cpu: "500m" # 500 милли-CPU (0.5 ядра)

Практические последствия:

  1. Качество обслуживания (QoS): На основе requests и limits Kubernetes присваивает поду один из трех классов QoS: Guaranteed (если limits = requests), Burstable (если requests < limits), BestEffort (если не заданы). Это влияет на приоритет при нехватке ресурсов на ноде.
  2. Планирование: Поды планируются на ноды на основе сумм requests всех их контейнеров.
  3. Мониторинг: Использование ресурсов относительно limits — ключевая метрика для автоскейлинга (HPA/VPA).