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 节点),可通过 亲和性规则调度器扩展 或 自定义调度器 调整。

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

相关文章

  • K8s学习之Pod的定义及详细资源调用案例

    K8s学习之Pod的定义及详细资源调用案例

    Kubernetes将所有内容抽象为资源,通过操作资源管理集群,核心单元是Pod,通过控制器管理Pod,资源管理分为命令式对象管理、命令式对象配置和声明式对象配置,各有适用场景,需要的朋友可以参考下
    2024-09-09
  • 详解k8s NetworkPolicy 网络策略是怎么样的

    详解k8s NetworkPolicy 网络策略是怎么样的

    这篇文章主要为大家介绍了k8s NetworkPolicy 网络策略是怎么样的深入解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • k8s 中的 service 如何找到绑定的 Pod 及实现 Pod 负载均衡的方法

    k8s 中的 service 如何找到绑定的 Pod 及实现 

    service 是一组具有相同 label pod 集合的抽象,集群内外的各个服务可以通过 service 进行互相通信,这篇文章主要介绍了k8s 中的 service 如何找到绑定的 Pod 以及如何实现 Pod 负载均衡,需要的朋友可以参考下
    2022-10-10
  • k8s安装calico时如何选择网卡问题

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

    这篇文章主要介绍了k8s安装calico时如何选择网卡问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • IPVS下CoreDNS滚动更新解析失败原理探究

    IPVS下CoreDNS滚动更新解析失败原理探究

    这篇文章主要为大家介绍了IPVS下CoreDNS滚动更新解析失败原理探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • K8S单节点部署及集群部署过程

    K8S单节点部署及集群部署过程

    这篇文章主要介绍了K8S单节点部署及集群部署过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • k8s中kubeconfig的配置以及使用详解

    k8s中kubeconfig的配置以及使用详解

    每当与集群交互的时候少不了的是身份认证,使用kubeconfig(即证书)和token两种认证方式是最简单也最通用的认证方式,下面这篇文章主要给大家介绍了关于k8s中kubeconfig的配置以及使用的相关资料,需要的朋友可以参考下
    2022-01-01
  • k8s1.20二进制安装实践

    k8s1.20二进制安装实践

    这篇文章详细介绍了如何在CentOS 7.9上部署Kubernetes 1.20.0集群,包括系统环境配置、基本组件安装、证书生成、Kubernetes组件配置、高可用配置、Node节点配置、安装Calico、CoreDNS、MetricsServer以及集群验证等步骤
    2026-03-03
  • StatefulSet的每个Pod单独创建Service实践

    StatefulSet的每个Pod单独创建Service实践

    本文介绍了如何为StatefulSet的每个Pod创建独立的Service,并提供了一个示例脚本,以批量生成Service定义,通过这种方式,可以实现从集群外部访问每个Pod的功能,并且可以根据需要配置不同的Service类型(如NodePort、LoadBalancer、ClusterIP+Ingress等)
    2026-01-01
  • 一文详解基于Kubescape进行Kubernetes安全加固

    一文详解基于Kubescape进行Kubernetes安全加固

    这篇文章主要为大家介绍了基于Kubescape进行Kubernetes安全加固详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02

最新评论