源码解析
Scheduler
上一篇文章文章我们讲了Schuduler的主循环,这一节我们讲讲kube-scheduler如何启动。
Setup
1 | / Setup creates a completed config and a scheduler based on the command args and options |
根据注释,我们可以看到这个函数主要是用来根据命令行参数和选项创建配置文件和Scheduler。
- 1.使用了
last.Default()函数,我们可以得到一个默认的config。会使用最新API版本的配置默认值。默认配置包括:- metav1.TypeMeta,包括Kind和APIVersion
- Parallelism,并行度定义了用于调度 Pod 的算法中的并行度。必须大于 0。默认为 16
- LeaderElection,定义了选举领导者的配置,具体配置可以查看LeaderElectionConfiguration结构体
- ClientConnection,指定使用kubeconfig与apiserver通信时的配置
- componentbaseconfigv1alpha1.DebuggingConfiguration,调试相关的功能和配置
- PercentageOfNodesToScore,发现可行性节点的配置
- PodInitialBackoffSeconds,不可调度Pod的初始退避
- PodMaxBackoffSeconds,不可调度Pod的最大退避
- Profiles,Pod指定的调度程序的名称
- Extenders,拓展器列表
- 2.
opts.Validate对用户的配置进行检查 - 3.
c.Complete获取完整的配置 - 4.使用
scheduler.New创建一个Scheduler结构体实例
scheduler.New()
scheduler.New()用来创建一个Scheduler实例:
1 | func New(client clientset.Interface, |
这段代码的输入参数为:
- client: clientset.Interface 类型,表示与 Kubernetes API 通信的客户端
- informerFactory: informer.SharedInformerFactory 类型,表示用于创建 Informer 的工厂,用于从 Kubernetes API 接收事件并维护本地缓存
- dynInformerFactory: dynamicinformer.DynamicSharedInformerFactory 类型,表示用于创建动态 Informer 的工厂,用于从 Kubernetes API 接收动态资源事件并维护本地缓存
- recorderFactory: profile.RecorderFactory 类型,表示用于创建事件记录器的工厂,用于记录调度器产生的事件
- stopCh: <-chan struct{} 类型,表示一个停止信号通道,用于通知调度器停止运行
- opts …Option: 可选的选项参数,用于配置调度器的行为
sched.applyDefaultHandlers()
在New一个Scheduler的时候会给scheduler结构体实例添加默认的Handler,即sched.applyDefaultHandlers():
1 | func (s *Scheduler) applyDefaultHandlers() { |
我们可以看到给scheduler添加了两个方法,即schedulePod和handleSchedulingFailure。
schedulePod
1 | // 尝试调度一个给定的Pod到节点列表中的节点 |
从代码可以看到,有两个比较关键的函数sched.findNodesThatFitPod和prioritizeNodes:
- sched.findNodesThatFitPod:
使用过滤器插件和过滤器拓展器来查找可用的节点。
1 | func (sched *Scheduler) findNodesThatFitPod(ctx context.Context, fwk framework.Framework, state *framework.CycleState, pod *v1.Pod) ([]*v1.Node, framework.Diagnosis, error) { |
- prioritizeNodes
运行评分插件来确定节点的优先级,从调用 RunScorePlugins() 返回每个节点的分数。来自每个插件的分数被加在一起以得到该节点的分数,然后任何扩展程序也会运行。最后将所有分数合并(相加)得到所有节点的总加权分数。
1 | func prioritizeNodes( |
1 | func prioritizeNodes( |
handleSchedulingFailure
1 | func (sched *Scheduler) handleSchedulingFailure(ctx context.Context, fwk framework.Framework, podInfo *framework.QueuedPodInfo, status *framework.Status, nominatingInfo *framework.NominatingInfo, start time.Time) { |
Run()
代码位于cmd/kube-scheduler/server.go
1 | // 通过给定的配置运行scheduler,只在上下文发生时返回错误或者在上下文终止时返回。 |
根据代码注释,可以知道,他首先启动事件广播器,健康检查器,然后开启一个HTTP服务器,监听API事件变化,然后启动选举过程,最后启动Scheduler的主循环,处理调度。