Skip to content

Latest commit

 

History

History
91 lines (76 loc) · 4.31 KB

scheduler-internal.md

File metadata and controls

91 lines (76 loc) · 4.31 KB

kube-scheduler工作原理

kube-scheduler调度原理:

For given pod:

    +---------------------------------------------+
    |               Schedulable nodes:            |
    |                                             |
    | +--------+    +--------+      +--------+    |
    | | node 1 |    | node 2 |      | node 3 |    |
    | +--------+    +--------+      +--------+    |
    |                                             |
    +-------------------+-------------------------+
                        |
                        |
                        v
    +-------------------+-------------------------+

    Pred. filters: node 3 doesn't have enough resource

    +-------------------+-------------------------+
                        |
                        |
                        v
    +-------------------+-------------------------+
    |             remaining nodes:                |
    |   +--------+                 +--------+     |
    |   | node 1 |                 | node 2 |     |
    |   +--------+                 +--------+     |
    |                                             |
    +-------------------+-------------------------+
                        |
                        |
                        v
    +-------------------+-------------------------+

    Priority function:    node 1: p=2
                          node 2: p=5

    +-------------------+-------------------------+
                        |
                        |
                        v
            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