Skip to content

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

kubectl describe pod <pod-name>

Check the Events section for scheduling errors.


Identify Which Scheduler Scheduled a Pod

kubectl get events -o wide

Look for:

  • Reason = Scheduled
  • Source column = scheduler name

Check Scheduler Logs

kubectl logs <scheduler-pod-name> -n kube-system
kubectl logs deploy/<scheduler-deployment-name> -n kube-system

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