kube-scheduler工作原理

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

    • predicate:过滤不符合条件的节点
    • priority:优先级排序,选择优先级最高的节点
    • PodFitsPorts:同PodFitsHostPorts
    • PodFitsHostPorts:检查是否有Host Ports冲突
    • PodFitsResources:检查Node的资源是否充足,包括允许的Pod数量、CPU、内存、GPU个数以及其他的OpaqueIntResources
    • HostName:检查是否与候选节点一致
    • MatchNodeSelector:检查候选节点的是否匹配
    • NoVolumeZoneConflict:检查volume zone是否冲突
    • MaxEBSVolumeCount:检查AWS EBS Volume数量是否过多(默认不超过39)
    • 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数量
    • LeastRequestedPriority:优先调度到请求资源少的节点上
    • BalancedResourceAllocation:优先平衡各节点的资源使用
    • NodePreferAvoidPodsPriority:alpha.kubernetes.io/preferAvoidPods字段判断,权重为10000,避免其他优先级策略的影响
    • NodeAffinityPriority:优先调度到匹配NodeAffinity的节点上
    • TaintTolerationPriority:优先调度到匹配TaintToleration的节点上
    • ServiceSpreadingPriority:尽量将同一个service的Pod分布到不同节点上,已经被SelectorSpreadPriority替代[默认未使用]
    • EqualPriority:将所有节点的优先级设置为1[默认未使用]
    • ImageLocalityPriority:尽量将使用大镜像的容器调度到已经下拉了该镜像的节点上[默认未使用]
    • MostRequestedPriority:尽量调度到已经使用过的Node上,特别适用于cluster-autoscaler[默认未使用]