kube-scheduler核心处理逻辑是如何进行源码分析的?

摘要:kube-scheduler组件是kubernetes中的核心组件之一,主要负责pod资源对象的调度工作,具体来说,kube-scheduler组件负责根据调度算法(包括预选算法和优选算法)将未调度的pod调度到合适的最优的node节点上。
kube-scheduler源码分析(2)-核心处理逻辑分析 kube-scheduler简介 kube-scheduler组件是kubernetes中的核心组件之一,主要负责pod资源对象的调度工作,具体来说,kube-scheduler组件负责根据调度算法(包括预选算法和优选算法)将未调度的pod调度到合适的最优的node节点上。 kube-scheduler架构图 kube-scheduler的大致组成和处理流程如下图,kube-scheduler对pod、node等对象进行了list/watch,根据informer将未调度的pod放入待调度pod队列,并根据informer构建调度器cache(用于快速获取需要的node等对象),然后sched.scheduleOne方法为kube-scheduler组件调度pod的核心处理逻辑所在,从未调度pod队列中取出一个pod,经过预选与优选算法,最终选出一个最优node,然后更新cache并异步执行bind操作,也就是更新pod的nodeName字段,至此一个pod的调度工作完成。 kube-scheduler组件的分析将分为两大块进行,分别是: (1)kube-scheduler初始化与启动分析; (2)kube-scheduler核心处理逻辑分析。 上一篇进行了kube-scheduler组件的初始化与启动分析,本篇进行核心处理逻辑分析。 2.kube-scheduler核心处理逻辑分析 基于tag v1.17.4 https://github.com/kubernetes/kubernetes/releases/tag/v1.17.4 直接看到kube-scheduler核心处理方法sched.Run。 sched.Run sched.Run主要逻辑: (1)判断informer中的对象cache是否同步完成; (2)循环调用sched.scheduleOne调度pod。 // pkg/scheduler/scheduler.go func (sched *Scheduler) Run(ctx context.Context) { // 1.判断informer中的对象cache是否同步完成 if !cache.WaitForCacheSync(ctx.Done(), sched.scheduledPodsHasSynced) { return } // 2.循环调用sched.scheduleOne调度pod wait.UntilWithContext(ctx, sched.scheduleOne, 0) } sched.scheduleOne sched.scheduleOne方法作用是调度一个pod到合适的node节点,主要逻辑如下: (1)从scheduler的待调度pod队列中取出一个pod,如果该pod的deletetimestamp不为空(代表处于删除状态)则跳过该pod的调度工作; (2)调用sched.Algorithm.Schedule执行调度算法,返回通过预算及优选算法算出的nodo节点; (3)当执行调度算法失败时,上报调度失败event,更新pod的status; (4)当没有找到合适的节点时,判断scheduler是否开启了抢占调度机制,是则调用sched.preempt执行抢占逻辑; (5)调用sched.VolumeBinder.Binder.AssumePodVolumes,更新cache,判断关联pvc是否都已bound; (6)执行调用 "reserve" plugins(有印象即可,后面会对该类plugins进行讲解); (7)调用sched.assume,在scheduler的cache中记录这个pod已经调度了,因为更新pod的nodeName是异步操作,防止pod被重复调度; (8)起一个goroutine,异步执行pod的binding操作: (8.1)执行调用 "permit" plugins(有印象即可,后面会对该类plugins进行讲解); (8.2)调用sched.bindVolumes,绑定volumes; (8.3)执行调用 "prebind" plugins(有印象即可,后面会对该类plugins进行讲解); (8.4)更新pod的nodeName,写入etcd; (8.5)执行调用 "postbind" plugins(有印象即可,后面会对该类plugins进行讲解),该pod调度结束。
阅读全文