kube-sheduler 启动流程
作用简介
kube-scheduler是k8s中的调度模块,负责调度Pod,pod是k8s最基本的运行单元。再我们剖析代码之前,可以猜测一下k8s是如何工作的。kube-scheduler需要对未被调度的Pod进行Watch,同时也需要对node进行watch,因为pod需要绑定到具体的Node上,当kube-scheduler监测到未被调度的pod,它会取出这个pod,然后依照内部设定的调度算法,选择合适的node,然后通过apiserver写回到etcd,kube-scheduler的工作也就结束了。实际kube-scheduler的代码就是这样工作的。
kube-sheduler feature-gates 介绍
- APIListChunking=true|false (BETA - default=true)
- APIResponseCompression=true|false (ALPHA - default=false)
kube-sheduler 原理介绍
1, Scheduler收集和分析当前Kubernetes集群中所有Minion节点的资源(内存、CPU)负载情况,然后依此分发新建的Pod到Kubernetes集群中可用的节点。
实时监测Kubernetes集群中未分发和已分发的所有运行的Pod。
2, Scheduler也监测Minion节点信息,由于会频繁查找Minion节点,Scheduler会缓存一份最新的信息在本地。
3, 最后,Scheduler在分发Pod到指定的Minion节点后,会把Pod相关的信息Binding写回API Server。
kube-shedule 服务启动分析
- 使用spf13/cobra 包进行命令行封装
- 配置leader election 选项则进行 leader 选举功能 LeaderElection 设置true
- 运行leader 选举机制acquire方法(maybeReportTransition)
- 在主线程运行sched.Run() 并且设置 <-stopCh 主线程为阻塞状态
1 | func Run(c schedulerserverconfig.CompletedConfig, stopCh <-chan struct{}) error { |
kube-sheduler 逻辑代码分析
1 | // Run begins watching and scheduling. It waits for cache to be synced, then starts a goroutine and returns immediately. |
kube-sheduler 逻辑调度流程
1 | // Schedule tries to schedule the given pod to one of the nodes in the node list. |
1 | // Filters the nodes to find the ones that fit based on the given predicate functions |