Skip to main content

Scheduling

Scheduling inside Kubernetes, is the part of the master Node (he has the responsibility for scheduling workload).

Kubernetes has one job...​

starting Pods on Nodes​

But to so this, a lot of decisions have to be made (enough resources, policies in the cluster).

Scheduling in Kubernetes​

Scheduler is the process of selecting a node to start a Pod on inside of our Clutser

  • Selecting a Node to start a Pod on - one of the core components in the master node
  • kube-scheduler - this is the default scheduler
  • you can create our own scheduler

The goal of Scheduling​

Is find the best, most feasible node in the cluster to run a pod.

To make this decisions, he have two things:

  • Resources - cpu, memory, storage
  • Policy - ex: two Pod on different nodes or zones

Scheduling Process​

scheduling process

Node Selection​

Let's look more closely on the node selection process.

The node selection have 3 phases:

  • Filetering - remove node that cannot run our pod
    • From all the nodes
    • Apply filters
    • Filtered Nodes
    • Hard constraints - pod spec, node resources, etc...
    • If no node is found, the pod is unscheduable and will fail scheduling
  • Scoring - process of yielding a list of eligible nodes
    • Scoring function - Start from the filtered list
    • Feasible Nodes
    • Policu constraints - image on the node, etc...
    • Find the best node to run our pod
  • Binding - updating the node name in our pods object
    • Selected Nodes List - the highest priority nodes
    • Ties are broken - if they are multiple nodes, a random was selected
    • Update API Object

Resources Request​

Resource are important in the process of shoosing a node

  • Setting requests will cause the scheduler to find a Node to fit the workload/Pod
    • requests are guarantees
    • CPU
    • Memory
  • Allocatable resources per Node
  • Pods that need to be scheduled but there not enough resources available will go Pending

Demo 1​

Finding scheduling information

#Let's create a deployment with three replicas
kubectl apply -f deployment.yaml

#Pods spread out evenly across the Nodes due to our scoring functions for selector spread during Scoring.
kubectl get pods -o wide

#We can look at the Pods events to see the scheduler making its choice
kubectl describe pods

#If we scale our deployment to 6...
kubectl scale deployment hello-world --replicas=6

#We can see that the scheduler works to keep load even across the nodes.
kubectl get pods -o wide

#We can see the nodeName populated for this node
kubectl get pods hello-world-[tab][tab] -o yaml

#Clean up this demo...and delete its resources
kubectl delete deployment hello-world

Demo 2​

Scheduling Pods with resource requests.

#Start a watch, the pods will go from Pending->ContainerCreating->Running
#Each pod has a 1 core CPU request.
kubectl get pods --watch &
kubectl apply -f requests.yaml

#We created three pods, one but one is not starting...
kubectl get pods -o wide

#Let's scale our deployment to 6 replica. These pods will stay pending. Some pod names may be repeated.
kubectl scale deployment hello-world-requests --replicas=6

#We see that three Pods are pending...why?
kubectl get pods -o wide
kubectl get pods -o wide | grep Pending

#Let's look at why the Pod is Pending...check out the Pod's events...
kubectl describe pods

#Now let's look at the node's Allocations...we've allocated 62% of our CPU...
#1 User pod using 1 whole CPU, one system Pod using 250 millicores of a CPU and
#looking at allocatable resources, we have only 2 whole Cores available for use.
#The next pod coming along wants 1 whole core, and tha'ts not available.
#The scheduler can't find a place in this cluster to place our workload...is this good or bad?
kubectl describe node c1-node1

#Clean up after this demo
kubectl delete deployment hello-world-requests

#stop the watch
fg
ctrl+c