Ответ
Планировщик Kubernetes (kube-scheduler) отвечает за выбор узла (Node) для запуска незапланированного пода (Pod). Он не управляет контейнерами внутри пода, а именно определяет, на какой физической или виртуальной машине этот под будет работать.
Процесс планирования состоит из двух этапов:
-
Фильтрация (Filtering): Планировщик отфильтровывает узлы, которые не подходят для пода.
- Проверка ресурсов: Достаточно ли на узле CPU и памяти (с учетом requests/limits пода).
- Проверка условий: Соответствует ли узел правилам
nodeSelector,nodeAffinity. Не мешают лиtaints(если у пода нет matchingtolerations). - Другие фильтры: Проверка соответствия портов, объема PVC и т.д.
-
Оценка (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.