Capítulo 2.5 - Scheduler
Objetivos de Aprendizagem
Ao final deste capítulo, você será capaz de:
- Compreender o papel do Scheduler
- Explicar o processo de planejamento
- Entender filtros e pontuações
- Identificar restrições de planejamento
O que é o Scheduler?
O Scheduler (kube-scheduler) é responsável por atribuir os Pods não planejados aos nodes apropriados do cluster. Ele leva em consideração restrições de recursos, afinidades e políticas.
Processo de Planejamento
Etapas do Planejamento
1. Filtragem (Filtering)
Elimina os nodes que não podem executar o Pod:
- Predicado 1: Recursos suficientes (CPU, memória)
- Predicado 2: Afinidades/anti-afinidades respeitadas
- Predicado 3: Taints e tolerations
- Predicado 4: Node selectors
2. Scoring (Priorização)
Pontua cada node elegível (0-10):
- Prioridade 1: Balanceamento de recursos
- Prioridade 2: Afinidade com outros Pods
- Prioridade 3: Localidade dos dados
- Prioridade 4: Preferências do usuário
3. Seleção
O node com a pontuação mais alta é selecionado.
Exemplo de Planejamento
Cenário
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: app
image: nginx
resources:
requests:
cpu: "500m"
memory: "512Mi"
Processo
Restrições de Planejamento
1. Recursos (Requests/Limits)
resources:
requests:
cpu: "500m"
memory: "512Mi"
limits:
cpu: "1000m"
memory: "1Gi"
O Scheduler verifica se o node possui recursos disponíveis suficientes.
2. Node Selectors
spec:
nodeSelector:
disktype: ssd
zone: us-east-1a
O Pod só será planejado em nodes com esses labels.
3. Afinidades (Affinity)
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: zone
operator: In
values:
- us-east-1a
4. Taints e Tolerations
# Taint no node
kubectl taint nodes node1 key=value:NoSchedule
# Toleration no Pod
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
Estratégias de Planejamento
Balanceamento de Recursos
O Scheduler tenta equilibrar a carga entre os nodes:
Preferências de Localidade
O Scheduler prefere planejar os Pods próximos de seus dados (afinidade de zona).
Scheduler Personalizado
Você pode criar seu próprio scheduler para necessidades específicas:
apiVersion: v1
kind: Pod
spec:
schedulerName: my-custom-scheduler
containers:
- name: app
image: nginx
Comandos Úteis
# Ver os logs do Scheduler
kubectl logs -n kube-system kube-scheduler-<node>
# Ver por que um Pod não foi planejado
kubectl describe pod <pod-name>
# Ver eventos de planejamento
kubectl get events --field-selector involvedObject.name=<pod-name>
Resumo
Neste capítulo, você aprendeu:
Scheduler: Atribui os Pods aos nodes apropriados
Processo: Filtragem → Scoring → Seleção → Bind
Restrições: Recursos, selectors, afinidades, taints
Balanceamento: Distribuição ótima da carga
Personalização: Possibilidade de schedulers personalizados
Próximos Passos
Agora que você entende o Scheduler:
Capítulo 2.6: kubelet - Agente dos Worker Nodes
Capítulo 2.7: kube-proxy
Capítulo criado em: Dezembro 2024