Kubernetes 源码学习路线
这份文档用于配合当前 Kubernetes 源码仓库学习。目标不是一次性读完所有代码,而是沿着一条真实工作链路,逐步建立 Kubernetes 的源码地图和调试能力。
推荐主线:
| |
读源码时始终把文件放回这条链路里理解。
0. 仓库地图
当前仓库中最重要的目录:
| 目录 | 作用 |
|---|---|
cmd/ | Kubernetes 各组件入口,例如 kube-apiserver、kube-controller-manager、kube-scheduler、kubelet、kubectl |
pkg/ | Kubernetes 核心实现代码 |
staging/src/k8s.io/ | 对外拆分模块,例如 api、apimachinery、client-go、apiserver、kubectl |
test/ | 集成测试、e2e 测试 |
hack/ | 构建、代码生成、校验脚本 |
vendor/ | 依赖代码 |
常用搜索命令:
| |
常用测试命令:
| |
1. 学习节奏
建议每天 1.5 到 2 小时:
- 30 分钟:看概念或复习上一天笔记。
- 45 分钟:读一个核心文件,只抓主流程。
- 30 分钟:写笔记,记录输入、输出、关键类型、调用方。
- 15 分钟:跑测试、搜调用链或做一个小实验。
每读一个函数,回答四个问题:
- 谁调用它?
- 它的输入是什么?
- 它改变了什么状态?
- 它失败时怎么返回错误或重试?
2. 第 1 周:会用 Kubernetes
目标:先会使用核心资源,不急着读源码。
需要掌握:
- Pod
- Deployment
- ReplicaSet
- Service
- ConfigMap
- Secret
- Namespace
- Node
- RBAC
- PV / PVC
练习命令:
| |
本周检查点:
- 能解释
Spec和Status的区别。 - 能解释 Deployment、ReplicaSet、Pod 的关系。
- 能解释 Service 为什么不是直接等于 Pod。
- 能画出一次
kubectl apply后大概发生了什么。
3. 第 2 周:API 对象和元数据
目标:理解 Kubernetes 所有控制逻辑的对象基础。
重点文件:
| |
重点类型:
PodPodSpecPodStatusContainerDeploymentDeploymentSpecDeploymentStatusObjectMetaTypeMetaOwnerReferenceLabelSelectorListOptionsWatchEvent
阅读任务:
- 找到
Pod结构体,区分TypeMeta、ObjectMeta、Spec、Status。 - 找到
DeploymentSpec,理解Replicas、Selector、Template。 - 找到
OwnerReference,理解级联删除和归属关系。 - 找到
ListOptions,理解ResourceVersion、LabelSelector、FieldSelector。
本周检查点:
- 能解释为什么 Kubernetes API 对象通常都有
Spec和Status。 - 能解释为什么 Deployment 通过
Template创建 Pod。 - 能解释
labels和selector的关系。 - 能解释
resourceVersion大概解决什么问题。
4. 第 3-4 周:kube-apiserver
目标:读懂请求进入 apiserver 后的大致链路。
入口文件:
| |
重点主题:
- 命令行参数如何初始化组件。
- HTTP 请求如何进入 apiserver。
- 认证 Authentication。
- 鉴权 Authorization。
- Admission。
- API 对象序列化和反序列化。
- REST storage。
- 对 etcd 的读写。
建议阅读顺序:
cmd/kube-apiserver/apiserver.gopkg/kubeapiserver/staging/src/k8s.io/apiserver/pkg/server/staging/src/k8s.io/apiserver/pkg/endpoints/staging/src/k8s.io/apiserver/pkg/registry/generic/staging/src/k8s.io/apiserver/pkg/storage/
阅读任务:
| |
本阶段检查点:
- 能描述一次
POST /api/v1/namespaces/default/pods的大概流程。 - 能区分认证、鉴权、准入控制。
- 能解释 apiserver 为什么不是直接操作 Go 结构体,而要经过序列化、版本转换、storage。
- 能知道资源最终会进入 etcd。
5. 第 5-6 周:controller-manager 和调谐模型
目标:理解 Kubernetes 最核心的控制循环。
入口文件:
| |
推荐先读 Deployment Controller:
| |
核心概念:
- informer
- lister
- workqueue
- sync handler
- reconcile
- owner reference
- expectations
阅读任务:
- 找到 Deployment Controller 如何创建。
- 找到它监听哪些资源。
- 找到 Deployment 如何入队。
- 找到
syncDeployment这样的核心调谐函数。 - 观察它如何创建或更新 ReplicaSet。
- 继续追 ReplicaSet 如何创建 Pod。
搜索命令:
| |
本阶段检查点:
- 能解释 informer 不是简单的 HTTP 轮询。
- 能解释为什么 controller 使用 workqueue。
- 能解释 Deployment Controller 如何把期望副本数变成 ReplicaSet。
- 能解释 ReplicaSet Controller 如何把 ReplicaSet 变成 Pod。
- 能解释 controller 的核心模式:观察、入队、对比、修正。
6. 第 7 周:kube-scheduler
目标:理解调度器如何把 Pending Pod 绑定到 Node。
入口文件:
| |
核心概念:
- scheduling queue
- pending pod
- filtering
- scoring
- binding
- scheduling framework
- plugin
建议阅读顺序:
cmd/kube-scheduler/scheduler.gopkg/scheduler/scheduler.gopkg/scheduler/schedule_one.gopkg/scheduler/framework/interface.gopkg/scheduler/framework/types.go
搜索命令:
| |
本周检查点:
- 能解释 scheduler 只负责绑定,不负责启动容器。
- 能解释 Filter 和 Score 的区别。
- 能解释 Pod 为什么会处于 Pending 状态。
- 能描述一个 Pod 从 Pending 到被绑定 Node 的流程。
7. 第 8-9 周:kubelet
目标:理解 kubelet 如何在节点上真正运行 Pod。
入口文件:
| |
核心概念:
- node agent
- pod source
- sync loop
- syncPod
- CRI
- container runtime
- probe
- volume
- secret / configmap mount
建议阅读顺序:
cmd/kubelet/kubelet.gopkg/kubelet/kubelet.gopkg/kubelet/kubelet_pods.gopkg/kubelet/kuberuntime/pkg/kubelet/prober/
搜索命令:
| |
本阶段检查点:
- 能解释 kubelet 如何知道哪些 Pod 属于自己。
- 能解释 kubelet 和 container runtime 的关系。
- 能解释
syncPod大概做什么。 - 能解释 liveness/readiness/startup probe 的执行位置。
- 能解释 kubelet 为什么是节点侧最复杂的组件之一。
8. 第 10 周:kubectl 和 client-go
目标:理解客户端如何访问 apiserver,理解 informer/clientset 的使用模型。
入口文件:
| |
重点目录:
| |
搜索命令:
| |
本周检查点:
- 能解释 kubeconfig 如何影响 kubectl 连接哪个集群。
- 能解释 clientset、dynamic client、RESTClient 的区别。
- 能解释 informer 为什么适合写 controller。
- 能描述
kubectl apply和普通create/update的区别。
9. 第 11 周:做一个小改动
目标:真正改一次 Kubernetes 代码,并跑对应测试。
推荐从小模块开始:
| |
推荐任务:
- 给
pkg/probe某个错误路径补一个测试。 - 给某个 controller 的边界条件补单元测试。
- 改进一个错误信息。
- 给 scheduler 某个小工具函数补测试。
- 阅读一个已有测试,照着风格添加新 case。
示例命令:
| |
本周检查点:
- 能找到一个函数的测试文件。
- 能添加 table-driven test。
- 能只跑相关 package 的测试。
- 能用
rg找到调用方和错误路径。
10. 第 12 周:总结和画图
目标:把散乱源码知识整理成自己的 Kubernetes 心智模型。
需要输出三份笔记:
kubectl apply Deployment全链路图。- Deployment Controller 阅读笔记。
- kubelet 启动 Pod 阅读笔记。
建议图示:
| |
最终检查点:
- 能解释 Kubernetes 为什么是声明式系统。
- 能解释 controller 的调谐循环。
- 能解释 apiserver 在整个系统里的中心地位。
- 能解释 scheduler 和 kubelet 的边界。
- 能独立定位一个资源状态异常大概应该看哪个组件。
11. 推荐的第一条源码精读路线
第一条精读路线选择 Deployment,不建议一开始读 kubelet 全部逻辑。
阅读顺序:
| |
每读完一个文件,记录:
| |
12. 学习时不要做的事
- 不要从 kubelet 全量开始读,容易陷进去。
- 不要一开始读所有 generated 代码。
- 不要试图一次搞懂所有 admission/plugin/storage 细节。
- 不要只看源码不跑命令。
- 不要只看概念不画调用链。
- 不要追每一个接口实现,先抓主流程。
13. 一个判断标准
当你能用自己的话说清楚下面这段话,就说明已经入门:
| |
这条线理解了,后面再学习网络、存储、安全、扩展机制、CRD、Operator,都会有清晰的落点。