Что такое Kubernetes Scheduler и как он работает?

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

Ответ

Kubernetes Scheduler (kube-scheduler) — это компонент control plane, который отвечает за выбор узла (Node) для запуска непомеченных (unscheduled) подов (Pods). Его основная задача — найти подходящий узел для каждого нового пода с учетом требований к ресурсам, политик размещения и ограничений кластера.

Алгоритм работы состоит из двух основных этапов:

  1. Фильтрация (Filtering/Predicates): Scheduler отфильтровывает узлы, которые не удовлетворяют требованиям пода (например, недостаточно CPU/RAM, несоответствие nodeSelector, нарушение taints/tolerations).
  2. Оценка (Scoring/Priorities): Оставшимся подходящим узлам выставляются баллы по различным критериям (например, балансировка нагрузки, доступность ресурсов, близость к данным). Узел с наивысшим баллом выбирается для размещения пода.

Пример манифеста пода с ограничениями для Scheduler:

apiVersion: v1
kind: Pod
metadata:
  name: data-processor
spec:
  containers:
  - name: processor
    image: myapp:latest
    resources:
      requests:
        memory: "512Mi"
        cpu: "500m"
      limits:
        memory: "1Gi"
        cpu: "1"
  nodeSelector: # Пода можно разместить только на узлах с этим лейблом
    accelerator: gpu
  affinity: # Предпочтение размещения рядом с другими подами
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - cache
        topologyKey: kubernetes.io/hostname
  tolerations: # Пода может быть размещен на "загрязненных" узлах
  - key: "special-node"
    operator: "Equal"
    value: "true"
    effect: "NoSchedule"

На практике мы настраивали custom scheduler для workload'ов с особыми требованиями к размещению (например, для пакетных заданий машинного обучения), который учитывал наличие специфического оборудования на узлах.