<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Codes on Learning Notes</title><link>https://nianjiang.github.io/docs/51-k8s/021-Codes/</link><description>Recent content in Codes on Learning Notes</description><generator>Hugo</generator><language>zh</language><atom:link href="https://nianjiang.github.io/docs/51-k8s/021-Codes/index.xml" rel="self" type="application/rss+xml"/><item><title>Scheduler Docs</title><link>https://nianjiang.github.io/docs/51-k8s/021-Codes/09-Scheduler-Doc/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://nianjiang.github.io/docs/51-k8s/021-Codes/09-Scheduler-Doc/</guid><description>&lt;h1 id="kubernetes-调度与驱逐scheduling--eviction文档总结"&gt;
 Kubernetes 调度与驱逐（Scheduling &amp;amp; Eviction）文档总结
 &lt;a class="anchor" href="#kubernetes-%e8%b0%83%e5%ba%a6%e4%b8%8e%e9%a9%b1%e9%80%90scheduling--eviction%e6%96%87%e6%a1%a3%e6%80%bb%e7%bb%93"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;官方文档：
 &lt;a href="https://kubernetes.io/docs/concepts/scheduling-eviction/"&gt;kubernetes.io/docs/concepts/scheduling-eviction/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="一整体结构"&gt;
 一、整体结构
 &lt;a class="anchor" href="#%e4%b8%80%e6%95%b4%e4%bd%93%e7%bb%93%e6%9e%84"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;该文档页面是 Kubernetes &lt;strong&gt;调度、抢占与驱逐&lt;/strong&gt; 三大主题的导航入口，涵盖以下子主题：&lt;/p&gt;
