kube-scheduler工作原理

kube-scheduler调度原理:

  1. For given pod:
  2. +---------------------------------------------+
  3. | Schedulable nodes: |
  4. | |
  5. | +--------+ +--------+ +--------+ |
  6. | | node 1 | | node 2 | | node 3 | |
  7. | +--------+ +--------+ +--------+ |
  8. | |
  9. +-------------------+-------------------------+
  10. |
  11. |
  12. v
  13. +-------------------+-------------------------+
  14. Pred. filters: node 3 doesn't have enough resource
  15. +-------------------+-------------------------+
  16. |
  17. |
  18. v
  19. +-------------------+-------------------------+
  20. | remaining nodes: |
  21. | +--------+ +--------+ |
  22. | | node 1 | | node 2 | |
  23. | +--------+ +--------+ |
  24. | |
  25. +-------------------+-------------------------+
  26. |
  27. |
  28. v
  29. +-------------------+-------------------------+
  30. Priority function: node 1: p=2
  31. node 2: p=5
  32. +-------------------+-------------------------+
  33. |
  34. |
  35. v
  36. select max{node priority} = node 2

kube-scheduler调度分为两个阶段,predicate和priority

  • predicate:过滤不符合条件的节点
  • priority:优先级排序,选择优先级最高的节点

predicates策略

  • PodFitsPorts:同PodFitsHostPorts
  • PodFitsHostPorts:检查是否有Host Ports冲突
  • PodFitsResources:检查Node的资源是否充足,包括允许的Pod数量、CPU、内存、GPU个数以及其他的OpaqueIntResources
  • HostName:检查pod.Spec.NodeName是否与候选节点一致
  • MatchNodeSelector:检查候选节点的pod.Spec.NodeSelector是否匹配
  • NoVolumeZoneConflict:检查volume zone是否冲突
  • MaxEBSVolumeCount:检查AWS EBS Volume数量是否过多(默认不超过39)
  • MaxGCEPDVolumeCount:检查GCE PD Volume数量是否过多(默认不超过16)
  • MaxAzureDiskVolumeCount:检查Azure Disk Volume数量是否过多(默认不超过16)
  • MatchInterPodAffinity:检查是否匹配Pod的亲和性要求
  • NoDiskConflict:检查是否存在Volume冲突,仅限于GCE PD、AWS EBS、Ceph RBD以及ISCSI
  • GeneralPredicates:分为noncriticalPredicates和EssentialPredicates。noncriticalPredicates中包含PodFitsResources,EssentialPredicates中包含PodFitsHost,PodFitsHostPorts和PodSelectorMatches。
  • PodToleratesNodeTaints:检查Pod是否容忍Node Taints
  • CheckNodeMemoryPressure:检查Pod是否可以调度到MemoryPressure的节点上
  • CheckNodeDiskPressure:检查Pod是否可以调度到DiskPressure的节点上
  • NoVolumeNodeConflict:检查节点是否满足Pod所引用的Volume的条件

priorities策略

  • SelectorSpreadPriority:优先减少节点上属于同一个Service或Replication Controller的Pod数量
  • InterPodAffinityPriority:优先将Pod调度到相同的拓扑上(如同一个节点、Rack、Zone等)
  • LeastRequestedPriority:优先调度到请求资源少的节点上
  • BalancedResourceAllocation:优先平衡各节点的资源使用
  • NodePreferAvoidPodsPriority:alpha.kubernetes.io/preferAvoidPods字段判断,权重为10000,避免其他优先级策略的影响
  • NodeAffinityPriority:优先调度到匹配NodeAffinity的节点上
  • TaintTolerationPriority:优先调度到匹配TaintToleration的节点上
  • ServiceSpreadingPriority:尽量将同一个service的Pod分布到不同节点上,已经被SelectorSpreadPriority替代[默认未使用]
  • EqualPriority:将所有节点的优先级设置为1[默认未使用]
  • ImageLocalityPriority:尽量将使用大镜像的容器调度到已经下拉了该镜像的节点上[默认未使用]
  • MostRequestedPriority:尽量调度到已经使用过的Node上,特别适用于cluster-autoscaler[默认未使用]

[warning] 代码入口路径

与Kubernetes其他组件的入口不同(其他都是位于cmd/目录),kube-schedular的入口在plugin/cmd/kube-scheduler