Manual Scheduling
Add nodeName to the pod definition file if the scheduler is not available. The nodeName can be specified at the creation time. To add nodeName to an existing pod, create an biding object.
apiVersion:v1
kind:Binding
metadata:
name:nginx
target:
apiVersion: v1
kind: Node
name: node02 //nodeName to be added
convert the yaml file into an equivalent json form
Multiple Schedulers: Custom Scheduler can be written and can be used in tandem with kube-scheduler. The default scheduler is named default-scheduler
my-scheduler-config.yaml
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: my-scheduler
//scheduler names should be different
my-scheduler.service
-- config=/etc/kubernetes/config/my-scheuler-config.yaml
Deploying custom scheduler as a pod my-custom-scheduler.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-custom-scheduler
namespace: kube-system
spec:
containers:
- command:
- kube-sceduler
- --address=127.0.0.1
- --kubeconfig=/etc/kubernetes/scheduler.conf
- --config=/etc/kubernetes/my-scheduler-config.yaml
image: k8.gcr.io/kube-scheduler-amd64:v1.11.3
name: kube-scheduler
Specify the scheduler name in a pod definition file to use the scheduler
containers:
schedulerName: my-custom-scheduler
View events
kubectl get events -o wide
View logs
kubectl logs my-custom-scheduler --namespace=kube-system
Scheduler Profiles:
Scheduling Queue
There is a scheduling queue in which pods wait to get scheduled. The pods are sorted based on the priority defined on them.
//in pod definition file
spec:
priortyClassName: high-priorty
apiVersion: v1
kind: PriortyClass
metadata:
name: high-priorty
value: 100000
globalDefault: false
decscription: "This priorty class should be used for xyz pods only."
Filter Phase
Nodes that cannot run the pods are figured out
Scoring Phase
Nodes are weighted based on different parameters
Binding phase
Pods are bound to the node base don the weights of the node
These are achieved by plugins Ex.
Scheduling Queue using Priority Queue plugin
Filtering: NodeResourcesFit, NodeName, NodeUnschedulable plugins
Scoring: NodeResourceFit, ImageLocality
Binding: DefaultBinder
There is extension point which is used to connect to the plugins
References:
https://github.com/kubernetes/community/blob/master/contributors/devel/sig-scheduling/scheduling_code_hierarchy_overview.md
https://kubernetes.io/blog/2017/03/advanced-scheduling-in-kubernetes/
https://jvns.ca/blog/2017/07/27/how-does-the-kubernetes-scheduler-work/
https://stackoverflow.com/questions/28857993/how-does-kubernetes-scheduler-work