Какие ограничения ресурсов существуют в Kubernetes?

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

Ответ

В Kubernetes существует несколько уровней ограничений ресурсов, которые я настраиваю для обеспечения стабильности и эффективности кластера.

1. Ресурсы контейнера (Container Resources): Определяются в спецификации Pod. Это основа для планирования и ограничения потребления.

  • requests: Минимальные гарантированные ресурсы, которые планировщик (kube-scheduler) резервирует для Pod. Pod не будет размещён на ноде, если она не может удовлетворить эти запросы.
  • limits: Максимально допустимое потребление ресурсов. При превышении:
    • CPU: Контейнер будет "throttled" (ограничена его доля процессорного времени).
    • Память: Контейнер будет завершён с статусом OOMKilled (Out Of Memory).
apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: app
    image: nginx:alpine
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"  # 250 миллиядер (0.25 ядра)
      limits:
        memory: "128Mi"
        cpu: "500m"

2. Квоты на пространство имён (ResourceQuota): Ограничивают суммарное потребление ресурсов всеми Pod'ами в пределах Namespace. Это предотвращает "захват" всех ресурсов кластера одним проектом или командой.

apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-quota
  namespace: production
spec:
  hard:
    requests.cpu: "2"
    requests.memory: 4Gi
    limits.cpu: "4"
    limits.memory: 8Gi
    pods: "10" # Ограничение на количество Pod

3. Лимитранг (LimitRange): Задаёт политики по умолчанию, минимумам и максимумам для ресурсов контейнеров в рамках Namespace. Полезен для установки стандартов и предотвращения ошибок конфигурации.

apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
spec:
  limits:
  - default: # Значения по умолчанию, если не указаны
      memory: 256Mi
    defaultRequest: # request по умолчанию
      memory: 128Mi
    type: Container

4. Ограничения узла (Node Capacity): Физические или виртуальные ресурсы самой ноды (CPU, память, локальное хранилище). Kubelet сообщает о них в API-сервер. Все Pod'ы, размещённые на ноде, не могут суммарно превысить её capacity.

5. Budget на нарушение работы Pod (PodDisruptionBudget): Хотя это не ограничение ресурсов в классическом понимании, PDB ограничивает количество добровольных нарушений работы (например, при обновлении узла), гарантируя доступность приложения.

На практике я всегда начинаю с настройки requests и limits на уровне Pod, затем добавляю ResourceQuota для изоляции команд и использую LimitRange для enforcement стандартов.