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,其中包括DefaultProviderClusterAutoscalerProvider

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

最后更新于

这有帮助吗?