&lt;h3 id="scheduling调度"&gt;
 Scheduling（调度）
 &lt;a class="anchor" href="#scheduling%e8%b0%83%e5%ba%a6"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: center"&gt;序号&lt;/th&gt;
 &lt;th&gt;主题&lt;/th&gt;
 &lt;th&gt;说明&lt;/th&gt;
 &lt;th&gt;Note&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;1&lt;/td&gt;
 &lt;td&gt;
 &lt;a href="https://kubernetes.io/docs/concepts/scheduling-eviction/kube-scheduler/"&gt;Kubernetes Scheduler&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;默认调度器&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;2&lt;/td&gt;
 &lt;td&gt;
 &lt;a href="https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/"&gt;Assigning Pods to Nodes&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;手动指定节点&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;3&lt;/td&gt;
 &lt;td&gt;
 &lt;a href="https://kubernetes.io/docs/concepts/scheduling-eviction/pod-overhead/"&gt;Pod Overhead&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Pod 额外开销&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;4&lt;/td&gt;
 &lt;td&gt;
 &lt;a href="https://kubernetes.io/docs/concepts/scheduling-eviction/topology-spread-constraints/"&gt;Pod Topology Spread Constraints&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Pod 拓扑分散约束&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;5&lt;/td&gt;
 &lt;td&gt;
 &lt;a href="https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/"&gt;Taints and Tolerations&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;污点与容忍&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;6&lt;/td&gt;
 &lt;td&gt;
 &lt;a href="https://kubernetes.io/docs/concepts/scheduling-eviction/scheduling-framework/"&gt;Scheduling Framework&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;调度框架（插件化架构）&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;7&lt;/td&gt;
 &lt;td&gt;
 &lt;a href="https://kubernetes.io/docs/concepts/scheduling-eviction/dynamic-resource-allocation/"&gt;Dynamic Resource Allocation&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;动态资源分配&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;8&lt;/td&gt;
 &lt;td&gt;
 &lt;a href="https://kubernetes.io/docs/concepts/scheduling-eviction/scheduler-perf-tuning/"&gt;Scheduler Performance Tuning&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;调度器性能调优&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;9&lt;/td&gt;
 &lt;td&gt;
 &lt;a href="https://kubernetes.io/docs/concepts/scheduling-eviction/resource-bin-packing/"&gt;Resource Bin Packing&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;扩展资源装箱&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;10&lt;/td&gt;
 &lt;td&gt;
 &lt;a href="https://kubernetes.io/docs/concepts/scheduling-eviction/pod-scheduling-readiness/"&gt;Pod Scheduling Readiness&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Pod 调度就绪&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;11&lt;/td&gt;
 &lt;td&gt;
 &lt;a href="https://kubernetes.io/docs/concepts/scheduling-eviction/pod-group-scheduling/"&gt;PodGroup Scheduling&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;PodGroup 调度&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;12&lt;/td&gt;
 &lt;td&gt;
 &lt;a href="https://kubernetes.io/docs/concepts/scheduling-eviction/gang-scheduling/"&gt;Gang Scheduling&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Gang 调度&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;13&lt;/td&gt;
 &lt;td&gt;
 &lt;a href="https://kubernetes.io/docs/concepts/scheduling-eviction/topology-aware-scheduling/"&gt;Topology-aware Scheduling&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;拓扑感知调度&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;14&lt;/td&gt;
 &lt;td&gt;
 &lt;a href="https://kubernetes.io/docs/concepts/scheduling-eviction/workload-aware-preemption/"&gt;Workload-Aware Preemption&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;工作负载感知抢占&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;15&lt;/td&gt;
 &lt;td&gt;
 &lt;a href="https://github.com/kubernetes-sigs/descheduler#descheduler-for-kubernetes"&gt;Descheduler&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;反调度器&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;16&lt;/td&gt;
 &lt;td&gt;
 &lt;a href="https://kubernetes.io/docs/concepts/scheduling-eviction/node-declared-features/"&gt;Node Declared Features&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;节点声明特性&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="pod-disruptionpod-中断"&gt;
 Pod Disruption（Pod 中断）
 &lt;a class="anchor" href="#pod-disruptionpod-%e4%b8%ad%e6%96%ad"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th style="text-align: center"&gt;序号&lt;/th&gt;
 &lt;th&gt;主题&lt;/th&gt;
 &lt;th&gt;说明&lt;/th&gt;
 &lt;th&gt;Note&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;1&lt;/td&gt;
 &lt;td&gt;
 &lt;a href="https://kubernetes.io/docs/concepts/scheduling-eviction/pod-priority-preemption/"&gt;Pod Priority and Preemption&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;优先级与抢占&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;2&lt;/td&gt;
 &lt;td&gt;
 &lt;a href="https://kubernetes.io/docs/concepts/scheduling-eviction/node-pressure-eviction/"&gt;Node-pressure Eviction&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;节点压力驱逐&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td style="text-align: center"&gt;3&lt;/td&gt;
 &lt;td&gt;
 &lt;a href="https://kubernetes.io/docs/concepts/scheduling-eviction/api-eviction/"&gt;API-initiated Eviction&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;API 发起的驱逐&lt;/td&gt;
 &lt;td&gt;✅&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="二调度核心kube-scheduler"&gt;
 二、调度核心：kube-scheduler
 &lt;a class="anchor" href="#%e4%ba%8c%e8%b0%83%e5%ba%a6%e6%a0%b8%e5%bf%83kube-scheduler"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="工作原理"&gt;
 工作原理
 &lt;a class="anchor" href="#%e5%b7%a5%e4%bd%9c%e5%8e%9f%e7%90%86"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;p&gt;kube-scheduler 负责为&lt;strong&gt;未分配节点的 Pod&lt;/strong&gt; 选择最佳节点，采用&lt;strong&gt;两步法&lt;/strong&gt;：&lt;/p&gt;</description></item><item><title>Scheduler</title><link>https://nianjiang.github.io/docs/51-k8s/021-Codes/10-Scheduler/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://nianjiang.github.io/docs/51-k8s/021-Codes/10-Scheduler/</guid><description>&lt;h1 id="kubernetes-scheduler-代码结构"&gt;
 Kubernetes Scheduler 代码结构
 &lt;a class="anchor" href="#kubernetes-scheduler-%e4%bb%a3%e7%a0%81%e7%bb%93%e6%9e%84"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;仓库地址：
 &lt;a href="https://github.com/kubernetes/kubernetes"&gt;github.com/kubernetes/kubernetes&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="整体代码布局"&gt;
 整体代码布局
 &lt;a class="anchor" href="#%e6%95%b4%e4%bd%93%e4%bb%a3%e7%a0%81%e5%b8%83%e5%b1%80"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;kubernetes/
