如果默认的调度器不满足要求,还可以部署自定义的调度器。并且,在整个集群中还可以同时运行多个调度器实例,通过 pod.Spec.schedulerName 来选择使用哪一个调度器(默认使用内置的调度器)。

开发自定义调度器

自定义调度器主要的功能是查询未调度的 Pod,按照自定义的调度策略选择新的 Node,并将其更新到 Pod 的 Node Binding 上。

比如,一个最简单的调度器可以用 shell 来编写(假设已经启动 kubectl proxy 并监听在 localhost:8001):

  1. #!/bin/bash
  2. SERVER='localhost:8001'
  3. while true;
  4. do
  5. 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 '"')
  6. ;
  7. do
  8. NODES=($(kubectl --server $SERVER get nodes -o json | jq '.items[].metadata.name' | tr -d '"'))
  9. NUMNODES=${#NODES[@]}
  10. CHOSEN=${NODES[$[ $RANDOM % $NUMNODES]]}
  11. curl --header "Content-Type:application/json" --request POST --data '{"apiVersion":"v1","kind":"Binding","metadata": {"name":"'$PODNAME'"},"target": {"apiVersion":"v1","kind"
  12. : "Node", "name": "'$CHOSEN'"}}' http://$SERVER/api/v1/namespaces/default/pods/$PODNAME/binding/
  13. echo "Assigned $PODNAME to $CHOSEN"
  14. done
  15. sleep 1
  16. done

使用自定义调度器

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: nginx
  5. labels:
  6. app: nginx
  7. spec:
  8. # 选择使用自定义调度器 my-scheduler
  9. schedulerName: my-scheduler
  10. containers:
  11. - name: nginx
  12. image: nginx:1.10