Что планирует планировщик (kube-scheduler) в Kubernetes?

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

Ответ

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

Процесс планирования состоит из двух этапов:

  1. Фильтрация (Filtering): Планировщик отфильтровывает узлы, которые не подходят для пода.

    • Проверка ресурсов: Достаточно ли на узле CPU и памяти (с учетом requests/limits пода).
    • Проверка условий: Соответствует ли узел правилам nodeSelector, nodeAffinity. Не мешают ли taints (если у пода нет matching tolerations).
    • Другие фильтры: Проверка соответствия портов, объема PVC и т.д.
  2. Оценка (Scoring): Оставшимся подходящим узлам выставляются баллы. Узел с наивысшим баллом выбирается для запуска пода.

    • Распределение нагрузки: Предпочтение отдается узлам с меньшей загрузкой (например, по остатку CPU/памяти), чтобы балансировать нагрузку в кластере.
    • Правила affinity/anti-affinity: Узлы, где уже работают "родственные" пода (по podAffinity), могут получить более высокий балл. И наоборот, для podAntiAffinity.

Пример манифеста с привязкой к узлу:

apiVersion: v1
kind: Pod
metadata:
  name: database-pod
spec:
  containers:
  - name: postgres
    image: postgres:15
    resources:
      requests:
        memory: "512Mi"
        cpu: "250m"
  nodeSelector: # Фильтр для планировщика
    storage: ssd
  affinity: # Правило для фазы оценки
    nodeAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: topology.kubernetes.io/zone
            operator: In
            values:
            - zone-a

В этом примере планировщик сначала выберет только узлы с меткой storage=ssd, а затем среди них отдаст предпочтение узлам в зоне zone-a.