阅读kubernetes调度代码的时候,看到这个pacakge:
pkg/scheduler/framework
网上相关的资料很少,废了老半天的劲儿终于找到,这里记录一下
scheduler framework
https://github.com/kubernetes/enhancements/blob/master/keps/sig-scheduling/20180409-scheduling-framework.md
这块儿的目录结构如下
../framework/
├── BUILD
├── plugins #系统中所有的调度插件,不同类型的调度插件需要实现不同的接口,接口的定义在interface.go中
│ ├── BUILD
│ ├── default_registry.go #基于
│ ├── default_registry_test.go
│ ├── defaultpodtopologyspread
│ ├── examples
│ ├── imagelocality
│ ├── interpodaffinity
│ ├── migration
│ ├── nodeaffinity
│ ├── nodelabel
│ ├── nodename
│ ├── nodeports
│ ├── nodepreferavoidpods
│ ├── noderesources
│ ├── nodeunschedulable
│ ├── nodevolumelimits
│ ├── podtopologyspread
│ ├── requestedtocapacityratio
│ ├── serviceaffinity
│ ├── tainttoleration
│ ├── volumebinding
│ ├── volumerestrictions
│ └── volumezone
└── v1alpha1
├── BUILD
├── cycle_state.go
├── cycle_state_test.go
├── framework.go #具体的一个Framework,通过NewFramework构造,实现了interface.go中定义的接口
├── framework_test.go
├── interface.go
├── interface_test.go
├── metrics_recorder.go
├── registry.go
├── registry_test.go
└── waiting_pods_map.go
这里需要注意的是,构建一个Framework大致需要三个信息
NewFramework(r Registry, plugins *config.Plugins, args []config.PluginConfig, opts ...Option)
对于第一个参数(Registry),在default_registry.go中提供了一个方法
NewDefaultRegistry
对于后两个参数,提供了一个factory,
// ConfigProducer produces a framework's configuration.
type ConfigProducer func(args ConfigProducerArgs) (config.Plugins, []config.PluginConfig)
该factory可以构造插件的配置,和对应的插件参数。
对应的有一个默认的ProducerRegistry构造函数
NewDefaultConfigProducerRegistry
目前基于Framework的调度方案和之前老的调度方式都有在用
// NewGenericScheduler creates a genericScheduler object.
func NewGenericScheduler(
cache internalcache.Cache,
podQueue internalqueue.SchedulingQueue,
predicates map[string]predicates.FitPredicate, #predicate列表 老的
predicateMetaProducer predicates.MetadataProducer,
prioritizers []priorities.PriorityConfig, #prioritizer列表 老的
priorityMetaProducer priorities.MetadataProducer,
nodeInfoSnapshot *nodeinfosnapshot.Snapshot,
framework framework.Framework, #新的基于Framework的机制
extenders []algorithm.SchedulerExtender,
volumeBinder *volumebinder.VolumeBinder,
pvcLister corelisters.PersistentVolumeClaimLister,
pdbLister policylisters.PodDisruptionBudgetLister,
alwaysCheckAllPredicates bool,
disablePreemption bool,
percentageOfNodesToScore int32,
enableNonPreempting bool) ScheduleAlgorithm {