O kube-scheduler decide em qual node cada pod será executado, baseado em recursos disponíveis, afinidades, taints e políticas customizadas.
Conceito Geral
- Scheduler monitora pods sem node atribuído (Pending)
- Filtra nodes que atendem os requisitos (CPU, memória, taints)
- Pontua nodes restantes usando algoritmos de score
- Atribui o pod ao node com maior pontuação
Pod criado (Pending)
↓
kube-scheduler detecta
↓
Fase de Filtragem (Predicates)
↓
Nodes viáveis
↓
Fase de Pontuação (Priorities)
↓
Node com maior score
↓
Pod atribuído ao node (Binding)
↓
kubelet inicia o pod
Verificar Status do Scheduler
kubectl get pods -n kube-system | grep scheduler
kubectl logs -n kube-system kube-scheduler-master01
Custom Scheduler Profile
# /etc/kubernetes/scheduler-config.yaml
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: default-scheduler
plugins:
score:
enabled:
- name: NodeResourcesBalancedAllocation
weight: 1
- name: ImageLocality
weight: 1
Aplicar Configuração
# Adicionar ao kube-scheduler.yaml
--config=/etc/kubernetes/scheduler-config.yaml
Verificar Eventos de Scheduling
kubectl get events --sort-by='.lastTimestamp' | grep -i schedule
kubectl describe pod <pod-name> | grep -A 10 Events
Node Affinity e Taints
# Adicionar taint ao node
kubectl taint nodes node01 key=value:NoSchedule
# Remover taint
kubectl taint nodes node01 key=value:NoSchedule-
# Listar taints
kubectl describe node node01 | grep Taints
Priority Classes
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority
value: 1000000
globalDefault: false
description: "High priority class"
kubectl apply -f priority-class.yaml
Debugging Scheduler
# Ver decisões de scheduling
kubectl get events --field-selector involvedObject.kind=Pod
# Scheduler metrics
kubectl get --raw /metrics | grep scheduler_
Múltiplos Schedulers
# Pod com scheduler customizado
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
schedulerName: my-custom-scheduler
containers:
- name: app
image: nginx