├── cmd/kube-scheduler/ # 入口：二进制启动命令
│ ├── scheduler.go # main() 入口
│ └── app/ # cobra 命令、选项解析、初始化
│
└── pkg/scheduler/ # 核心实现
 ├── scheduler.go # Scheduler 主结构体 + Run()
 ├── schedule_one.go # 单 Pod 调度完整流程
 ├── schedule_one_podgroup.go # PodGroup（批量调度）
 ├── eventhandlers.go # Informer 事件处理
 ├── extender.go # 外部扩展调度器
 │
 ├── framework/ # 调度框架（插件系统）
 │ ├── interface.go # 所有扩展点接口定义
 │ ├── types.go # 核心类型（NodeInfo、CycleState 等）
 │ ├── cycle_state.go # 调度周期状态传递
 │ ├── runtime/ # 框架运行时（插件注册/调用）
 │ ├── plugins/ # 内置插件实现
 │ └── preemption/ # 抢占逻辑
 │
 ├── apis/config/ # KubeSchedulerConfiguration API
 ├── profile/ # 多调度 Profile 支持
 ├── metrics/ # Prometheus 指标
 ├── backend/ # 调度队列后端
 ├── util/ # 工具函数
 └── testing/ # 测试工具
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="核心文件解析"&gt;
 核心文件解析
 &lt;a class="anchor" href="#%e6%a0%b8%e5%bf%83%e6%96%87%e4%bb%b6%e8%a7%a3%e6%9e%90"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="1-schedulergo--主结构体与启动"&gt;
 1. &lt;code&gt;scheduler.go&lt;/code&gt; — 主结构体与启动
 &lt;a class="anchor" href="#1-schedulergo--%e4%b8%bb%e7%bb%93%e6%9e%84%e4%bd%93%e4%b8%8e%e5%90%af%e5%8a%a8"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Scheduler&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Cache&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;internalcache&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Cache&lt;/span&gt; &lt;span style="color:#75715e"&gt;// 节点/Pod 缓存&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Extenders&lt;/span&gt; []&lt;span style="color:#a6e22e"&gt;fwk&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Extender&lt;/span&gt; &lt;span style="color:#75715e"&gt;// 外部调度扩展&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;NextEntity&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt;() (&lt;span style="color:#a6e22e"&gt;QueuedEntityInfo&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;error&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// 从队列取 Pod&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;SchedulePod&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt;() (&lt;span style="color:#a6e22e"&gt;ScheduleResult&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;error&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// 核心调度函数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;FailureHandler&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;FailureHandlerFn&lt;/span&gt; &lt;span style="color:#75715e"&gt;// 失败处理&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;SchedulingQueue&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;internalqueue&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;SchedulingQueue&lt;/span&gt; &lt;span style="color:#75715e"&gt;// 调度队列&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Profiles&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;profile&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Map&lt;/span&gt; &lt;span style="color:#75715e"&gt;// 多 Profile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;StopEverything&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;chan&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt;{} &lt;span style="color:#75715e"&gt;// 停止信号&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;sched&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;Scheduler&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;Run&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;ctx&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;context&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Context&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sched&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;SchedulingQueue&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Run&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;logger&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// 启动调度队列&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;go&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;wait&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;UntilWithContext&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;ctx&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;sched&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;scheduleOne&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// 无限循环调度&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;核心逻辑&lt;/strong&gt;：&lt;code&gt;Run()&lt;/code&gt; 启动后不断调用 &lt;code&gt;scheduleOne()&lt;/code&gt; 从队列取 Pod 并调度。&lt;/p&gt;</description></item><item><title>Scheduler-score</title><link>https://nianjiang.github.io/docs/51-k8s/021-Codes/11-Score/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://nianjiang.github.io/docs/51-k8s/021-Codes/11-Score/</guid><description>&lt;h1 id="kubernetes-scheduler-score-打分机制深度解析"&gt;
 Kubernetes Scheduler Score 打分机制深度解析
 &lt;a class="anchor" href="#kubernetes-scheduler-score-%e6%89%93%e5%88%86%e6%9c%ba%e5%88%b6%e6%b7%b1%e5%ba%a6%e8%a7%a3%e6%9e%90"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;hr&gt;
