k8s越来越像一个框架,然后把各种扩展能力留给开发者。开发者可以基于这些接口,结合自己的业务场景,实现自己的场景需求。其中,kubescheduler就充分体现了这一特点。kubescheduler本身的介绍可以参考上一篇。今天要介绍的是如何给scheduler添加一个schedulingplugin。我们首先通过yaml:kubescheduler.config.k8s.io/v1beta1kind:KubeSchedulerConfigurationclientConnection:kubeconfig:"/etc/kubernetes/scheduler.conf"profiles:-schedulerName:default-schedulerplugins:score:enabled:-name:HelloWorldPlugindisabled来定义这个插件APIVersion:-name:"*"pluginConfig:-name:HelloWorldPluginargs:xxx:"xxx"yyy:"123"zzz:3我们定义了一个HelloWorldPlugin插件,并定义了这个插件的启动参数。然后需要修改kubescheduler启动参数,通过--config指定上面的配置文件。接下来,我们需要实现这个插件。调度程序通过对每个插件进行评分来确定调度的主机。所以我们需要实现一个评分接口typeScorePlugininterface{Plugin//ScoreScore(ctxcontext.Context,state*CycleState,p*v1.Pod,nodeNamestring)(int64,*Status)ScoreExtensions()ScoreExtensions}typeScoreExtensionsinterface{//Score归一化NormalizeScore(ctxcontext.Context,state*CycleState,p*v1.Pod,scoresNodeScoreList)*Status}这个接口我们根据自己的业务需要来实现,比如下面的例子,基于主机网络带宽调度:首先,获取网络流量主机通过promethues,并根据网络流量的大小进行评分。func(n*HelloWorldPlugin)Score(ctxcontext.Context,state*framework.CycleState,p*v1.Pod,nodeNamestring)(int64,*framework.Status){nodeBandwidth,err:=n.prometheus.GetNodeBandwidthMeasure(nodeName)iferr!=nil{return0,framework.NewStatus(framework.Error,fmt.Sprintf("errorgettingnodebandwidthmeasure:%s",err))}klog.Infof("[NetworkTraffic]node'%s'带宽:%s",nodeName,nodeBandwidth.func(n*HelloWorldPlugin)NormalizeScore(ctxcontext.Context,state*framework.CycleState,pod*v1.Pod,scoresframework.NodeScoreList)*framework.Status{fori,node:=rangescores{分数[i].Score=framework.MaxNodeScore-(node.Score*framework.MaxNodeScore/higherScore)}klog.Infof([NetworkTraffic]Nodesfinalscore:%v",scores)returnnil}这样一个简单的基于网络流量调度的插件就实现了。
