k8s Pod默认调度策略详解
在 Kubernetes 中,Pod 的默认调度由 kube-scheduler 负责,其核心目标是将 Pod 公平、高效地分配到集群节点上,同时满足 Pod 和节点的各种约束条件。
默认调度策略是一系列内置规则的组合,无需用户显式配置即可生效。
一、默认调度流程
kube-scheduler 的调度过程分为两个主要阶段:
- 过滤(Filtering):从所有节点中筛选出满足 Pod 基本要求的节点(称为 “可行节点”)。
- 打分(Scoring):对可行节点进行评分,选择得分最高的节点调度 Pod。
二、核心默认策略详解
1. 过滤阶段(必须满足的条件)
过滤阶段会排除不满足 Pod 需求的节点,核心规则包括:
- PodFitsResources检查节点是否有足够的 CPU、内存等资源,满足 Pod 的
resources.requests配置。例:若 Pod 请求 1 CPU 和 1Gi 内存,节点剩余资源不足则被过滤。 - PodFitsHostPorts检查 Pod 声明的
hostPort是否在节点上未被占用。例:若 Pod 需要hostPort: 80,节点 80 端口已被占用则被过滤。 - PodFitsHost若 Pod 配置了
spec.nodeName(指定节点名称),仅保留该节点。 - NodeSelectorMatches若 Pod 配置了
spec.nodeSelector(节点标签选择器),仅保留匹配标签的节点。例:nodeSelector: {env: prod}仅保留有env=prod标签的节点。 - NoDiskConflict避免 Pod 挂载的本地存储卷(如
hostPath)在节点上存在冲突。 - CheckNodeTaints检查节点的污点(Taint)是否被 Pod 的容忍(Toleration)匹配。默认规则:若节点有污点且 Pod 无对应容忍,则该节点被过滤。
- CheckNodeAffinity若 Pod 配置了 节点亲和性(NodeAffinity),仅保留满足亲和性规则的节点。
2. 打分阶段(优先选择的条件)
在过滤后的可行节点中,调度器会对节点打分(0-10 分),得分最高的节点被选中。
默认打分规则包括:
- LeastRequestedPriority(默认权重最高)优先选择资源利用率最低的节点(CPU 和内存剩余比例最高)。计算公式:
(1 - (节点已用CPU/节点总CPU)) * 5 + (1 - (节点已用内存/节点总内存)) * 5目的:平衡节点负载,避免资源过度集中。 - BalancedResourceAllocation优先选择 CPU 和内存利用率最均衡的节点(避免某类资源过度使用)。例:CPU 用 30% 且内存用 30% 的节点,优于 CPU 用 10% 但内存用 50% 的节点。
- NodePreferAvoidPodsPriority避免将 Pod 调度到标记了
node.kubernetes.io/prefer-avoid-pods注解的节点(通常用于避免干扰关键节点)。 - SelectorSpreadPriority尽量将同一
Service、StatefulSet或ReplicaSet的 Pod 分散到不同节点(通过标签选择器识别关联 Pod)。目的:提高服务可用性,避免单点故障。 - NodeAffinityPriority若 Pod 配置了 偏好性节点亲和性(PreferredDuringSchedulingIgnoredDuringExecution),按规则对节点加分。例:偏好
zone=us-west标签的节点,匹配的节点会获得额外分数。 - TaintTolerationPriority对 Pod 容忍节点污点的情况进行打分,容忍的污点越少,得分越高(尽量避免调度到有污点的节点)。
三、默认策略的特点
- 无感知调度:默认策略不依赖用户配置,完全基于集群资源和 Pod 基本需求调度。
- 负载均衡:通过
LeastRequestedPriority和BalancedResourceAllocation平衡节点资源使用。 - 高可用倾向:通过
SelectorSpreadPriority分散关联 Pod,降低单点风险。 - 可扩展性:默认策略可通过 调度配置文件(scheduler-config.yaml) 自定义(如调整权重、禁用某些规则)。
四、验证默认调度行为
可以通过 kubectl describe pod <pod-name> 查看 Pod 的调度决策细节:
kubectl describe pod my-pod | grep -A 10 "Events:"
输出中会显示调度器选择节点的原因,例如:
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 5s default-scheduler Successfully assigned default/my-pod to node-1
若要查看更详细的打分过程,可开启 kube-scheduler 的调试日志(通过 --v=4 启动参数)。
总结
Kubernetes 的默认调度策略是一套兼顾资源效率、负载均衡和高可用性的规则集合,核心逻辑是:
- 先过滤:排除不满足 Pod 基本需求(资源、标签、污点等)的节点。
- 再打分:优先选择资源充足、负载均衡且符合偏好的节点。
如果默认策略无法满足需求(如特定业务需要调度到 GPU 节点),可通过 亲和性规则、调度器扩展 或 自定义调度器 调整。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Kubernetes控制器中DaemonSet与Job的使用教程
这篇文章主要介绍了Kubernetes控制器中DaemonSet与Job的使用,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-08-08
Kubekey安装Kubernetes-1.24.8的详细过程
这篇文章主要介绍了Kubekey安装Kubernetes-1.24.8的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-05-05


最新评论