Kubernetes 调度器打分算法详解:LeastAllocated 与 NodeAffinity
1️⃣ NodeResourcesLeastAllocated(资源最少分配)
📌 目标
优先将 Pod 调度到资源使用率最低的节点,防止热点节点,尽量实现负载均衡。
🧠 打分算法原理
对每个节点计算 CPU 和内存的使用率,然后反向打分:
score = (1 - (cpuRequested / cpuCapacity)) * 50 +
(1 - (memRequested / memCapacity)) * 50
-
分数范围:0 ~ 100
-
使用率越低,得分越高
-
CPU 和内存权重各 50%
🧮 每个部分含义
| 部分 | 说明 | 意义 |
|---|---|---|
cpuRequested |
已被调度的 Pod 请求的 CPU 总和 | 单位为 millicore |
cpuCapacity |
节点的 CPU 总容量(allocatable) | 单位为 millicore |
memRequested |
已被调度的 Pod 请求的内存总和 | 单位为 MiB/GiB |
memCapacity |
节点的内存总容量 | 单位为 MiB/GiB |
cpuRequested / cpuCapacity |
CPU 使用率 | 越高表示节点越繁忙 |
1 - (...) |
空闲度(反向) | 越高表示越适合调度 |
* 50 |
权重 | CPU 和内存各占一半 |
📊 示例
| 节点 | CPU已用/总 | Mem已用/总 | 计算得分 |
|---|---|---|---|
| node-1 | 200m / 1000m | 500Mi / 2Gi | (1-0.2)*50 + (1-0.25)*50 = 40 + 37.5 = 77.5 |
| node-2 | 500m / 1000m | 1Gi / 2Gi | (1-0.5)*50 + (1-0.5)*50 = 25 + 25 = 50 |
| node-3 | 800m / 1000m | 1.5Gi / 2Gi | (1-0.8)*50 + (1-0.75)*50 = 10 + 12.5 = 22.5 |
✅ 适用场景
-
高并发场景需要负载均衡
-
多租户系统,防止资源竞争
2️⃣ NodeAffinity(节点亲和性)
📌 目标
根据用户在 Pod 中定义的 nodeAffinity 条件打分,优先调度到匹配度高的节点。
🧠 用法示例
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
preference:
matchExpressions:
- key: zone
operator: In
values:
- us-west1
-
节点
zone=us-west1→ 得 100 分 -
节点
zone=us-east1→ 得 0 分
⚙️ 打分原理
调度器检查 Pod 的 preferredDuringScheduling... 规则:
-
匹配 → 加上对应权重
-
不匹配 → 不加分
-
最终得分范围:0 ~ 100
✅ 适用场景
-
有部署位置偏好(如某个可用区)
-
使用节点标签(如高性能/SSD 节点)
🔄 两者对比
| 维度 | LeastAllocated | NodeAffinity |
|---|---|---|
| 目的 | 资源均衡使用 | 匹配节点偏好 |
| 核心依据 | 当前节点资源使用率 | Pod 的亲和性配置 |
| 控制权 | 系统自动评估 | 用户指定策略 |
| 打分方式 | 越空闲分数越高 | 匹配越多分越高 |
| 自定义性 | 可以调整权重 | 可以自定义表达式 + 权重 |

浙公网安备 33010602011771号