Volcano配置
apiVersion: v1 kind: ConfigMap metadata:name: volcano-scheduler-configmapnamespace: volcano-system data:volcano-scheduler.conf: |actions: "enqueue, allocate, backfill"tiers:- plugins:- name: priority- name: gang- name: conformance- plugins:- name: drf- name: predicates- name: proportion- name: nodeorder- name: binpack
actions
actions表示调度需要执行的动作。
Volcano每次调度会创建一个session,并按actions中配置的动作依次执行。
每个action里都设定好了执行逻辑,里面会调用session上的处理函数(xxxFn),这些函数都是由各个插件添加的。执行顺序参考tiers的配置。
// runOnce executes a single scheduling cycle. This function is called periodically // as defined by the Scheduler's schedule period. func (pc *Scheduler) runOnce() {klog.V(4).Infof("Start scheduling ...")scheduleStartTime := time.Now()defer klog.V(4).Infof("End scheduling ...")pc.mutex.Lock()actions := pc.actionsplugins := pc.pluginsconfigurations := pc.configurationspc.mutex.Unlock()// Load ConfigMap to check which action is enabled.conf.EnabledActionMap = make(map[string]bool)for _, action := range actions {conf.EnabledActionMap[action.Name()] = true}ssn := framework.OpenSession(pc.cache, plugins, configurations)defer func() {framework.CloseSession(ssn)metrics.UpdateE2eDuration(metrics.Duration(scheduleStartTime))}()for _, action := range actions {actionStartTime := time.Now()action.Execute(ssn)metrics.UpdateActionDuration(action.Name(), metrics.Duration(actionStartTime))} }
tiers
上面配置中的tiers里有两个数组,在每个action里执行插件处理的时候,会按照tiers里定义的数组顺序以及组里插件顺序进行。
Volcano代码示例:
func (ssn *Session) JobOrderFn(l, r interface{}) bool {for _, tier := range ssn.Tiers {for _, plugin := range tier.Plugins {if !isEnabled(plugin.EnabledJobOrder) {continue}jof, found := ssn.jobOrderFns[plugin.Name]if !found {continue}if j := jof(l, r); j != 0 {return j < 0}}}// If no job order funcs, order job by CreationTimestamp first, then by UID.lv := l.(*api.JobInfo)rv := r.(*api.JobInfo)if lv.CreationTimestamp.Equal(&rv.CreationTimestamp) {return lv.UID < rv.UID}return lv.CreationTimestamp.Before(&rv.CreationTimestamp) }