06|如何高效阅读Kubernetes源码?

你好,我是孔令飞。

在上节课中,我介绍了从广度和深度两个维度,如何系统学习云原生技术。其中, 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 前需要做哪些准备?以下是我的方法,供你参考。

  1. 做好充足的知识准备

首先,我在开始阅读之前,我们需要知道 Kubernetes 源码量庞大且复杂,阅读难度较高。所以我建议先做好充足的知识准备,这样能够大幅度减小你阅读源码的难度,提高阅读效率。这里推荐大家先阅读下 Kubernetes权威指南:从Docker到Kubernetes实践全接触(选择最新版本的阅读)。这是学习 Kubernetes 必备书籍,我阅读了不下 6 遍,建议你也认真阅读下。

买这些书,要花点钱,不过这些钱很值,因为是投资自己,认真学,带来的收益要远超这些成本。

  1. 一个易用的源码阅读工具

接下来,你还需要准备一个易用的源码阅读工具,现在很多开发者使用 Goland / VSCode 来开发、阅读 Go 源码。这两个 IDE 都可以用来阅读 Kubernetes 源码。作为一个白垩纪时期的老程序员,我一直用 Vim 开发,所以,这里我直接配置了 Vim Go IDE 用来阅读 Kubernetes 源码。

  1. 了解 Kubernetes 目录结构及架构

接下来,你还要整体上去了解下 Kubernetes 的目录结构和架构。后面的课程会详细介绍最新版本的 Kubernetes 目录结构。

  1. 部署 Kubernetes 源码

接下来,我们需要部署起整个 Kubernetes 源码。至于如何具体编译并部署 Kubernetes 源码,在接下来的课程中,我将会为你详细讲解。如果你觉得直接部署 Kubernetes 源码有难度,也可以先部署一个测试、学习用的 Kubernetes 集群。推荐使用 Kind 来快速搭建集群,它的部署方式非常简单,这里有个 Kind 的 Quick Start,可以帮转你快速部署好一个 Kubernetes 集群。

  1. 选择 Kubernetes 组件进行阅读

最后,你需要选择一个 Kubernetes 组件进行阅读。你可以根据自己的目的,选择一个 Kubernetes 组件。

阅读中:高效阅读

有了上面的准备之后(两本书、Go IDE、部署 Kubernetes 源码),你就可以开始阅读 Kubernetes 源码了。或者,你也可以在本门课程的基础上阅读 Kubernetes 源码,效率是最高的,因为你可以在学习的过程中阅读,拓展知识面的同时,还能加强实践。

