registerAlgorithmProvider
kube-scheduler源码分析(二)之 registerAlgorithmProvider
以下代码分析基于
kubernetes v1.12.0版本。
此部分主要介绍调度中使用的各种调度算法,包括调度算法的注册部分。注册部分的代码主要在/pkg/scheduler/algorithmprovider中,具体的预选策略和优选策略的算法实现在/pkg/scheduler/algorithm中。
1. ApplyFeatureGates
注册调度算法的调用入口在SchedulerCommand的Run函数中。
此部分代码位于/cmd/kube-scheduler/app/server.go
// Run runs the Scheduler.
func Run(c schedulerserverconfig.CompletedConfig, stopCh <-chan struct{}) error {
...
// Apply algorithms based on feature gates.
// TODO: make configurable?
algorithmprovider.ApplyFeatureGates()
...
} ApplyFeatureGates的具体实现在pkg/scheduler/algorithmprovider的包中。
此部分代码位于/pkg/scheduler/algorithmprovider/plugins.go
// ApplyFeatureGates applies algorithm by feature gates.
func ApplyFeatureGates() {
defaults.ApplyFeatureGates()
}ApplyFeatureGates具体实现如下:
此部分代码位于/pkg/scheduler/algorithmprovider/defaults/defaults.go
根据feature移除部分调度策略。
2. init
当函数逻辑调用到algorithmprovider包时,就会自动调用init的初始化函数,此部分主要包括对预选算法和优选算法的注册。
此部分代码位于/pkg/scheduler/algorithmprovider/defaults/defaults.go
以下对init中的注册进行拆分介绍。
2.1. registerAlgorithmProvider
此部分主要注册默认的预选和优选策略。
registerAlgorithmProvider
注册AlgorithmProvider,其中包括DefaultProvider和ClusterAutoscalerProvider。
2.2. RegisterFitPredicate
在init部分注册预选策略函数。
预选策略如下:
PodFitsPorts
PodFitsHostPorts
PodFitsPorts已经被PodFitsHostPorts代替,此处主要是为了兼容性。
PodFitsHostPortsPred
PodFitsHostPorts
判断是否与宿主机的端口冲突。
PodFitsResourcesPred
PodFitsResources
判断node资源是否充足。
HostNamePred
PodFitsHost
判断pod所指定调度的节点是否是当前的节点。
MatchNodeSelectorPred
PodMatchNodeSelector
判断pod指定的node selector是否匹配当前的node。
具体代码如下:
2.3. RegisterPriorityFunction2
在init部分注册优选策略函数。
3. defaultPredicates
此部分为默认预选策略的注册函数。
默认的预选策略如下:
NoVolumeZoneConflictPred
NewVolumeZonePredicate
判断pod使用到的volume是否有节点的要求。目前只支持pvc。
MaxEBSVolumeCountPred
NewMaxPDVolumeCountPredicate
判断pod使用EBSVolume在该节点上是否已经达到上限了。
MaxGCEPDVolumeCountPred
NewMaxPDVolumeCountPredicate
判断pod使用GCEPDVolume在该节点上是否已经达到上限了。
MaxAzureDiskVolumeCountPred
NewMaxPDVolumeCountPredicate
判断pod使用AzureDiskVolume在该节点上是否已经达到上限了。
MaxCSIVolumeCountPred
NewCSIMaxVolumeLimitPredicate
判断CSIVolume是否达到上限了。
MatchInterPodAffinityPred
NewPodAffinityPredicate
匹配pod的亲缘性。
NoDiskConflictPred
NoDiskConflict
判断是否有disk volumes的冲突。
GeneralPred
GeneralPredicates
通用的预选策略
CheckNodeMemoryPressurePred
CheckNodeMemoryPressurePredicate
判断节点内存是否充足。
CheckNodeDiskPressurePred
CheckNodeDiskPressurePredicate
判断节点是否有磁盘压力。
CheckNodePIDPressurePred
CheckNodePIDPressurePredicate
判断节点上的PID
CheckNodeConditionPred
CheckNodeConditionPredicate
判断node是否ready。
PodToleratesNodeTaintsPred
PodToleratesNodeTaints
判断pod是否可以容忍节点的taints。
CheckVolumeBindingPred
NewVolumeBindingPredicate
判断是否有volume拓扑的要求。
具体代码如下:
4. defaultPriorities
此部分主要为默认优选策略的注册函数。
默认优选策略如下:
SelectorSpreadPriority
NewSelectorSpreadPriority
属于相同service和rs下的pod尽量分布在不同的node上。
InterPodAffinityPriority
NewInterPodAffinityPriority
根据pod的亲缘性,将相同拓扑域中的pod放在同一个节点
LeastRequestedPriority
LeastRequestedPriorityMap
按最少请求的利用率对节点进行优先级排序。
BalancedResourceAllocation
BalancedResourceAllocationMap
实现资源的平衡使用。
NodePreferAvoidPodsPriority
CalculateNodePreferAvoidPodsPriorityMap
将此权重设置为足以覆盖所有其他优先级函数。
NodeAffinityPriority
CalculateNodeAffinityPriorityMap
pod指定label节点调度,来匹配node亲缘性。
TaintTolerationPriority
ComputeTaintTolerationPriorityMap
pod有设置tolerate属性来容忍node的taint。
ImageLocalityPriority
ImageLocalityPriorityMap
根据节点上是否有该pod使用到的镜像打分。
具体代码实现如下:
参考:
https://github.com/kubernetes/kubernetes/blob/v1.12.0/pkg/scheduler/algorithmprovider/defaults/defaults.go
最后更新于
这有帮助吗?