Ответ
В Kubernetes kube-scheduler — это контрольный плоскостной компонент, который отвечает за выбор оптимального узла (Node) для запуска нового или не запланированного ещё пода (Pod). Его основная задача — эффективно распределять нагрузку по кластеру, учитывая требования подов и доступность ресурсов.
Как именно он работает (на примере развёртывания Deployment):
- Пользователь создаёт объект (например, Deployment).
- Контроллер Deployment создаёт Pod-объект, у которого в спецификации ещё нет поля
nodeName— такой Pod считается незапланированным (Pending). kube-schedulerзамечает новый незапланированный Pod.- Фаза фильтрации (Filtering): Планировщик отфильтровывает все узлы, которые не подходят под требования Pod (недостаточно CPU/памяти, несовпадение nodeSelector, taints/tolerations, отсутствие нужного PVC и т.д.). Остаются подходящие узлы.
- Фаза оценки (Scoring): Планировщик оценивает каждый подходящий узел по ряду критериев (например, балансировка ресурсов, spread по зонам доступности, affinity/anti-affinity правила) и присваивает ему итоговый балл.
- Выбор узла: Узел с наивысшим баллом выбирается для запуска Pod. Планировщик записывает имя этого узла (
nodeName) в спецификацию Pod. - Назначение:
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).
Видео-ответы
▶
▶
▶
▶
▶
▶
▶