Skip to content

Commit f66a87f

Browse files
committed
2025-5-7:""
1 parent 8d31f62 commit f66a87f

File tree

11 files changed

+733
-56
lines changed

11 files changed

+733
-56
lines changed

content/posts/20250507/1.png

116 KB
Loading

content/posts/20250507/2.png

174 KB
Loading

content/posts/20250507/index.md

Lines changed: 18 additions & 51 deletions
Large diffs are not rendered by default.

public/index.html

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,24 @@
106106
<main class="main">
107107

108108
<article class="first-entry">
109+
<header class="entry-header">
110+
<h2 class="entry-hint-parent">Kube-Scheduler 深度解析:从源码看 Kubernetes 调度核心
111+
</h2>
112+
</header>
113+
<div class="entry-content">
114+
<p>Kubernetes 的 kube-scheduler 是集群的中枢决策者,负责为每一个新创建的、未指定节点的 Pod 选择最合适的运行节点。这一决策过程对集群的效率、应用性能和整体可靠性至关重要 1。本文将深入 kube-scheduler 的内部机制,通过分析其 Go 语言源代码,揭示其从启动、核心调度逻辑到高度可扩展的调度框架的演进与实现。Kubernetes 的调度器经历了从相对单一的设计到高度可扩展的调度框架的演变,这是理解其当前强大能力的关键 3。
115+
调度器的设计直接影响着集群上运行的应用程序的可用性和资源利用率。如果 Pod 被放置在不合适的节点上,可能会导致某些节点资源紧张而另一些节点资源闲置,或者违反 Pod 间的亲和性与反亲和性规则,进而影响应用的通信效率或容错能力。因此,深入理解调度器的工作原理,有助于更好地配置和排查问题,最终提升集群的整体表现。早期版本的调度器逻辑相对固定,难以满足日益增长的定制化需求 4。虽然之后引入的 Extender 机制提供了一定的扩展能力,但在性能和灵活性上仍有局限 4。调度框架的出现,允许开发者通过插件将自定义逻辑直接注入调度流程,这不仅促进了相关生态系统的繁荣,也使得核心调度器能够保持精简和易维护,同时满足多样化的调度需求,例如针对机器学习、批处理作业或需要特定硬件的工作负载 5。
116+
一、 启动流程:Kube-Scheduler 的初始化与核心组件构建 理解 kube-scheduler 如何初始化自身及其主要数据结构,是深入其调度逻辑的前提。
117+
1.1 启动入口与命令解析 kube-scheduler 的启动入口位于 kubernetes/cmd/kube-scheduler/scheduler.go 文件中的 main 函数 7。它利用了 Cobra 框架来处理命令行参数和应用的配置启动。具体来说,main 函数会调用 kubernetes/cmd/kube-scheduler/app/server.go 文件中的 app.NewSchedulerCommand 函数来创建和初始化 Cobra 命令 7。
118+
随后,runCommand 函数被调用,它负责编排整个启动过程,包括创建调度器配置 (CompletedConfig) 和调度器实例 (scheduler.Scheduler)。这一过程的核心是调用 Setup 函数 7。Setup 函数会验证传入的选项,根据选项创建配置,并最终调用 scheduler.New 函数来实例化调度器 7。
119+
这种分层设计体现了良好的软件工程实践。cmd/kube-scheduler/scheduler.go 作为顶层入口非常轻量。cmd/kube-scheduler/app/server.go 负责解析命令行参数、管理配置选项,并协调 Setup 过程 7。而核心的调度器对象及其复杂的初始化逻辑则封装在 pkg/scheduler/scheduler.go 的 scheduler.New 函数中 7。这种模块化的结构使得各部分可以独立演进和测试,例如,修改命令行参数的处理逻辑,通常不会影响到核心调度算法的实现。
120+
...</p>
121+
</div>
122+
<footer class="entry-footer"><span title='2025-05-07 11:22:12 +0800 CST'>May 7, 2025</span></footer>
123+
<a class="entry-link" aria-label="post link to Kube-Scheduler 深度解析:从源码看 Kubernetes 调度核心" href="http://localhost:1313/my-blog/posts/20250507/"></a>
124+
</article>
125+
126+
<article class="post-entry">
109127
<header class="entry-header">
110128
<h2 class="entry-hint-parent">K8s源代码分析:Kubelet
111129
</h2>

