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