kube-scheduler实现原理

版本:b91146af51e273d0d35d614266d98b716ab2c861 (2018年4月1号于master分支)

补充知识:Kubernetes QoS

  1. **Guaranteed: ** 所有resource的limit和request都相等且不为0
  2. **Best-effort: ** 所有resource的limit和request都没有赋值
  3. **Burstable: ** 除了Guaranteed和Besteffort都属于Burstable

调度流程

_config.yml

调度主要三个阶段:

  1. schedule()
    通过predicate和priority选出最优节点。
  2. assume()
    这个分为assumeAndBindVolumes和assume。
    assumeAndBindVolumes会检测pv有没有准备好,没有就会让bindVolumesWorker异步bind volume并将pod重新加入调度队列,有的话就跳过。
    assume将pod的调度信息缓存到本地内存schedulerCache中,因为bind是异步的,这样就不必等这个pod写入apiserver再调度下个pod了。
  3. bind()
    异步进行,将pod的调度结果写入apiserver。

predicate

  • NoVolumeZoneConflict:保证pod使用的pvc中的pv的声明区域包含node
  • MaxEBSVolumeCount:防止被调度pod的EBS加上目标node上的EBS超过最大值(39)
  • MaxGCEPDVolumeCount:防止被调度pod的GCEPD加上目标node上的GCEPD超过最大值(16)
  • MaxAzureDiskVolumeCount:防止被调度pod的AzureDisk加上目标node上的AzureDisk超过最大值(16)
  • MatcherInterPodAffinity:检测目标node上的pod是否与被调度的pod冲突,检测被调度的pod是否与目标节点上的pod冲突
  • NoDiskConflict:分别判断pod的volume与node上每个pod的volume是否冲突,包括GCE、EBS、ISCSI、RBD
  • GeneralPredicates:包含非关键性预选nocriticalPredicates(pod数量上限、cpu、memory、gpu等资源)和关键性预选EssentialPredicates(pod要求的node是否与目标node匹配、目标node上是否有pod要求的端口号、pod的node selector是否与目标node匹配)
  • CheckNodeMemoryPressure:检查目标node上内存是否过载,只有Qos是Best-effort的pod才需要检查。
  • CheckNodeDiskPressure:检查目标node上硬盘是否过载
  • CheckNodeCondition:检查node是否ready、网络是否可用、是否OutOfDisk
  • PodToleratesNodeTaints:检查pod的tolerations是否与node的taints的匹配
  • CheckVolumeBinding:检查PVC和PV是否符合要求

priority

  • SelectorSpreadPriority:属于相同service或者RC的pod在node上均匀分布,权重为1
    map:node上有与被调度的pod相同selector的pod就score加1
    reduce:MaxPriority(10)*[1/3 *(不同node最大score-当前node的score)/不同node最大score + 2/3 * (不同zone最大score-当前node的score)/不同zone最大score]
  • InterPodAffinityPriority:根据Affinity和Anti-Affinity进行加分减分,权重为1
  • LeastRequestPriority:计算node上可分配的cpu和memory的score,权重为1
  • BalancedResourceAllocation:计算node上cpu、memory、volume使用率的score,权重为1
  • NodePreferAvoidPodsPriority:根据node上”scheduler.alpha.kubernetes.io/preferAvoidPods”的annotation计分,这个annotation会禁止ReplicationController或ReplicaSet的pod调度在其上面,默认权重为10000
  • NodeAffinityPriority:根据Affinity计分,权重为1
    map:根据pod的Affinity给node加分
    reduce:归一化
  • TaintTolerationPriority:根据toleration和taints是否匹配计分,权重为1
    map:匹配toleration和taints
    reduce:归一化
  • ServiceSpreadingPriority:属于相同service的pod在node上均匀分布,map、reduce和SelectorSpreadPriority一样,权重为1
  • EqualPriority:给所有节点提供相同的权重,权重为1
  • ImageLocalityPriority:镜像及其相关依赖优先,map根据node上已有的镜像所需的包的大小计分,reduce为空,权重为1
  • MostRequestedPriority:计算node上的cpu和memory的利用率的score,权重为1
Written on April 10, 2018