2.11 Multiple Schedulers
-
Kubernetes uses a default scheduler to assign Pods to nodes based on resource availability, taints/tolerations, affinity rules, and placement constraints.
-
For advanced scenarios, Kubernetes is extensible and allows you to run custom schedulers with your own placement logic.
When to Use a Custom Scheduler
Use a custom scheduler only when default scheduling behavior is not sufficient.
You may need one when:
- Custom scheduling algorithms are required
- Additional placement validation is needed
- Special node selection rules must be enforced
- Certain workloads require dedicated scheduling behavior
Tip
Most workloads should continue using the default scheduler.
Multiple Scheduler Support
Kubernetes supports multiple schedulers running simultaneously.
- Default scheduler handles regular Pods
- Custom schedulers handle only Pods that reference them
- Custom schedulers are typically deployed as Pods
- They can run alongside the default scheduler
Scheduler Naming
Each scheduler must have a unique name.
| Item | Value |
|---|---|
| Default scheduler name | default-scheduler |
| Defined in | Scheduler configuration file |
| Pod field | schedulerName |
| If not specified | Default scheduler is used |
Scheduler Configuration
Default Scheduler
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: default-scheduler
Custom Scheduler
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: my-scheduler
Pod Using a Custom Scheduler
A Pod selects a scheduler using the schedulerName field.
apiVersion: v1
kind: Pod
metadata:
name: custom-scheduled-pod
spec:
schedulerName: my-scheduler
containers:
- name: nginx
image: nginx
Only Pods that specify this field will be handled by the custom scheduler.
Deploying a Custom Scheduler (kubeadm)
In kubeadm clusters, control plane components run as Pods.
You can deploy an additional scheduler as a Pod running the kube-scheduler binary.
Required Arguments
| Flag | Purpose |
|---|---|
--kubeconfig |
API server authentication |
--config |
Scheduler configuration file |
Custom Scheduler Pod Example
apiVersion: v1
kind: Pod
metadata:
name: my-custom-scheduler
namespace: kube-system
spec:
containers:
- name: kube-scheduler
image: k8s.gcr.io/kube-scheduler-amd64:v1.xx.x
command:
- kube-scheduler
- --address=127.0.0.1
- --kubeconfig=/etc/kubernetes/scheduler.conf
- --config=/etc/kubernetes/my-scheduler-config.yaml
Leader Election (HA Clusters)
Leader election is required when running scheduler replicas across multiple control-plane nodes.
Warning
Without leader election, multiple schedulers may try to schedule the same Pod.
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: my-scheduler
leaderElection:
leaderElect: true
resourceNamespace: kube-system
resourceName: lock-object-my-scheduler
Troubleshooting Custom Scheduler Issues
If a custom scheduler is not running or misconfigured, Pods using it will remain in Pending state.
Check Pod Scheduling Details
Check the Events section for scheduling errors.
Identify Which Scheduler Scheduled a Pod
Look for:
- Reason =
Scheduled - Source column = scheduler name
Check Scheduler Logs
Command Reference
kubectl describe pod <pod-name>
kubectl get events -o wide
kubectl logs <scheduler-pod-name> -n kube-system
Summary
- Default scheduler handles most workloads
- Custom schedulers support specialized placement logic
- Multiple schedulers can run together
- Each scheduler requires a unique name
- Pods select schedulers using
schedulerName - Enable leader election in HA setups
- Use describe, events, and logs for troubleshooting