Если значения limit и request разные, и в кластере недостаточно ресурсов для удовлетворения limit, будет ли возможен запуск Pod в кластере?

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

Ответ

Да, запуск Pod будет возможен, если в кластере достаточно ресурсов для удовлетворения значений, указанных в requests. Kubernetes при планировании (scheduling) учитывает только requests.

Механика работы requests и limits:

  • requests (запросы): Это гарантированные ресурсы, которые планировщик (kube-scheduler) резервирует для Pod. Pod будет запланирован на узел (Node) только если на этом узле есть достаточно свободных ресурсов для удовлетворения всех requests контейнера.
  • limits (лимиты): Это максимальные ресурсы, которые контейнер может использовать. Они не учитываются при планировании. Kubelet на узле обеспечивает соблюдение этих лимитов во время выполнения.

Пример:

spec:
  containers:
  - name: app
    resources:
      requests:
        memory: "256Mi"
        cpu: "250m"
      limits:
        memory: "512Mi"
        cpu: "500m"

Что произойдет:

  1. Планирование: Scheduler ищет узел, на котором свободно как минимум 256Mi памяти и 250m CPU. Если такой узел есть, Pod будет запланирован на него.
  2. Выполнение: Pod запускается. Он гарантированно получит 250m CPU и 256Mi памяти.
  3. Потребление сверх requests: Контейнер может использовать до 500m CPU и 512Mi памяти, если эти ресурсы свободны на узле. Если он превысит лимит по CPU, он будет throttled (ограничен). Если превысит лимит по памяти, контейнер может быть завершен (OOMKilled).

Вывод: Нехватка ресурсов для удовлетворения limits не помешает запуску Pod. Проблема возникнет только если в момент планирования не найдется узла, удовлетворяющего requests — тогда Pod останется в статусе Pending.