В чем разница между Limits и Requests в Kubernetes?

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

Ответ

Requests и Limits — это два ключевых параметра управления ресурсами для контейнеров в Pod'ах Kubernetes.

  • Requests (Запросы): Это количество ресурсов (CPU и памяти), которое Kubernetes гарантирует контейнеру. Планировщик (Scheduler) использует эту информацию, чтобы разместить Pod на ноде, где достаточно свободных ресурсов. Если нода не может удовлетворить запросы, Pod не будет запущен.
  • Limits (Лимиты): Это максимальное количество ресурсов, которое контейнеру разрешено использовать.
    • Для CPU: Если контейнер пытается использовать больше CPU, чем его лимит, ядро Linux будет "throttle" (ограничивать) его, не давая превысить лимит.
    • Для Памяти: Если контейнер превышает лимит памяти, он будет завершен с ошибкой OOMKilled (Out Of Memory).

Практический пример в манифесте:

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  containers:
  - name: app
    image: nginx
    resources:
      requests:
        memory: "128Mi"
        cpu: "100m"  # 0.1 ядра CPU
      limits:
        memory: "256Mi"
        cpu: "500m"  # 0.5 ядра CPU

Важный нюанс: Если указаны только limits без requests, Kubernetes автоматически установит requests равными limits. Это может привести к неэффективному использованию ресурсов кластера, так как Pod зарезервирует себе максимум, даже если ему это не нужно.