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[默认未使用]