《Kubernetes 系列》之六 Kubernetes 的调度策略
《Kubernetes 系列》之六 Kubernetes 的调度策略
Kubernetes 的调度器(kube-scheduler
)负责将新创建的 Pod 分配到集群中的合适节点上。调度器会根据预定义的调度策略和当前集群的状态来选择最优的节点。这些调度策略主要分为两类:过滤策略和优选策略。
1. 过滤策略(Filtering)
过滤策略用于筛选掉不适合运行 Pod 的节点,只有通过所有过滤策略的节点才会进入下一轮的优选。常见的过滤策略包括:
-
PodFitsResources:检查节点上的可用资源(CPU、内存、存储等)是否满足 Pod 的需求。如果节点没有足够的资源来运行 Pod,那么该节点会被过滤掉。
-
PodFitsHostPorts:确保 Pod 需要使用的主机端口在节点上是可用的。如果端口已经被占用,则过滤掉该节点。
-
PodFitsHost:如果 Pod 指定了某个节点名(通过
spec.nodeName
字段),调度器会检查节点名称是否匹配。如果不匹配则过滤掉。 -
PodFitsNodeSelector:检查 Pod 的
nodeSelector
是否与节点的标签匹配。nodeSelector
是一种简单的键值对,用于指定 Pod 只能调度到带有特定标签的节点。 -
PodToleratesNodeTaints:检查 Pod 是否能容忍节点的污点(Taints)。污点用于标记节点可能存在某些问题(如资源紧张),而容忍度(Tolerations)允许特定的 Pod 忽略这些问题。
-
NoVolumeZoneConflict:确保节点所在的可用区能够支持 Pod 所需要的数据卷。
-
MatchInterPodAffinity:检查 Pod 是否符合“Pod 间亲和性”或“Pod 间反亲和性”规则。这些规则用于确保某些 Pod 被调度到同一个节点上,或者确保某些 Pod 被分散到不同的节点。
2. 优选策略(Scoring)
在过滤之后,多个节点可能符合条件,优选策略用于根据分数选择最优的节点。每个节点会根据这些策略被打分,分数最高的节点将被选择。
-
LeastRequestedPriority:优先选择资源请求最少的节点。这意味着调度器会优先将 Pod 分配到负载较低的节点,以实现负载均衡。
-
BalancedResourceAllocation:计算 CPU 和内存的平衡分配。如果一个节点在 CPU 和内存资源的使用上更加均衡,它会得到更高的优先级。
-
NodePreferAvoidPodsPriority:如果某个节点标记了
PreferNoSchedule
标签,那么它的优先级会较低,即尽量避免在该节点上调度 Pod。 -
NodeAffinityPriority:优先选择与 Pod 指定的节点亲和性标签匹配的节点。
NodeAffinity
是一种高级的调度策略,可以定义更复杂的节点选择逻辑。 -
InterPodAffinityPriority:基于 Pod 间的亲和性和反亲和性规则打分。对于定义了这些规则的 Pod,如果它们被调度到符合条件的节点上,则优先级会更高。
-
TaintTolerationPriority:如果节点有污点,但 Pod 定义了容忍这些污点的策略,则该节点的优先级可能会提高。
-
SpreadConstraintsPriority:将 Pod 尽量分散到多个节点或可用区,以实现高可用性和资源隔离。
高级调度策略
除了上述默认策略,Kubernetes 还支持一些高级的调度策略,通常通过自定义调度器或插件实现:
-
自定义调度器:用户可以根据自己的需求编写和部署自定义调度器,覆盖或补充默认的
kube-scheduler
行为。 -
调度扩展(Scheduling Framework):Kubernetes 1.16 引入的调度框架,允许开发者通过编写插件来扩展调度逻辑。这些插件可以在调度过程的不同阶段(过滤、打分、绑定等)自定义行为。
总结
Kubernetes 的调度策略通过过滤和打分的组合确保 Pod 被调度到合适的节点上,从而实现集群的高效利用和负载均衡。用户还可以根据需要调整默认的调度策略,甚至编写自定义调度器来满足特定的调度需求。