k8s Pod默认调度策略详解

 更新时间:2026年02月03日 09:41:56   作者:alden_ygq  
Kubernetes的Pod默认调度由kube-scheduler负责,通过过滤和打分两个阶段,将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尽量将同一 ServiceStatefulSet 或 ReplicaSet 的 Pod 分散到不同节点(通过标签选择器识别关联 Pod)。目的:提高服务可用性,避免单点故障。
  • NodeAffinityPriority若 Pod 配置了 偏好性节点亲和性(PreferredDuringSchedulingIgnoredDuringExecution),按规则对节点加分。例:偏好 zone=us-west 标签的节点,匹配的节点会获得额外分数。
  • TaintTolerationPriority对 Pod 容忍节点污点的情况进行打分,容忍的污点越少,得分越高(尽量避免调度到有污点的节点)。

三、默认策略的特点

  1. 无感知调度:默认策略不依赖用户配置,完全基于集群资源和 Pod 基本需求调度。
  2. 负载均衡:通过 LeastRequestedPriority 和 BalancedResourceAllocation 平衡节点资源使用。
  3. 高可用倾向:通过 SelectorSpreadPriority 分散关联 Pod,降低单点风险。
  4. 可扩展性:默认策略可通过 调度配置文件(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 的默认调度策略是一套兼顾资源效率、负载均衡和高可用性的规则集合,核心逻辑是:

  1. 先过滤:排除不满足 Pod 基本需求(资源、标签、污点等)的节点。
  2. 再打分:优先选择资源充足、负载均衡且符合偏好的节点。

如果默认策略无法满足需求(如特定业务需要调度到 GPU 节点),可通过 亲和性规则调度器扩展 或 自定义调度器 调整。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • k3s安装部署流程

    k3s安装部署流程

    文章详细介绍了如何在国内配置K3s镜像源、部署仪表盘、配置角色和权限、获取仪表盘token、进行端口转发以及使用nerdctl和buildkitd构建容器镜像的方法,并附带了注意事项和验证步骤
    2026-01-01
  • K8S 中 kubectl 命令详解

    K8S 中 kubectl 命令详解

    这篇文章主要介绍了K8S 中 kubectl 命令,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • k8s中实现mysql主备过程详解

    k8s中实现mysql主备过程详解

    文章讲解了在K8s中使用StatefulSet部署MySQL主备架构,包含NFS安装、storageClass配置、MySQL部署及同步检查步骤,确保主备数据一致性与高可用性
    2025-09-09
  • Kubernetes控制器中DaemonSet与Job的使用教程

    Kubernetes控制器中DaemonSet与Job的使用教程

    这篇文章主要介绍了Kubernetes控制器中DaemonSet与Job的使用,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • 通过kubernetes部署nginx+php网站环境过程

    通过kubernetes部署nginx+php网站环境过程

    本文详细介绍了如何在Kubernetes中部署Nginx+PHP网站环境,包括环境准备、部署步骤、Service、ConfigMap、Ingress等配置,并提供了具体的YAML文件示例和命令,通过这些步骤,可以实现高可用、可扩展的Web服务
    2026-01-01
  • k8s安装calico时如何选择网卡问题

    k8s安装calico时如何选择网卡问题

    这篇文章主要介绍了k8s安装calico时如何选择网卡问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • k8s控制deamonset中pod数量的方法

    k8s控制deamonset中pod数量的方法

    DaemonSet是Kubernetes中用于确保每个节点运行一个Pod副本的控制器,常用于运行集群守护进程,通过节点选择器、节点亲和性、容忍度和更新策略,可以精确控制Pod的数量和调度,本文介绍k8s控制deamonset中pod数量的方法,感兴趣的朋友一起看看吧
    2025-01-01
  • Kubekey安装Kubernetes-1.24.8的详细过程

    Kubekey安装Kubernetes-1.24.8的详细过程

    这篇文章主要介绍了Kubekey安装Kubernetes-1.24.8的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • ragflow k8s部署过程图文详解

    ragflow k8s部署过程图文详解

    这篇文章主要介绍了ragflow k8s部署详细过程,本文将使用ragflow-0.18.0,来进行演示详细部署过程,需要的朋友可以参考下
    2025-04-04
  • Kubernetes安装Jenkins的思路详解

    Kubernetes安装Jenkins的思路详解

    这篇文章主要介绍了Kubernetes安装Jenkins,Jenkins插件可以在Kubernetes集群中运行动态jenkins-slave代理,基于Kubernetes的docker,自动化在Kubernetes中运行的Jenkins-slave代理的缩放,需要的朋友可以参考下
    2022-06-06

最新评论