共计 3737 个字符,预计需要花费 10 分钟才能阅读完成。
这篇文章主要介绍“怎么对 kubernetes scheduler 进行二次开发”,在日常操作中,相信很多人在怎么对 kubernetes scheduler 进行二次开发问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么对 kubernetes scheduler 进行二次开发”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!
通过新增 Predicates Priorities Policies 来扩展 default scheduler 新增 Predicate Policy
predicate Interface
plugin/pkg/scheduler/algorithm/types.go:31
// FitPredicate is a function that indicates if a pod fits into an existing node.
// The failure information is given by the error.
type FitPredicate func(pod *v1.Pod, meta interface{}, nodeInfo *schedulercache.NodeInfo) (bool, []PredicateFailureReason, error)
Implement a predicate func
func PodFitsHostNew(pod *v1.Pod, meta interface{}, nodeInfo *schedulercache.NodeInfo) (bool, []algorithm.PredicateFailureReason, error) {if len(pod.Spec.NodeName) == 0 {
return true, nil, nil
node := nodeInfo.Node()
if node == nil {return false, nil, fmt.Errorf( node not found)
if pod.Spec.NodeName == node.Name {
return true, nil, nil
return false, []algorithm.PredicateFailureReason{ErrPodNotMatchHostName}, nil
}
register the custom predicate policy with a custom name
plugin/pkg/scheduler/algorithmprovider/defaults/defaults.go:47
func init() {factory.RegisterAlgorithmProvider(factory.DefaultProvider, defaultPredicates(), defaultPriorities())
// Cluster autoscaler friendly scheduling algorithm.
factory.RegisterAlgorithmProvider(ClusterAutoscalerProvider, defaultPredicates(),
copyAndReplace(defaultPriorities(), LeastRequestedPriority , MostRequestedPriority ))
factory.RegisterFitPredicate(CustomPredicatePolicy , predicates.PodFitsHostNew)
}
rebuild kube-scheduler and restart with flag of –policy-config-file
kube-scheduler xxxx –policy-config-file=/var/lib/kube-scheduler/policy.config
the content of –policy-config-file specified file
/var/lib/kube-scheduler/policy.config
kind : Policy ,
apiVersion : v1 ,
predicates : [ { name : CustomPredicatePolicy}
],
priorities : [ ]
}
新增 Priority Policy
Priority Interface
/Users/garnett/workspace/go/src/k8s.io/kubernetes/plugin/pkg/scheduler/algorithm/types.go
// PriorityMapFunction is a function that computes per-node results for a given node.
type PriorityMapFunction func(pod *v1.Pod, meta interface{}, nodeInfo *schedulercache.NodeInfo) (schedulerapi.HostPriority, error)
Implement a predicate func
register the custom predicate policy with a custom name
rebuild kube-scheduler and restart with flag of –policy-config-file
the content of –policy-config-file specified file
/var/lib/kube-scheduler/policy.config
kind : Policy ,
apiVersion : v1 ,
predicates : [ ],
priorities : [ { name : CumtomPriorityPolicy , weight : 1}
]
}
新增 custom scheduler,pod 指定 scheduler-name 进行调度
A custom scheduler can be written in any language and can be as simple or complex as you need.
Specify the“scheduleName”in pod.spec
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
schedulerName: my-scheduler
containers:
- name: nginx
image: nginx:1.10
Here is a very simple example of a custom scheduler written in Bash that assigns a node randomly. Note that you need to run this along with kubectl proxy for it to work.
kubectl proxy –port=8001
#!/bin/bash
SERVER= localhost:8001
while true;
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
到此,关于“怎么对 kubernetes scheduler 进行二次开发”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!