笔记:kubernetes,scheduler,framework,plugins

阅读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 包含系统内所有可用的插件
  • config.Plugins 插件列表,包括启用哪些插件,禁用哪些插件等
  • config.PluginConfig插件的配置,

对于第一个参数(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 {

你可能感兴趣的:(kubernetes)