3. 节点资源调度策略:NodeResourcesFit、NodeResourcesBalancedAllocation 的评分机制与调优参数

在 Kubernetes 调度过程中,节点资源是决定 Pod 能否运行以及运行效率的核心因素。kube-scheduler 通过 NodeResourcesFit 和 NodeResourcesBalancedAllocation 两个插件,分别从“资源充足性”和“资源均衡性”两个维度对节点进行评分。理解它们的评分机制与调优参数,是精细化调度策略的基础。

3.1 NodeResourcesFit:资源充足性评分

NodeResourcesFit 插件检查节点是否满足 Pod 的 资源请求(Requests),并根据资源利用率进行打分。它支持两种评分策略:LeastAllocated(默认)和 MostAllocated。

3.1.1 评分策略对比

策略 核心逻辑 适用场景 默认权重
LeastAllocated 优先选择资源利用率低的节点,倾向于将 Pod 分散到不同节点 负载均衡、避免热点、提高集群整体资源利用率 1
MostAllocated 优先选择资源利用率高的节点,倾向于将 Pod 集中部署 节省资源、减少节点碎片、降低集群管理成本 1

3.1.2 评分计算公式

对于每种资源类型(CPU、内存等),NodeResourcesFit 计算一个分数,然后按权重加权求和。以 LeastAllocated 为例:

// 对于单个资源类型
score = (1 - (节点已分配资源量 / 节点总资源量)) * MaxNodeScore

// 最终分数 = 各资源类型分数的加权平均
finalScore = (score_cpu * weight_cpu + score_memory * weight_memory) / (weight_cpu + weight_memory)

其中 MaxNodeScore 默认为 100。分数越高,节点越优先被选中。

3.1.3 调优参数

通过 KubeSchedulerConfiguration 可以调整 NodeResourcesFit 的行为:

apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
  - schedulerName: default-scheduler
    plugins:
      score:
        enabled:
          - name: NodeResourcesFit
            weight: 2  # 调整权重,影响最终评分占比
    pluginConfig:
      - name: NodeResourcesFit
        args:
          scoringStrategy:
            type: LeastAllocated  # 或 MostAllocated
            resources:
              - name: cpu
                weight: 1
              - name: memory
                weight: 1
              - name: ephemeral-storage
                weight: 0  # 忽略临时存储评分
调优建议: 如果集群中 Pod 资源请求差异较大,建议将 ephemeral-storage 的权重设为 0,避免临时存储干扰 CPU/内存的调度决策。

3.2 NodeResourcesBalancedAllocation:资源均衡性评分

NodeResourcesBalancedAllocation 插件衡量节点上 各类资源利用率之间的均衡程度。它倾向于选择 CPU 和内存利用率相近的节点,避免出现“CPU 打满但内存空闲”或“内存打满但 CPU 空闲”的不均衡状态。

3.2.1 评分机制

该插件计算节点上 CPU 和内存利用率的 标准差,标准差越小,分数越高。公式如下:

// 计算 CPU 和内存的利用率
cpuUtilization = 节点已分配CPU / 节点总CPU
memoryUtilization = 节点已分配内存 / 节点总内存

// 计算平均利用率
avgUtilization = (cpuUtilization + memoryUtilization) / 2

// 计算标准差
stdDev = sqrt(((cpuUtilization - avgUtilization)^2 + (memoryUtilization - avgUtilization)^2) / 2)

// 最终分数
score = (1 - stdDev) * MaxNodeScore

分数范围 0~100,分数越高表示资源分配越均衡。

3.2.2 调优参数

NodeResourcesBalancedAllocation 的配置相对简单,主要调整其 权重:

apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
  - schedulerName: default-scheduler
    plugins:
      score:
        enabled:
          - name: NodeResourcesBalancedAllocation
            weight: 1  # 默认权重为1,可根据场景调高或调低
注意: 该插件仅支持 CPU 和内存两种资源类型,不支持自定义资源(如 GPU、临时存储)。如果集群中 GPU 资源是关键瓶颈,建议配合 NodeResourcesFit 的 MostAllocated 策略使用。

3.3 评分机制对比与协同

两个插件从不同角度评估节点,实际调度中会 叠加评分。下表总结了它们的核心差异:

维度 NodeResourcesFit NodeResourcesBalancedAllocation
关注点 资源是否充足、利用率高低 资源利用率是否均衡
评分依据 已分配资源量 / 总资源量 CPU 与内存利用率的标准差
适用场景 通用场景,避免节点过载或碎片 混合负载场景,避免资源倾斜
可调参数 策略类型、资源权重、评分类型 插件权重
默认权重 1 1

3.4 评分流程与协同工作

下图展示了 kube-scheduler 在评分阶段如何调用这两个插件,并最终汇总分数:

NodeResourcesFit 与 NodeResourcesBalancedAllocation 评分协同流程 候选节点列表 NodeResourcesFit LeastAllocated / MostAllocated NodeResourcesBalancedAllocation CPU/内存利用率标准差 资源充足性分数 (0~100) 资源均衡性分数 (0~100) 加权汇总 finalScore = fitScore * weight_fit + balScore * weight_bal 最优节点选择

3.5 实战调优案例

场景: 某在线业务集群,Pod 资源请求差异大(部分 Pod 高 CPU 低内存,部分低 CPU 高内存),希望避免节点资源倾斜。

调优方案:

  1. 启用 NodeResourcesBalancedAllocation,权重设为 2,强调资源均衡性。
  2. NodeResourcesFit 使用 LeastAllocated 策略,权重设为 1,避免节点过载。
  3. 将 ephemeral-storage 权重设为 0,避免干扰。
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
  - schedulerName: default-scheduler
    plugins:
      score:
        enabled:
          - name: NodeResourcesFit
            weight: 1
          - name: NodeResourcesBalancedAllocation
            weight: 2
    pluginConfig:
      - name: NodeResourcesFit
        args:
          scoringStrategy:
            type: LeastAllocated
            resources:
              - name: cpu
                weight: 1
              - name: memory
                weight: 1
              - name: ephemeral-storage
                weight: 0
验证方法: 部署后观察节点 CPU 和内存利用率的 标准差。如果标准差持续下降,说明资源均衡性得到改善。可以使用 kubectl top nodes 配合 Prometheus 监控验证。