以下代码分析基于
kubernetes v1.12.0
版本。
此部分主要介绍调度中使用的各种调度算法,包括调度算法的注册部分。注册部分的代码主要在/pkg/scheduler/algorithmprovider
中,具体的预选策略和优选策略的算法实现在/pkg/scheduler/algorithm
中。
1. ApplyFeatureGates
注册调度算法的调用入口在SchedulerCommand的Run函数中。
此部分代码位于/cmd/kube-scheduler/app/server.go
1 | // Run runs the Scheduler. |
ApplyFeatureGates的具体实现在pkg/scheduler/algorithmprovider
的包中。
此部分代码位于/pkg/scheduler/algorithmprovider/plugins.go
1 | // ApplyFeatureGates applies algorithm by feature gates. |
ApplyFeatureGates具体实现如下:
此部分代码位于/pkg/scheduler/algorithmprovider/defaults/defaults.go
根据feature移除部分调度策略。
1 | // ApplyFeatureGates applies algorithm by feature gates. |
2. init
当函数逻辑调用到algorithmprovider
包时,就会自动调用init的初始化函数,此部分主要包括对预选算法和优选算法的注册。
此部分代码位于/pkg/scheduler/algorithmprovider/defaults/defaults.go
1 | func init() { |
以下对init中的注册进行拆分介绍。
2.1. registerAlgorithmProvider
此部分主要注册默认的预选和优选策略。
1 | // Register functions that extract metadata used by predicates and priorities computations. |
registerAlgorithmProvider
注册AlgorithmProvider,其中包括DefaultProvider
和ClusterAutoscalerProvider
。
1 | func registerAlgorithmProvider(predSet, priSet sets.String) { |
2.2. RegisterFitPredicate
在init部分注册预选策略函数。
预选策略如下:
调度策略 | 函数 | 描述 |
---|---|---|
PodFitsPorts | PodFitsHostPorts | PodFitsPorts已经被PodFitsHostPorts代替,此处主要是为了兼容性。 |
PodFitsHostPortsPred | PodFitsHostPorts | 判断是否与宿主机的端口冲突。 |
PodFitsResourcesPred | PodFitsResources | 判断node资源是否充足。 |
HostNamePred | PodFitsHost | 判断pod所指定调度的节点是否是当前的节点。 |
MatchNodeSelectorPred | PodMatchNodeSelector | 判断pod指定的node selector是否匹配当前的node。 |
具体代码如下:
1 | // PodFitsPorts has been replaced by PodFitsHostPorts for better user understanding. |
2.3. RegisterPriorityFunction2
在init部分注册优选策略函数。
1 | // EqualPriority is a prioritizer function that gives an equal weight of one to all nodes |
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拓扑的要求。 |
具体代码如下:
1 | func defaultPredicates() sets.String { |
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使用到的镜像打分。 |
具体代码实现如下:
1 | func defaultPriorities() sets.String { |
参考:
赞赏一下