乔德亮 發表於 2025-5-7 19:08:00

Kubernetes 调度器打分算法详解:LeastAllocated 与 NodeAffinity

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