调度器介绍
scheduler 是k8s master的一部分,作为插件存在于k8s生态体系。
自定义调度器方式
- 添加功能重新编译
- 实现自己的调度器(multi-scheduler)
- scheduler调用扩展程序实现最终调度(Kubernetes scheduler extender)
添加调度功能
k8s中的调度算法介绍
实现自己的调度器(配置多个scheduler)
scheduler以插件形式存在,集群中可以存在多个scheduler,可以显式指定scheduler
配置pod使用自己的调度器
下面pod显式指定使用my-scheduler调度器
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
schedulerName: my-scheduler
containers:
- name: nginx
image: nginx:1.10
官方给出的shell版本scheduler示例
#!/bin/bash
SERVER='localhost:8001'
while true;
do
for PODNAME in $(kubectl --server $SERVER get pods -o json | jq '.items[] | select(.spec.schedulerName == "my-scheduler") | select(.spec.nodeName == null) | .metadata.name' | tr -d '"')
;
do
NODES=($(kubectl --server $SERVER get nodes -o json | jq '.items[].metadata.name' | tr -d '"'))
NUMNODES=${#NODES[@]}
CHOSEN=${NODES[$[ $RANDOM % $NUMNODES ]]}
curl --header "Content-Type:application/json" --request POST --data '{"apiVersion":"v1", "kind": "Binding", "metadata": {"name": "'$PODNAME'"}, "target": {"apiVersion": "v1", "kind"
: "Node", "name": "'$CHOSEN'"}}' http://$SERVER/api/v1/namespaces/default/pods/$PODNAME/binding/
echo "Assigned $PODNAME to $CHOSEN"
done
sleep 1
done
影响pod调度的因素
https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/
预选
过滤不符合运行条件的node
优选
对node进行打分
抢占
Kubernetes 1.8 及其以后的版本中可以指定 Pod 的优先级。优先级表明了一个 Pod 相对于其它 P