Scheduler的两种调度算法

Kubernetes调度器核心机制深度解析(生产环境实战指南)

在Kubernetes集群中,调度器(Scheduler) 是决定Pod如何分配到Worker节点的核心组件。它的作用类似于机场的智能调度系统:既要确保每个航班(Pod)有合适的停机位(节点),又要全局考虑资源利用率和容灾能力。调度过程并非简单的“随机分配”,而是通过两阶段精密算法完成:预选(Predicates)优选(Priorities)。以下内容结合生产环境经验,解析其核心逻辑。


一、预选阶段(Predicates):硬性条件筛选

预选阶段的目标是快速过滤掉绝对不符合条件的节点,类似于求职简历的初筛。只有通过所有“必选项”的节点才能进入下一轮。

1. 核心筛选维度
  • 资源硬性检查

    • 节点必须满足Pod声明的requests资源(CPU/Memory/Ephemeral Storage)。
    • 扩展资源检查(如GPU卡数、FPGA等)。
      生产经验:资源不足是调度失败的常见原因,需监控节点资源碎片。
  • 节点标签与污点匹配

    • 检查nodeSelectornodeAffinity是否匹配节点标签。
    • 节点污点(Taints)必须被Pod的tolerations容忍。
      示例:GPU节点通常有accelerator=gpu标签和NoSchedule污点。
  • 存储与拓扑约束

    • 持久卷(PV)的区域(Zone)或可用区必须与节点匹配。
    • 检查CSI存储插件的容量和访问模式。
  • 安全策略

    • PodSecurityPolicy(PSP)或新一代的Pod Security Standards(PSS)。
    • SELinux、AppArmor等安全上下文(SecurityContext)。
2. 生产环境典型场景

案例1:部署数据库Pod

  • 必须选择带有disk=ssd标签的节点。
  • 需要容忍节点的dedicated=db:NoSchedule污点。
  • 检查内存是否满足8Girequests声明。

案例2:多可用区部署

  • 通过topologySpreadConstraints限制Pod在多个可用区均匀分布。

二、优选阶段(Priorities):评分择优

通过预选的节点进入评分阶段,调度器为每个节点打分(0-10分),最终选择得分最高的节点。若多个节点得分相同,则随机选择。

1. 核心评分策略
  • 资源平衡策略

    • LeastAllocated:优先选择资源利用率最低的节点(默认策略)。
    • BalancedResourceAllocation:避免CPU和内存使用率差异过大。
  • 拓扑感知调度

    • Zone/Region Spread:跨可用区部署以提高容灾能力。
    • NodeAffinity权重:满足preferredDuringScheduling的节点加分。
  • 节点亲和性/反亲和性

    • 优先选择与现有Pod亲和性强的节点(如同节点部署缓存和计算Pod)。
    • 避免与反亲和性Pod共存(如避免同一节点部署多个高负载服务)。
  • 自定义扩展

    • 通过Prioritizer插件实现业务专属逻辑(如基于实时负载的动态调度)。
2. 生产环境调优技巧

场景1:避免节点过载

  • 启用PodTopologySpread插件,设置maxSkew=1,确保Pod均匀分布。
  • 配置资源limits防止单个Pod耗尽节点资源。

场景2:优先级抢占

  • 定义PriorityClass,高优先级Pod可抢占低优先级Pod的资源。
  • 注意:被抢占的Pod会进入Terminating状态,需业务容忍短暂中断。

三、高级调度实战(生产级配置)

1. 调度器扩展

Kubernetes支持通过调度框架(Scheduler Framework)自定义插件:

apiVersion: kubescheduler.config.k8s.io/v1beta3
kind: KubeSchedulerConfiguration
profiles:
  - schedulerName: custom-scheduler
    plugins:
      preFilter:
        enabled:
          - name: "SamplePreFilterPlugin"
      score:
        enabled:
          - name: "SampleScorePlugin" 
            weight: 2
2. 常见问题排查
  • Pending Pod诊断

    • kubectl describe pod <pod-name>:查看Events中的调度失败原因。
    • kubectl get events --field-selector involvedObject.name=<pod-name>
  • 节点资源碎片

    • 使用kube-resource-report生成资源利用率报告。
    • 启用Descheduler重新平衡已调度Pod。

四、总结

调度器的核心逻辑可归纳为:

  1. 预选(Predicates):过滤掉不符合硬性条件的节点。
  2. 优选(Priorities):对候选节点评分,选择最优目标。

生产环境中需结合监控(Prometheus)、自动化(Cluster Autoscaler)和策略调优,才能实现高效稳定的调度。理解这一机制,是优化Kubernetes集群性能的关键一步。

posted on 2025-03-07 09:14  Leo-Yide  阅读(133)  评论(0)    收藏  举报