public/index.xml

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,22 @@
66
<description>Recent content on Yipeng M</description>
77
<generator>Hugo -- 0.146.7</generator>
88
<language>zh-cn</language>
9-
<lastBuildDate>Tue, 06 May 2025 11:22:12 +0800</lastBuildDate>
9+
<lastBuildDate>Wed, 07 May 2025 11:22:12 +0800</lastBuildDate>
1010
<atom:link href="http://localhost:1313/my-blog/index.xml" rel="self" type="application/rss+xml" />
11+
<item>
12+
<title>Kube-Scheduler 深度解析:从源码看 Kubernetes 调度核心</title>
13+
<link>http://localhost:1313/my-blog/posts/20250507/</link>
14+
<pubDate>Wed, 07 May 2025 11:22:12 +0800</pubDate>
15+
<guid>http://localhost:1313/my-blog/posts/20250507/</guid>
16+
<description>&lt;p&gt;Kubernetes 的 kube-scheduler 是集群的中枢决策者,负责为每一个新创建的、未指定节点的 Pod 选择最合适的运行节点。这一决策过程对集群的效率、应用性能和整体可靠性至关重要 1。本文将深入 kube-scheduler 的内部机制,通过分析其 Go 语言源代码,揭示其从启动、核心调度逻辑到高度可扩展的调度框架的演进与实现。Kubernetes 的调度器经历了从相对单一的设计到高度可扩展的调度框架的演变,这是理解其当前强大能力的关键 3。&lt;/p&gt;
17+
&lt;p&gt;调度器的设计直接影响着集群上运行的应用程序的可用性和资源利用率。如果 Pod 被放置在不合适的节点上,可能会导致某些节点资源紧张而另一些节点资源闲置,或者违反 Pod 间的亲和性与反亲和性规则,进而影响应用的通信效率或容错能力。因此,深入理解调度器的工作原理,有助于更好地配置和排查问题,最终提升集群的整体表现。早期版本的调度器逻辑相对固定,难以满足日益增长的定制化需求 4。虽然之后引入的 Extender 机制提供了一定的扩展能力,但在性能和灵活性上仍有局限 4。调度框架的出现,允许开发者通过插件将自定义逻辑直接注入调度流程,这不仅促进了相关生态系统的繁荣,也使得核心调度器能够保持精简和易维护,同时满足多样化的调度需求,例如针对机器学习、批处理作业或需要特定硬件的工作负载 5。&lt;/p&gt;
18+
&lt;h2 id=&#34;一-启动流程kube-scheduler-的初始化与核心组件构建&#34;&gt;一、 启动流程:Kube-Scheduler 的初始化与核心组件构建&lt;/h2&gt;
19+
&lt;p&gt;理解 kube-scheduler 如何初始化自身及其主要数据结构,是深入其调度逻辑的前提。&lt;/p&gt;
20+
&lt;h3 id=&#34;11-启动入口与命令解析&#34;&gt;1.1 启动入口与命令解析&lt;/h3&gt;
21+
&lt;p&gt;kube-scheduler 的启动入口位于 &lt;code&gt;kubernetes/cmd/kube-scheduler/scheduler.go&lt;/code&gt; 文件中的 &lt;code&gt;main&lt;/code&gt; 函数 7。它利用了 Cobra 框架来处理命令行参数和应用的配置启动。具体来说,&lt;code&gt;main&lt;/code&gt; 函数会调用 &lt;code&gt;kubernetes/cmd/kube-scheduler/app/server.go&lt;/code&gt; 文件中的 &lt;code&gt;app.NewSchedulerCommand&lt;/code&gt; 函数来创建和初始化 Cobra 命令 7。&lt;/p&gt;
22+
&lt;p&gt;随后,&lt;code&gt;runCommand&lt;/code&gt; 函数被调用,它负责编排整个启动过程,包括创建调度器配置 (&lt;code&gt;CompletedConfig&lt;/code&gt;) 和调度器实例 (&lt;code&gt;scheduler.Scheduler&lt;/code&gt;)。这一过程的核心是调用 &lt;code&gt;Setup&lt;/code&gt; 函数 7。&lt;code&gt;Setup&lt;/code&gt; 函数会验证传入的选项,根据选项创建配置,并最终调用 &lt;code&gt;scheduler.New&lt;/code&gt; 函数来实例化调度器 7。&lt;/p&gt;
23+
&lt;p&gt;这种分层设计体现了良好的软件工程实践。&lt;code&gt;cmd/kube-scheduler/scheduler.go&lt;/code&gt; 作为顶层入口非常轻量。&lt;code&gt;cmd/kube-scheduler/app/server.go&lt;/code&gt; 负责解析命令行参数、管理配置选项,并协调 &lt;code&gt;Setup&lt;/code&gt; 过程 7。而核心的调度器对象及其复杂的初始化逻辑则封装在 &lt;code&gt;pkg/scheduler/scheduler.go&lt;/code&gt;&lt;code&gt;scheduler.New&lt;/code&gt; 函数中 7。这种模块化的结构使得各部分可以独立演进和测试,例如,修改命令行参数的处理逻辑,通常不会影响到核心调度算法的实现。&lt;/p&gt;</description>
24+
</item>
1125
<item>
1226
<title>K8s源代码分析:Kubelet</title>
1327
<link>http://localhost:1313/my-blog/posts/20250506/</link>

public/posts/20250507/1.png

116 KB
Loading

public/posts/20250507/2.png

174 KB
Loading

0 commit comments

Comments
 (0)