# Configure Scheduler ## Build scheduler image In this demo, I use the default scheduler (kube-scheduler) as our second scheduler just for testing purpose. Clone the Kubernetes source code from GitHub and build the source: ```bash= git clone https://github.com/kubernetes/kubernetes.git cd kubernetes make ``` Create a container image containing the `kube-scheduler` binary: ```dockerfile= FROM busybox ADD ./_output/local/bin/linux/amd64/kube-scheduler /usr/local/bin/kube-scheduler ``` Save the file as Dockerfile, build the image and push it to a registry ```bash= docker build -t wxr031/myscheduler:latest docker push wxr031/myscheduler:latest ``` ## Deploy scheduler Now that we have our scheduler in a container image, we can just create a deployment configuration file and deploy it into our Kubernetes cluster. ```yaml= apiVersion: v1 kind: ServiceAccount metadata: name: my-scheduler namespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: my-scheduler-as-kube-scheduler subjects: - kind: ServiceAccount name: my-scheduler namespace: kube-system roleRef: kind: ClusterRole name: system:kube-scheduler apiGroup: rbac.authorization.k8s.io --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: my-scheduler-as-volume-scheduler subjects: - kind: ServiceAccount name: my-scheduler namespace: kube-system roleRef: kind: ClusterRole name: system:volume-scheduler apiGroup: rbac.authorization.k8s.io --- apiVersion: apps/v1 kind: Deployment metadata: labels: component: scheduler tier: control-plane name: my-scheduler namespace: kube-system spec: selector: matchLabels: component: scheduler tier: control-plane replicas: 1 template: metadata: labels: component: scheduler tier: control-plane version: second spec: serviceAccountName: my-scheduler containers: - command: - /usr/local/bin/kube-scheduler - --address=0.0.0.0 - --leader-elect=false - --scheduler-name=my-scheduler image: wxr031/myscheduler:latest livenessProbe: httpGet: path: /healthz port: 10251 initialDelaySeconds: 15 name: kube-second-scheduler readinessProbe: httpGet: path: /healthz port: 10251 resources: requests: cpu: '0.1' securityContext: privileged: false volumeMounts: [] hostNetwork: false hostPID: false volumes: [] ``` :::info The name of the scheduler specified as an argument to the scheduler in your configuration file should be `spec.schedulerName` ::: Now, deploy the scheduler using `kubectl` ```bash= kubectl create -f my-scheduler.yaml ``` Validate that the pod is running ```bash= kubectl get pods -n kube-system ``` ## Check that the pod is using your scheduler In order to schedule a given pod using a specific scheduler, we specify the name of the scheduler in that pod spec. Let's look at two examples: 1. Pod without any scheduler name ```yaml= apiVersion: v1 kind: Pod metadata: name: no-annotation labels: name: multischeduler-example spec: containers: - name: pod-with-no-annotation-container image: k8s.gcr.io/pause:2.0 ``` When no scheduler name is supplied, the pod is automatically scheduled using the *default-scheduler*. 2. Pod without any scheduler name ```yaml= apiVersion: v1 kind: Pod metadata: name: pod-with-my-scheduler labels: name: multischeduler-example namespace: kube-system spec: schedulerName: my-scheduler containers: - name: pod-with-my-scheduler-container image: k8s.gcr.io/pause:2.0 ``` To verify that the pods were actually scheduled using the desired schedulers, we can verify that by changing the order of pod and scheduler submissions. If we deploy pod first before submitting scheduler, we should that the pod `pod-with-my-scheduler-container` remains in `Pending` state forever. ``` $ kubectl apply -f pod.yaml $ kubectl get pods -n kube-system annotation-second-scheduler 0/1 Pending 0 47s calico-node-2pnlr 1/1 Running 1496 88d calico-node-4tz8c 1/1 Running 804 88d calico-node-dvzld 1/1 Running 804 88d ... ``` $ kubectl apply -f pod1.yaml $ kubectl get pods -n kube-system Once we submit the scheduler deployment configuration, our new scheduler starts running, and the annotation-second-scheduler pod gets scheduled as well. ``` $ kubectl apply -f myscheduler.yaml $ kubectl apply -f pod.yaml $ kubectl get pods -n kube-system annotation-second-scheduler 1/1 Running 0 12s calico-node-2pnlr 1/1 Running 1496 88d calico-node-4tz8c 1/1 Running 804 88d calico-node-dvzld 1/1 Running 804 88d 1/1 ... my-scheduler-754f9d4bf6-8xr7f 1/1 Running 0 59s ```