&lt;h2 id="1-score-在调度流程中的位置"&gt;
 1. Score 在调度流程中的位置
 &lt;a class="anchor" href="#1-score-%e5%9c%a8%e8%b0%83%e5%ba%a6%e6%b5%81%e7%a8%8b%e4%b8%ad%e7%9a%84%e4%bd%8d%e7%bd%ae"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Filter（过滤不可用节点）
 ↓
Score（对可用节点打分） ← 我们在这里
 ↓
Select（选择最高分节点）
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Score 阶段的输入是&lt;strong&gt;经过 Filter 后所有可用的节点列表&lt;/strong&gt;，输出是&lt;strong&gt;每个节点的加权总分&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="2-核心数据结构"&gt;
 2. 核心数据结构
 &lt;a class="anchor" href="#2-%e6%a0%b8%e5%bf%83%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="21-分数相关常量"&gt;
 2.1 分数相关常量
 &lt;a class="anchor" href="#21-%e5%88%86%e6%95%b0%e7%9b%b8%e5%85%b3%e5%b8%b8%e9%87%8f"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;MinNodeScore&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int64&lt;/span&gt; = &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#75715e"&gt;// 最低分&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;MaxNodeScore&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int64&lt;/span&gt; = &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt; &lt;span style="color:#75715e"&gt;// 最高分（单个插件）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="22-打分结果结构"&gt;
 2.2 打分结果结构
 &lt;a class="anchor" href="#22-%e6%89%93%e5%88%86%e7%bb%93%e6%9e%9c%e7%bb%93%e6%9e%84"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 单个插件对某个节点的打分&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;NodeScore&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Name&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt; &lt;span style="color:#75715e"&gt;// 节点名&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Score&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int64&lt;/span&gt; &lt;span style="color:#75715e"&gt;// 分数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 单个插件的打分结果&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;PluginScore&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Name&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt; &lt;span style="color:#75715e"&gt;// 插件名&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Score&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int64&lt;/span&gt; &lt;span style="color:#75715e"&gt;// 加权后的分数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 某个节点的所有打分结果&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;NodePluginScores&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Name&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;string&lt;/span&gt; &lt;span style="color:#75715e"&gt;// 节点名&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Scores&lt;/span&gt; []&lt;span style="color:#a6e22e"&gt;PluginScore&lt;/span&gt; &lt;span style="color:#75715e"&gt;// 各插件打分明细&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;TotalScore&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int64&lt;/span&gt; &lt;span style="color:#75715e"&gt;// 加权总分&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="3-scoreplugin-接口定义"&gt;
 3. ScorePlugin 接口定义
 &lt;a class="anchor" href="#3-scoreplugin-%e6%8e%a5%e5%8f%a3%e5%ae%9a%e4%b9%89"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// ScorePlugin 是打分插件的接口&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ScorePlugin&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Plugin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// Score 对单个节点打分&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Score&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;ctx&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;context&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Context&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;state&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;CycleState&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;pod&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;v1&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Pod&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;nodeInfo&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;NodeInfo&lt;/span&gt;) (&lt;span style="color:#66d9ef"&gt;int64&lt;/span&gt;, &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;Status&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// ScoreExtensions 返回分数归一化扩展（可选）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ScoreExtensions&lt;/span&gt;() &lt;span style="color:#a6e22e"&gt;ScoreExtensions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// ScoreExtensions 是分数归一化扩展接口&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ScoreExtensions&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// NormalizeScore 在所有节点打分完成后进行归一化&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;NormalizeScore&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;ctx&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;context&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Context&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;state&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;CycleState&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;pod&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;v1&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Pod&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;scores&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;NodeScoreList&lt;/span&gt;) &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;Status&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="4-score-执行流程核心代码"&gt;
 4. Score 执行流程（核心代码）
 &lt;a class="anchor" href="#4-score-%e6%89%a7%e8%a1%8c%e6%b5%81%e7%a8%8b%e6%a0%b8%e5%bf%83%e4%bb%a3%e7%a0%81"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="41-入口函数-prioritizenodes"&gt;
 4.1 入口函数 &lt;code&gt;prioritizeNodes()&lt;/code&gt;
 &lt;a class="anchor" href="#41-%e5%85%a5%e5%8f%a3%e5%87%bd%e6%95%b0-prioritizenodes"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// schedule_one.go&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;prioritizeNodes&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ctx&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;context&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Context&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;extenders&lt;/span&gt; []&lt;span style="color:#a6e22e"&gt;fwk&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Extender&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;schedFramework&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;framework&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Framework&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;state&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fwk&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;CycleState&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;pod&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;v1&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Pod&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;nodes&lt;/span&gt; []&lt;span style="color:#a6e22e"&gt;fwk&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;NodeInfo&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;) ([]&lt;span style="color:#a6e22e"&gt;fwk&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;NodePluginScores&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;error&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 1. 没有任何打分插件时，所有节点默认得 1 分&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; len(&lt;span style="color:#a6e22e"&gt;extenders&lt;/span&gt;) &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; !&lt;span style="color:#a6e22e"&gt;schedFramework&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;HasScorePlugins&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; make([]&lt;span style="color:#a6e22e"&gt;fwk&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;NodePluginScores&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, len(&lt;span style="color:#a6e22e"&gt;nodes&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;range&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nodes&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt; = append(&lt;span style="color:#a6e22e"&gt;result&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;fwk&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;NodePluginScores&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Name&lt;/span&gt;: &lt;span style="color:#a6e22e"&gt;nodes&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;].&lt;span style="color:#a6e22e"&gt;Node&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;Name&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;TotalScore&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;result&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 2. 执行 PreScore 插件（预处理）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;preScoreStatus&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;schedFramework&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;RunPreScorePlugins&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;ctx&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;state&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;pod&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;nodes&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 3. 执行 Score 插件（并行打分）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;nodesScores&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;scoreStatus&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;schedFramework&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;RunScorePlugins&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;ctx&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;state&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;pod&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;nodes&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 4. 执行 Extender 打分（外部调度器）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; len(&lt;span style="color:#a6e22e"&gt;extenders&lt;/span&gt;) &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 并行调用所有 Extender 的 Prioritize 方法&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nodesScores&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="42-runscoreplugins-详细实现"&gt;
 4.2 &lt;code&gt;RunScorePlugins()&lt;/code&gt; 详细实现
 &lt;a class="anchor" href="#42-runscoreplugins-%e8%af%a6%e7%bb%86%e5%ae%9e%e7%8e%b0"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// runtime/framework.go&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;f&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;frameworkImpl&lt;/span&gt;) &lt;span style="color:#a6e22e"&gt;RunScorePlugins&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;ctx&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;context&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Context&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;state&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fwk&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;CycleState&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;pod&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;v1&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Pod&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;nodes&lt;/span&gt; []&lt;span style="color:#a6e22e"&gt;fwk&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;NodeInfo&lt;/span&gt;) ([]&lt;span style="color:#a6e22e"&gt;fwk&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;NodePluginScores&lt;/span&gt;, &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;fwk&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Status&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 初始化结果结构&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;allNodePluginScores&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; make([]&lt;span style="color:#a6e22e"&gt;fwk&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;NodePluginScores&lt;/span&gt;, len(&lt;span style="color:#a6e22e"&gt;nodes&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;plugins&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; make([]&lt;span style="color:#a6e22e"&gt;fwk&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;ScorePlugin&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;numPlugins&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;pluginToNodeScores&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; make(&lt;span style="color:#66d9ef"&gt;map&lt;/span&gt;[&lt;span style="color:#66d9ef"&gt;string&lt;/span&gt;]&lt;span style="color:#a6e22e"&gt;fwk&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;NodeScoreList&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;numPlugins&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// ============ 第一阶段：并行 Score ============&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 对每个节点并行执行所有插件的 Score() 方法&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;f&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Parallelizer&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;Until&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;ctx&lt;/span&gt;, len(&lt;span style="color:#a6e22e"&gt;nodes&lt;/span&gt;), &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;index&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;nodeInfo&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nodes&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;index&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;_&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;pl&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;range&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;plugins&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 调用插件的 Score 方法&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;s&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;status&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;f&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;runScorePlugin&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;ctx&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;pl&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;state&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;pod&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;nodeInfo&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 记录该插件对该节点的打分&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;pluginToNodeScores&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;pl&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Name&lt;/span&gt;()][&lt;span style="color:#a6e22e"&gt;index&lt;/span&gt;] = &lt;span style="color:#a6e22e"&gt;fwk&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;NodeScore&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Name&lt;/span&gt;: &lt;span style="color:#a6e22e"&gt;nodeInfo&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Node&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;Name&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Score&lt;/span&gt;: &lt;span style="color:#a6e22e"&gt;s&lt;/span&gt;, &lt;span style="color:#75715e"&gt;// 原始分数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }, &lt;span style="color:#a6e22e"&gt;metrics&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Score&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// ============ 第二阶段：并行 NormalizeScore ============&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 对每个插件并行执行 NormalizeScore()（如果实现了 ScoreExtensions）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;f&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Parallelizer&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;Until&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;ctx&lt;/span&gt;, len(&lt;span style="color:#a6e22e"&gt;plugins&lt;/span&gt;), &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;index&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;pl&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;plugins&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;index&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;pl&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;ScoreExtensions&lt;/span&gt;() &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#75715e"&gt;// 该插件没有实现归一化&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;nodeScoreList&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;pluginToNodeScores&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;pl&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Name&lt;/span&gt;()]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 调用归一化方法，将分数调整到 [0, MaxNodeScore] 范围&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;status&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;pl&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;ScoreExtensions&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;NormalizeScore&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;ctx&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;state&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;pod&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;nodeScoreList&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }, &lt;span style="color:#a6e22e"&gt;metrics&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Score&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// ============ 第三阶段：并行加权计算 ============&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 对每个节点并行计算加权总分&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;f&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Parallelizer&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;Until&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;ctx&lt;/span&gt;, len(&lt;span style="color:#a6e22e"&gt;nodes&lt;/span&gt;), &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;index&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;nodePluginScores&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fwk&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;NodePluginScores&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Name&lt;/span&gt;: &lt;span style="color:#a6e22e"&gt;nodes&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;index&lt;/span&gt;].&lt;span style="color:#a6e22e"&gt;Node&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;Name&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Scores&lt;/span&gt;: make([]&lt;span style="color:#a6e22e"&gt;fwk&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;PluginScore&lt;/span&gt;, len(&lt;span style="color:#a6e22e"&gt;plugins&lt;/span&gt;)),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;pl&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;range&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;plugins&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;weight&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;f&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;scorePluginWeight&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;pl&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Name&lt;/span&gt;()] &lt;span style="color:#75715e"&gt;// 从配置读取权重&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;score&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;pluginToNodeScores&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;pl&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Name&lt;/span&gt;()][&lt;span style="color:#a6e22e"&gt;index&lt;/span&gt;].&lt;span style="color:#a6e22e"&gt;Score&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 验证分数范围&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;score&lt;/span&gt; &amp;gt; &lt;span style="color:#a6e22e"&gt;fwk&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;MaxNodeScore&lt;/span&gt; &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;score&lt;/span&gt; &amp;lt; &lt;span style="color:#a6e22e"&gt;fwk&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;MinNodeScore&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 错误：分数超出范围&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 加权分数 = 原始分数 × 权重&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;weightedScore&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;score&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; int64(&lt;span style="color:#a6e22e"&gt;weight&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;nodePluginScores&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Scores&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;] = &lt;span style="color:#a6e22e"&gt;fwk&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;PluginScore&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Name&lt;/span&gt;: &lt;span style="color:#a6e22e"&gt;pl&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Name&lt;/span&gt;(),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Score&lt;/span&gt;: &lt;span style="color:#a6e22e"&gt;weightedScore&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;nodePluginScores&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;TotalScore&lt;/span&gt; &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;weightedScore&lt;/span&gt; &lt;span style="color:#75715e"&gt;// 累加总分&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;allNodePluginScores&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;index&lt;/span&gt;] = &lt;span style="color:#a6e22e"&gt;nodePluginScores&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }, &lt;span style="color:#a6e22e"&gt;metrics&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Score&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;allNodePluginScores&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="5-内置打分插件示例"&gt;
 5. 内置打分插件示例
 &lt;a class="anchor" href="#5-%e5%86%85%e7%bd%ae%e6%89%93%e5%88%86%e6%8f%92%e4%bb%b6%e7%a4%ba%e4%be%8b"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;h3 id="51-插件列表"&gt;
 5.1 插件列表
 &lt;a class="anchor" href="#51-%e6%8f%92%e4%bb%b6%e5%88%97%e8%a1%a8"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;插件&lt;/th&gt;
 &lt;th&gt;策略&lt;/th&gt;
 &lt;th&gt;说明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;NodeResourcesFit&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;LeastAllocated / MostAllocated / BalancedAllocation&lt;/td&gt;
 &lt;td&gt;资源打分&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;InterPodAffinity&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;-&lt;/td&gt;
 &lt;td&gt;Pod 间亲和性打分&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;PodTopologySpread&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;-&lt;/td&gt;
 &lt;td&gt;拓扑分散约束打分&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;NodeAffinity&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;-&lt;/td&gt;
 &lt;td&gt;节点亲和性打分&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;TaintToleration&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;-&lt;/td&gt;
 &lt;td&gt;污点容忍打分&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="52-leastallocated-打分实现"&gt;
 5.2 &lt;code&gt;LeastAllocated&lt;/code&gt; 打分实现
 &lt;a class="anchor" href="#52-leastallocated-%e6%89%93%e5%88%86%e5%ae%9e%e7%8e%b0"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// pkg/scheduler/framework/plugins/noderesources/least_allocated.go&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 核心打分函数：偏好资源使用率低的节点&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;leastResourceScorer&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;resources&lt;/span&gt; []&lt;span style="color:#a6e22e"&gt;config&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;ResourceSpec&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt;([]&lt;span style="color:#66d9ef"&gt;int64&lt;/span&gt;, []&lt;span style="color:#66d9ef"&gt;int64&lt;/span&gt;, []&lt;span style="color:#66d9ef"&gt;int64&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;int64&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;func&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;requested&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;_&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;allocable&lt;/span&gt; []&lt;span style="color:#66d9ef"&gt;int64&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;int64&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nodeScore&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;weightSum&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;range&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;requested&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;allocable&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;weight&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;resources&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;].&lt;span style="color:#a6e22e"&gt;Weight&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;resourceScore&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;leastRequestedScore&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;requested&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;], &lt;span style="color:#a6e22e"&gt;allocable&lt;/span&gt;[&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;nodeScore&lt;/span&gt; &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;resourceScore&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;weight&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;weightSum&lt;/span&gt; &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;weight&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nodeScore&lt;/span&gt; &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;weightSum&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 单个资源打分公式&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;leastRequestedScore&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;requested&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;capacity&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int64&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;int64&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;capacity&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;requested&lt;/span&gt; &amp;gt; &lt;span style="color:#a6e22e"&gt;capacity&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 公式：(capacity - requested) * MaxNodeScore / capacity&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 空闲资源越多，分数越高&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; ((&lt;span style="color:#a6e22e"&gt;capacity&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;requested&lt;/span&gt;) &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fwk&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;MaxNodeScore&lt;/span&gt;) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;capacity&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;打分示例&lt;/strong&gt;：&lt;/p&gt;</description></item><item><title>Descheduler</title><link>https://nianjiang.github.io/docs/51-k8s/021-Codes/19-Descheduler/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://nianjiang.github.io/docs/51-k8s/021-Codes/19-Descheduler/</guid><description>&lt;h1 id="descheduler-for-kubernetes--readme-总结"&gt;
 Descheduler for Kubernetes — README 总结
 &lt;a class="anchor" href="#descheduler-for-kubernetes--readme-%e6%80%bb%e7%bb%93"&gt;#&lt;/a&gt;
