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 # 忽略临时存储评分
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,可根据场景调高或调低
NodeResourcesFit 的 MostAllocated 策略使用。
3.3 评分机制对比与协同
两个插件从不同角度评估节点,实际调度中会 叠加评分。下表总结了它们的核心差异:
| 维度 | NodeResourcesFit | NodeResourcesBalancedAllocation |
|---|---|---|
| 关注点 | 资源是否充足、利用率高低 | 资源利用率是否均衡 |
| 评分依据 | 已分配资源量 / 总资源量 | CPU 与内存利用率的标准差 |
| 适用场景 | 通用场景,避免节点过载或碎片 | 混合负载场景,避免资源倾斜 |
| 可调参数 | 策略类型、资源权重、评分类型 | 插件权重 |
| 默认权重 | 1 | 1 |
3.4 评分流程与协同工作
下图展示了 kube-scheduler 在评分阶段如何调用这两个插件,并最终汇总分数:
3.5 实战调优案例
调优方案:
- 启用
NodeResourcesBalancedAllocation,权重设为 2,强调资源均衡性。 NodeResourcesFit使用LeastAllocated策略,权重设为 1,避免节点过载。- 将
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
kubectl top nodes 配合 Prometheus 监控验证。