珠峰Web前端架构视频教程

ApplyFeatureGates入口

cmd/kube-scheduler/app/server.go:297 Run()这个函数中有这样一步:

这个Run是在最开头的地方被调用的,如下位置:

ApplyFeatureGates函数的定义如下:

这里调用的ApplyFeatureGates的位置是:

pkg/scheduler/algorithmprovider/defaults/defaults.go:180

这个go文件在defaults包下,这个包内包含这些东西:

这里的函数基本都是小写字母开头的,换言之都是包内访问的。另外有一个init()函数,这里的逻辑在调用ApplyFeatureGates()函数之前执行。所以下面看一下defaults包。

三、defaults包

pkg\scheduler\algorithmprovider\defaults\defaults.go中的init()函数

init()函数前面调用了registerAlgorithmProvider函数,参数是defaultPredicates()和defaultPriorities(),明显是注册默认的predicates和priorities.我们先关注predicate默认有哪些

(pkg/scheduler/algorithmprovider/defaults/defaults.go:112):

这里用紫色的常量名来统计有12个:

  1. NoVolumeZoneConflictPred
  2. MaxEBSVolumeCountPred
  3. MaxGCEPDVolumeCountPred
  4. MaxAzureDiskVolumeCountPred
  5. MatchInterPodAffinityPred
  6. NoDiskConflictPred
  7. GeneralPred
  8. CheckNodeMemoryPressurePred
  9. CheckNodeDiskPressurePred
  10. CheckNodeConditionPred
  11. PodToleratesNodeTaintsPred
  12. CheckVolumeBindingPred

init()函数中接着注册了4个predicate(name->func):

  1. PodFitsHostPorts -> predicates.PodFitsHostPorts
  2. PodFitsResources -> predicates.PodFitsResources
  3. HostName -> predicates.PodFitsHost
  4. MatchNodeSelector -> predicates.PodMatchNodeSelector

然后注册一个获取等价pod的函数:

函数名很直观:RegisterGetEquivalencePodFunction;这个函数的参数是一个匿名函数,匿名函数的参数前面见过很多次了,先关注一下返回值是什么:algorithm.GetEquivalencePodFunc;这个类型其实也是一个函数类型,签名是:func(pod *v1.Pod) interface{},也就是以pod信息为参数,返回任意类型。接着看一下前面这个匿名函数的return部分写的是什么:predicates.NewEquivalencePodGenerator(args.PVCInfo)

这里的g是这样定义的:

return部分调用了一个方法,这个方法长这个样子:

这个方法返回一个EquivalencePod,也就是等价pod,定义如下:

这个OwnerReference包含判断一个资源身份所需要的足够的信息:

RegisterGetEquivalencePodFunction函数在注册的时候把传进来的匿名函数注册到了哪里呢?

这里的getEquivalencePodFuncFactory明显又是一个包级变量,定义位置是:pkg/scheduler/factory/plugins.go:95.

所以总结下来就是说init()中的factory.RegisterGetEquivalencePodFunction函数把一个获取等价pod的函数注册到了factory包的包级变量getEquivalencePodFuncFactory中

再看defaults.go中唯一一个可导出函数ApplyFeatureGates;

这个函数在TaintNodesByCondition特性打开的情况下调整了几个predicate,特性的定义跟进去可以看到(pkg/features/kube_features.go:140):

这里的Feature类型其实很简单,跟一下可以看到这一行定义:type Feature string.可以发现这里定义了很多的alpha或者beta的特性,明显这里是做了开关,各种未稳定发布的特性可以选择性放出来。其实在scheduler组件启动的时候有一个命令行参数是:--feature-gates=...,TaintNodesByCondition=true,也就是可以通过这种方式打开一个feature.特性开关的事情后面再详细介绍,关于predicate算法注册的内容今天就讲到这里!

猜你喜欢

转载自blog.csdn.net/hhk2012/article/details/84951650