&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;仓库地址：
 &lt;a href="https://github.com/kubernetes-sigs/descheduler"&gt;github.com/kubernetes-sigs/descheduler&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="一什么是-descheduler"&gt;
 一、什么是 Descheduler？
 &lt;a class="anchor" href="#%e4%b8%80%e4%bb%80%e4%b9%88%e6%98%af-descheduler"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Descheduler 是 Kubernetes 的&lt;strong&gt;反调度器&lt;/strong&gt;，用于解决 kube-scheduler 无法处理的问题：当集群状态随时间变化后，已经运行的 Pod 可能不再处于最优节点上。Descheduler 根据策略&lt;strong&gt;找到并驱逐这些 Pod&lt;/strong&gt;，让它们被重新调度到更合适的节点。&lt;/p&gt;
&lt;h3 id="为什么需要-descheduler"&gt;
 为什么需要 Descheduler？
 &lt;a class="anchor" href="#%e4%b8%ba%e4%bb%80%e4%b9%88%e9%9c%80%e8%a6%81-descheduler"&gt;#&lt;/a&gt;
&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;场景&lt;/th&gt;
 &lt;th&gt;说明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;节点负载不均&lt;/td&gt;
 &lt;td&gt;部分节点过载或空闲&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;调度条件变化&lt;/td&gt;
 &lt;td&gt;节点的 taint/label 变化，亲和性不再满足&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;节点故障恢复&lt;/td&gt;
 &lt;td&gt;故障节点的 Pod 迁移到其他节点后造成聚集&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;新增节点&lt;/td&gt;
 &lt;td&gt;新节点加入集群后需要重新平衡&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：Descheduler &lt;strong&gt;只负责驱逐 Pod&lt;/strong&gt;，不负责调度。被驱逐的 Pod 由 kube-scheduler 重新调度。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="二部署方式"&gt;
 二、部署方式
 &lt;a class="anchor" href="#%e4%ba%8c%e9%83%a8%e7%bd%b2%e6%96%b9%e5%bc%8f"&gt;#&lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Descheduler 可以以 &lt;strong&gt;Job / CronJob / Deployment&lt;/strong&gt; 三种方式运行在集群中（&lt;code&gt;kube-system&lt;/code&gt; 命名空间，作为 Critical Pod 避免被驱逐）：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;方式&lt;/th&gt;
 &lt;th&gt;说明&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Job&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;执行一次后退出&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;CronJob&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;定时周期性执行&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Deployment&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;常驻运行，支持 HA（Leader Election）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;安装方式支持：&lt;strong&gt;kubectl apply&lt;/strong&gt; / &lt;strong&gt;Helm Chart&lt;/strong&gt;（v0.18+）/ &lt;strong&gt;Kustomize&lt;/strong&gt;&lt;/p&gt;</description></item></channel></rss>