以下是具体的阅读方法,供你参考。

  1. 找到阅读入口:Kubernetes 源码 main 文件都保存在 cmd/<组件名>/*.go文件中,如果找不到,你可以直接搜索 grep 'package main' cmd/<组件名>/*.go,来找 main 函数所在的源码文件。

  2. 阅读 example 和单元测试用例:Kubernetes 源码仓库下没有什么可以帮助你阅读源码的 example 文件,所以这个可以忽略。另外,Kubernetes 仓库目录下有很多单测文件,这些单测文件,我自己阅读的时候很少去看,你可以根据需要选择去看或者不看,没什么影响。

  3. 阅读代码注释:这个很重要,Kubernetes 的源码注释都写得比较详细,而且不是那种凑数的源码注释,很多注释是有阅读价值的。所以,你阅读源码时,有些地方不明白,可以优先看看这些注释,也是最便捷的方式。

  4. 借助 ChatGPT 和网络搜索:这个根据需要自行搜索即可。我阅读源码时,偶尔会用 ChatGPT,直接把整段代码贴上去,看看 ChatGPT 的回答,如果感觉它在胡说八道,再在网上去搜下,不过一般搜不到我想要的答案。更多的时候,是对着源码硬磕,认真琢磨一会儿后,往往能够理解这些源码。

  5. 写注解、做笔记、勤思考:非常好的精细化阅读方法,不过我阅读的时候,很多时候是粗读,你可以根据自己的基础选择是否细读。

  6. 写单测协助理解代码:也是很不错的精细化阅读方法,不过成本较高。

  7. 调试阅读:这个我偶尔会用,在有些关键地方不明白的时候,我会在代码里加上 fmt.Println这类语句,编译、重新部署后,看看源码运行流程和效果。建议你至少魔改一次 Kubernetes 源码,编译并重新部署后,测试看看效果。

阅读后:持续实战

不管你是硬着头皮阅读完,还是开开心心阅读完,还是打着瞌睡阅读完,这里都要恭喜你,完成了阅读 Kubernetes 源码的 Hello World,打开了潘多拉的魔盒。相信这个时候,你并不会觉得阅读 Kubernetes 源码是一件多难的事情。根据我个人的经验,后面你会越来越多的去阅读 Kubernetes 源码。下面提供一些具体的实战方法。

  1. 给社区提交 PR

在你阅读 Kubernetes 源码的过程中,如果发现有些文档写错了,或者源码可以优化下,你可以大胆的给 Kubernetes 提交 PR,来修复这些问题。

  1. 工作中复用与实现

在阅读完 Kubernetes 源码后,我们可以思考下,Kubernetes 源码有哪些设计思路、构建技巧、实现方法,可以拿来用到我们的工作中?随着你阅读的 Kubernetes 源码越来越多,你会对 Kubernetes 源码越来越熟悉,这些可以复用的理念、代码、包等对你来说,也是手到擒来。复用这些方法、实现,不仅是一个再学习的过程,还能提高我们项目开发工作的效率和质量,是一个一箭 N 雕的买卖。

  1. 魔改、运行、测试

就像我上面说的,如果你第一次真正阅读完某一个 Kubernetes 组件,或者 Kubernetes 组件的某一块儿代码,并且真正魔改、运行、测试过,那么阅读 Kubernetes 源码对你来说,会变得很简单。在之后,你可以慢慢扩大阅读面,例如:阅读 kube-apiserver、kube-controller-mananger 的源码。持续不断地去阅读、学习,最终整个 Kubernetes 源码都能了然于胸。

  1. 及时输出

另外,在我们阅读完 Kubernetes 源码之后,还可以通过一篇或几篇源码剖析文章,再次梳理阅读过程中学习到的源码知识,并在写作过程中,思考源码构建方法、补全源码图谱,达到一种再学习的目的。写完文章后,我们可以将这些文章分享在团队内、公司内或者网络上,顺便提高一下自己的技术影响力。

我在学习完 kube-scheduler 源码后,写了一系列 kube-scheduler 源码剖析文章,这些文章后来经过我的润色,慢慢形成了一个新的体系课《Kubernetes 调度器开发实战课》。这套课程发布在我的「云原生 AI 实战营」知识星球中,课程目录见 Kubernetes 调度器开发实战课

课程总结

这节课我具体介绍了如何阅读 Kubernetes 源码,其中给出了较为具体的学习路径、学习内容与学习方法。

其实这也是学习 Kubernetes 的进阶路径,不过这些路径不是标准答案,核心目的是想抛砖引玉,让你规划自己的 Kubernetes 学习路径。做好规划,分阶段学习,最终达到你想要的高度。

课后练习

  1. 请调研下还有哪些好用的 Kubernetes 学习教材、学习方法,也欢迎你评论区分享出来。

  2. 请规划下你的 Kubernetes 学习路径。

  3. 你觉得 Kubernetes 社区还有哪些好用的、好玩的开源项目?欢迎评论区分享。

如果今天的内容让你有所收获,也欢迎转发给有需要的朋友,我们下节课再见!

精选留言

  • 希望在南门

    2025-04-25 08:49:10

    之前买了本《深入理解Kubernetes源码》https://book.douban.com/subject/36978517/,但是最近在准备找工作,等工作稳定下来才能再投入了,今年目标希望能看完kube-scheduler的源码^_^
    作者回复

    加油!

    2025-04-28 01:03:27

  • 李泰汛

    2025-06-17 15:27:44

    看到老师用 vim 编程真的太震撼了,好强啊!!!
  • okkkkk

    2025-04-26 16:58:57

    我参考这篇帖子部署了kind,https://redhand.com.cn/2023/08/10/kind/
    作者回复

    666,感谢分享

    2025-04-28 01:02:48

  • 許敲敲

    2025-04-26 11:38:10

    打算站在巨人的肩膀上,老师祝我一臂之力!
    作者回复

    必须,学完K8S源码,开发水平会提高一大截!

    2025-04-28 01:02:35