你好,我是孔令飞。
在上节课中,我介绍了从广度和深度两个维度,如何系统学习云原生技术。其中, Kubernetes 源码作为云原生的基石技术,值得投入更多的时间和精力。
为了帮助你更好地阅读 Kubernetes 源码,本节课中,我将基于自身经验,分享下如何阅读 Kubernetes 源码。
如何阅读 Kubernetes 源码?
我们将阅读源码分为三个阶段:
-
阅读前:充足准备
-
阅读中:高效阅读
-
阅读后:持续实战
我将按这个步骤,来给你介绍下具体如何阅读 Kubernetes 源码。
阅读前:充足准备
首先,不妨先思考下,你想要阅读 Kubernetes 的目的是什么?每个人阅读 Kubernetes 源码的出发点都是不一样的。
我当时是因为工作需要,需要开发一个 Kubernetes 调度插件,实现基于公司内部监控指标的调度插件。所以,我当时把整个 kube-scheduler 源码都读了一遍。读完之后,为了梳理源码学习心得,还整理了一篇近 3w 字的 kube-scheduler 源码剖析文章。后来,想实现一个不依赖 Kubernetes 集群的 kube-apiserver 风格的 REST API 服务(onex-apiserver),所以又阅读了 kube-apiserver 的源码,并把其中用不到的内置资源、功能(例如:认证、鉴权)都剥离了出去。
但大多时候,你可能并没有特别强的外部驱动力或目标。只是单纯的想阅读 Kubernetes 源码,了解 Kubernetes 的源码构建方法,并从中学习到一些设计思路、实现方法等,那么我建议你阅读 kube-scheduler 源码。因为 kube-sheduler 源码相对比较独立,并且 Kubernetes 调度器开发,在很多企业都有很多岗位需求。
而具体在阅读 Kubernetes 前需要做哪些准备?以下是我的方法,供你参考。
- 做好充足的知识准备
首先,我在开始阅读之前,我们需要知道 Kubernetes 源码量庞大且复杂,阅读难度较高。所以我建议先做好充足的知识准备,这样能够大幅度减小你阅读源码的难度,提高阅读效率。这里推荐大家先阅读下 Kubernetes权威指南:从Docker到Kubernetes实践全接触(选择最新版本的阅读)。这是学习 Kubernetes 必备书籍,我阅读了不下 6 遍,建议你也认真阅读下。
买这些书,要花点钱,不过这些钱很值,因为是投资自己,认真学,带来的收益要远超这些成本。
- 一个易用的源码阅读工具
接下来,你还需要准备一个易用的源码阅读工具,现在很多开发者使用 Goland / VSCode 来开发、阅读 Go 源码。这两个 IDE 都可以用来阅读 Kubernetes 源码。作为一个白垩纪时期的老程序员,我一直用 Vim 开发,所以,这里我直接配置了 Vim Go IDE 用来阅读 Kubernetes 源码。
- 了解 Kubernetes 目录结构及架构
接下来,你还要整体上去了解下 Kubernetes 的目录结构和架构。后面的课程会详细介绍最新版本的 Kubernetes 目录结构。
- 部署 Kubernetes 源码
接下来,我们需要部署起整个 Kubernetes 源码。至于如何具体编译并部署 Kubernetes 源码,在接下来的课程中,我将会为你详细讲解。如果你觉得直接部署 Kubernetes 源码有难度,也可以先部署一个测试、学习用的 Kubernetes 集群。推荐使用 Kind 来快速搭建集群,它的部署方式非常简单,这里有个 Kind 的 Quick Start,可以帮转你快速部署好一个 Kubernetes 集群。
- 选择 Kubernetes 组件进行阅读
最后,你需要选择一个 Kubernetes 组件进行阅读。你可以根据自己的目的,选择一个 Kubernetes 组件。
阅读中:高效阅读
有了上面的准备之后(两本书、Go IDE、部署 Kubernetes 源码),你就可以开始阅读 Kubernetes 源码了。或者,你也可以在本门课程的基础上阅读 Kubernetes 源码,效率是最高的,因为你可以在学习的过程中阅读,拓展知识面的同时,还能加强实践。
以下是具体的阅读方法,供你参考。
-
找到阅读入口:Kubernetes 源码 main 文件都保存在
cmd/<组件名>/*.go文件中,如果找不到,你可以直接搜索grep 'package main' cmd/<组件名>/*.go,来找 main 函数所在的源码文件。 -
阅读 example 和单元测试用例:Kubernetes 源码仓库下没有什么可以帮助你阅读源码的 example 文件,所以这个可以忽略。另外,Kubernetes 仓库目录下有很多单测文件,这些单测文件,我自己阅读的时候很少去看,你可以根据需要选择去看或者不看,没什么影响。
-
阅读代码注释:这个很重要,Kubernetes 的源码注释都写得比较详细,而且不是那种凑数的源码注释,很多注释是有阅读价值的。所以,你阅读源码时,有些地方不明白,可以优先看看这些注释,也是最便捷的方式。
-
借助 ChatGPT 和网络搜索:这个根据需要自行搜索即可。我阅读源码时,偶尔会用 ChatGPT,直接把整段代码贴上去,看看 ChatGPT 的回答,如果感觉它在胡说八道,再在网上去搜下,不过一般搜不到我想要的答案。更多的时候,是对着源码硬磕,认真琢磨一会儿后,往往能够理解这些源码。
-
写注解、做笔记、勤思考:非常好的精细化阅读方法,不过我阅读的时候,很多时候是粗读,你可以根据自己的基础选择是否细读。
-
写单测协助理解代码:也是很不错的精细化阅读方法,不过成本较高。
-
调试阅读:这个我偶尔会用,在有些关键地方不明白的时候,我会在代码里加上
fmt.Println这类语句,编译、重新部署后,看看源码运行流程和效果。建议你至少魔改一次 Kubernetes 源码,编译并重新部署后,测试看看效果。
阅读后:持续实战
不管你是硬着头皮阅读完,还是开开心心阅读完,还是打着瞌睡阅读完,这里都要恭喜你,完成了阅读 Kubernetes 源码的 Hello World,打开了潘多拉的魔盒。相信这个时候,你并不会觉得阅读 Kubernetes 源码是一件多难的事情。根据我个人的经验,后面你会越来越多的去阅读 Kubernetes 源码。下面提供一些具体的实战方法。
- 给社区提交 PR
在你阅读 Kubernetes 源码的过程中,如果发现有些文档写错了,或者源码可以优化下,你可以大胆的给 Kubernetes 提交 PR,来修复这些问题。
- 工作中复用与实现
在阅读完 Kubernetes 源码后,我们可以思考下,Kubernetes 源码有哪些设计思路、构建技巧、实现方法,可以拿来用到我们的工作中?随着你阅读的 Kubernetes 源码越来越多,你会对 Kubernetes 源码越来越熟悉,这些可以复用的理念、代码、包等对你来说,也是手到擒来。复用这些方法、实现,不仅是一个再学习的过程,还能提高我们项目开发工作的效率和质量,是一个一箭 N 雕的买卖。
- 魔改、运行、测试
就像我上面说的,如果你第一次真正阅读完某一个 Kubernetes 组件,或者 Kubernetes 组件的某一块儿代码,并且真正魔改、运行、测试过,那么阅读 Kubernetes 源码对你来说,会变得很简单。在之后,你可以慢慢扩大阅读面,例如:阅读 kube-apiserver、kube-controller-mananger 的源码。持续不断地去阅读、学习,最终整个 Kubernetes 源码都能了然于胸。
- 及时输出
另外,在我们阅读完 Kubernetes 源码之后,还可以通过一篇或几篇源码剖析文章,再次梳理阅读过程中学习到的源码知识,并在写作过程中,思考源码构建方法、补全源码图谱,达到一种再学习的目的。写完文章后,我们可以将这些文章分享在团队内、公司内或者网络上,顺便提高一下自己的技术影响力。
我在学习完 kube-scheduler 源码后,写了一系列 kube-scheduler 源码剖析文章,这些文章后来经过我的润色,慢慢形成了一个新的体系课《Kubernetes 调度器开发实战课》。这套课程发布在我的「云原生 AI 实战营」知识星球中,课程目录见 Kubernetes 调度器开发实战课。
课程总结
这节课我具体介绍了如何阅读 Kubernetes 源码,其中给出了较为具体的学习路径、学习内容与学习方法。
其实这也是学习 Kubernetes 的进阶路径,不过这些路径不是标准答案,核心目的是想抛砖引玉,让你规划自己的 Kubernetes 学习路径。做好规划,分阶段学习,最终达到你想要的高度。
课后练习
-
请调研下还有哪些好用的 Kubernetes 学习教材、学习方法,也欢迎你评论区分享出来。
-
请规划下你的 Kubernetes 学习路径。
-
你觉得 Kubernetes 社区还有哪些好用的、好玩的开源项目?欢迎评论区分享。
如果今天的内容让你有所收获,也欢迎转发给有需要的朋友,我们下节课再见!
精选留言
2025-04-25 08:49:10
2025-06-17 15:27:44
2025-04-26 16:58:57
2025-04-26 11:38:10