Chapter 2.5 - Scheduler
Learning Objectives
By the end of this chapter, you will be able to:
- Understand the role of the Scheduler
- Explain the scheduling process
- Understand filters and scores
- Identify scheduling constraints
What is the Scheduler?
The Scheduler (kube-scheduler) is responsible for assigning unscheduled Pods to the appropriate nodes in the cluster. It considers resource constraints, affinities, and policies.
Scheduling Process
Scheduling Steps
1. Filtering
Eliminates nodes that cannot run the Pod:
- Predicate 1: Sufficient resources (CPU, memory)
- Predicate 2: Affinities/anti-affinities respected
- Predicate 3: Taints and tolerations
- Predicate 4: Node selectors
2. Scoring (Prioritization)
Rates each eligible node (0-10):
- Priority 1: Resource balancing
- Priority 2: Affinity with other Pods
- Priority 3: Data locality
- Priority 4: User preferences
3. Selection
The node with the highest score is selected.
Scheduling Example
Scenario
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: app
image: nginx
resources:
requests:
cpu: "500m"
memory: "512Mi"
Process
Scheduling Constraints
1. Resources (Requests/Limits)
resources:
requests:
cpu: "500m"
memory: "512Mi"
limits:
cpu: "1000m"
memory: "1Gi"
The Scheduler checks that the node has enough available resources.
2. Node Selectors
spec:
nodeSelector:
disktype: ssd
zone: us-east-1a
The Pod will only be scheduled on nodes with these labels.
3. Affinities
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: zone
operator: In
values:
- us-east-1a
4. Taints and Tolerations
# Taint on the node
kubectl taint nodes node1 key=value:NoSchedule
# Toleration in the Pod
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
Scheduling Strategies
Resource Balancing
The Scheduler tries to balance the load between nodes:
Locality Preferences
The Scheduler prefers to schedule Pods close to their data (zone affinity).
Custom Scheduler
You can create your own scheduler for specific needs:
apiVersion: v1
kind: Pod
spec:
schedulerName: my-custom-scheduler
containers:
- name: app
image: nginx
Useful Commands
# View Scheduler logs
kubectl logs -n kube-system kube-scheduler-<node>
# See why a Pod is not scheduled
kubectl describe pod <pod-name>
# View scheduling events
kubectl get events --field-selector involvedObject.name=<pod-name>
Summary
In this chapter, you learned:
Scheduler: Assigns Pods to appropriate nodes
Process: Filtering → Scoring → Selection → Bind
Constraints: Resources, selectors, affinities, taints
Balancing: Optimal load distribution
Customization: Custom schedulers possible
Next Steps
Now that you understand the Scheduler:
Chapter 2.6: kubelet - Worker Nodes Agent
Chapter 2.7: kube-proxy
Chapter created on: December 2024