本文是对Kubernetes 1.5的Scheduler源码层面的剖析,包括对应的源码目录结构分析、kube-scheduler运行机制分析、整体代码流程图、核心代码走读分析等内容。阅读本文前,请先了解
kubernetes scheduler原理解析
。
Kubernetes源码目录结构分析
Kubernetes Scheduler是作为kubernetes的一个plugin来设计的,这种可插拔的设计极大方便用户自定义调度算法,在不同的公司,通常大家对调度的需求是不同的,自定义调度是很常见的。
Scheduler的源码主要在
k8s.io/kubernetes/plugin/
目录下,其中两个目录cmd/scheduler和pkg/scheduler分别定义了kube-scheduler command的参数封装和app启动运行和scheduler的具体内部实现。具体的目录结构分析如下所示。
k8s.io/kubernetes/plugin/
.
├── cmd
│ └── kube-scheduler // kube-scheduler command的相关代码
│ ├── app // kube-scheduler app的启动
│ │ ├── options
│ │ │ └── options.go // 封装SchedulerServer对象和AddFlags方法
│ │ └── server.go // 定义SchedulerServer的config封装和Run方法
│ └── scheduler.go // kube-scheduler main方法入口
└── pkg
├── scheduler // scheduler后端核心代码
│ ├── algorithm
│ │ ├── doc.go
│ │ ├── listers.go // 定义NodeLister和PodLister等Interface
│ │ ├── predicates // 定义kubernetes自带的Predicates Policies的Function实现
│ │ │ ├── error.go
│ │ │ ├── metadata.go
│ │ │ ├── predicates.go // 自带Predicates Policies的主要实现
│ │ │ ├── predicates_test.go
│ │ │ ├── utils.go
│ │ │ └── utils_test.go
│ │ ├── priorities // 定义kubernetes自带的Priorities Policies的Function实现
│ │ │ ├── balanced_resource_allocation.go // defaultProvider - BalancedResourceAllocation
│ │ │ ├── balanced_resource_allocation_test.go
│ │ │ ├── image_locality.go // defaultProvider - ImageLocalityPriority
│ │ │ ├── image_locality_test.go
│ │ │ ├── interpod_affinity.go // defaultProvider - InterPodAffinityPriority
│ │ │ ├── interpod_affinity_test.go
│ │ │ ├── least_requested.go // defaultProvider - LeastRequestedPriority
│ │ │ ├── least_requested_test.go
│ │ │ ├── metadata.go // priorityMetadata定义
│ │ │ ├── most_requested.go // defaultProvider - MostRequestedPriority
│ │ │ ├── most_requested_test.go
│ │ │ ├── node_affinity.go // defaultProvider - NodeAffinityPriority
│ │ │ ├── node_affinity_test.go
│ │ │ ├── node_label.go // 当policy.Argument.LabelPreference != nil时,会注册该Policy
│ │ │ ├── node_label_test.go
│ │ │ ├── node_prefer_avoid_pods.go // defaultProvider - NodePreferAvoidPodsPriority
│ │ │ ├── node_prefer_avoid_pods_test.go
│ │ │ ├── selector_spreading.go // defaultProvider - SelectorSpreadPriority
│ │ │ ├── selector_spreading_test.go
│ │ │ ├── taint_toleration.go // defaultProvider - TaintTolerationPriority
│ │ │ ├── taint_toleration_test.go
│ │ │ ├── test_util.go
│ │ │ └── util // 工具类
│ │ │ ├── non_zero.go
│ │ │ ├── topologies.go
│ │ │ └── util.go
│ │ ├── scheduler_interface.go // 定义SchedulerExtender和ScheduleAlgorithm Interface
│ │ ├── scheduler_interface_test.go
│ │ └── types.go // 定义了Predicates和Priorities Algorithm要实现的方法类型(FitPredicate, PriorityMapFunction)
│ ├── algorithmprovider // algorithm-provider参数配置的项
│ │ ├── defaults
│ │ │ ├── compatibility_test.go
│ │ │ └── defaults.go // "DefaultProvider"的实现
│ │ ├── plugins.go // 空,预留自定义
│ │ └── plugins_test.go
│ ├── api // 定义Scheduelr API接口和对象,用于SchedulerExtender处理来自HTTPExtender的请求。
│ │ ├── latest
│ │ │ └── latest.go
│ │ ├── register.go
│ │ ├── types.go // 定义Policy, PredicatePolicy,PriorityPolicy等
│ │ ├── v1
│ │ │ ├── register.go
│ │ │ └── types.go
│ │ └── validation
│ │ ├── validation.go // 验证Policy的定义是否合法
│ │ └── validation_test.go
│ ├── equivalence_cache.go //
│ ├── extender.go // 定义HTTPExtender的新建以及对应的Filter和Prioritize方法来干预预选和优选
│ ├── extender_test.go
│ ├── factory // 根据配置的Policies注册和匹配到对应的预选(FitPredicateFactory)和优选(PriorityFunctionFactory2)函数
│ │ ├── factory.go // 核心是定义ConfigFactory来工具配置完成scheduler的封装函数,最关键的CreateFromConfig和CreateFr
版权声明:本文为WaltonWang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。