Что такое планировщик (Scheduler) в Kubernetes?

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

Ответ

В Kubernetes kube-scheduler — это контрольный плоскостной компонент, который отвечает за выбор оптимального узла (Node) для запуска нового или не запланированного ещё пода (Pod). Его основная задача — эффективно распределять нагрузку по кластеру, учитывая требования подов и доступность ресурсов.

Как именно он работает (на примере развёртывания Deployment):

  1. Пользователь создаёт объект (например, Deployment).
  2. Контроллер Deployment создаёт Pod-объект, у которого в спецификации ещё нет поля nodeName — такой Pod считается незапланированным (Pending).
  3. kube-scheduler замечает новый незапланированный Pod.
  4. Фаза фильтрации (Filtering): Планировщик отфильтровывает все узлы, которые не подходят под требования Pod (недостаточно CPU/памяти, несовпадение nodeSelector, taints/tolerations, отсутствие нужного PVC и т.д.). Остаются подходящие узлы.
  5. Фаза оценки (Scoring): Планировщик оценивает каждый подходящий узел по ряду критериев (например, балансировка ресурсов, spread по зонам доступности, affinity/anti-affinity правила) и присваивает ему итоговый балл.
  6. Выбор узла: Узел с наивысшим баллом выбирается для запуска Pod. Планировщик записывает имя этого узла (nodeName) в спецификацию Pod.
  7. Назначение: kubelet на выбранном узле замечает, что ему назначен новый Pod, и запускает его контейнеры.

Практический пример: Запуск пода с требованиями к ресурсам и метками.

apiVersion: v1
kind: Pod
metadata:
  name: data-processor
spec:
  containers:
  - name: app
    image: myapp:latest
    resources:
      requests:
        memory: "512Mi"
        cpu: "250m"
      limits:
        memory: "1Gi"
        cpu: "500m"
  nodeSelector:
    disktype: ssd # Запускать только на узлах с этой меткой
  tolerations:
  - key: "dedicated"
    operator: "Equal"
    value: "data"
    effect: "NoSchedule"

Здесь планировщик будет искать узлы, которые: а) имеют свободные 512Mi памяти и 0.25 CPU, б) помечены меткой disktype: ssd, в) допускают Pod с toleration для taint dedicated=data:NoSchedule.

Настройка и расширение:

  • Профили планировщика (Scheduler Profiles): Можно настраивать приоритет различных политик (например, LeastAllocated, BalancedResourceAllocation).
  • Pod Priority и Preemption: Поды с высоким приоритетом могут вытеснять (preempt) низкоприоритетные поды с узла, если для них не хватает ресурсов.
  • Планировщики по умолчанию и кастомные: Можно запускать несколько планировщиков и указывать для Pod, какой из них использовать (spec.schedulerName).