Kubernetes 源码框架分析
概述
本文档用于记录 Kubernetes 源码分析的学习笔记,包括核心组件的代码结构、关键流程和设计模式。
源码仓库
核心组件
控制平面组件
| 组件 | 源码路径 | 说明 |
|---|---|---|
| kube-apiserver | cmd/kube-apiserver/ | API 服务器入口 |
| kube-controller-manager | cmd/kube-controller-manager/ | 控制器管理器 |
| kube-scheduler | cmd/kube-scheduler/ | 调度器 |
| etcd | 外部项目 | 分布式键值存储 |
节点组件
| 组件 | 源码路径 | 说明 |
|---|---|---|
| kubelet | cmd/kubelet/ | 节点代理 |
| kube-proxy | cmd/kube-proxy/ | 网络代理 |
代码结构
kubernetes/
├── cmd/ # 各组件入口
│ ├── kube-apiserver/
│ ├── kube-controller-manager/
│ ├── kube-scheduler/
│ ├── kubelet/
│ └── kube-proxy/
├── pkg/ # 核心库代码
│ ├── api/ # API 定义
│ ├── controller/ # 控制器实现
│ ├── scheduler/ # 调度器实现
│ └── kubelet/ # Kubelet 实现
├── staging/ # 独立发布的库
│ └── src/k8s.io/
│ ├── api/
│ ├── client-go/ # Go 客户端库
│ └── apimachinery/
└── vendor/ # 依赖库
学习路线
推荐学习顺序
- client-go - 了解如何与 K8S API 交互
- apimachinery - 理解 API 对象的基础结构
- kube-apiserver - 学习 API 服务器的工作原理
- kube-controller-manager - 理解控制器模式
- kube-scheduler - 学习调度算法
- kubelet - 了解节点管理
核心流程阅读提纲
版本边界
Kubernetes 的目录和启动参数会随发行版变化,以下路径以当前主仓库的 Go 代码为参考。阅读时应固定一个 Git tag,并同时查看该 tag 的
go.mod、生成代码和测试,避免把不同版本的实现拼在一起。
API Server 启动与请求链路
- 从
cmd/kube-apiserver/app/server.go的Run入口开始,跟踪CreateServerChain创建的主服务器、聚合服务器和 API Extensions Server。 - 继续阅读
pkg/kubeapiserver中的认证、授权、准入和审计装配;请求处理顺序通常是认证 → 授权 → 准入 → REST Storage。 - 资源落盘经过 storage 层访问 etcd;对象版本转换、默认值和校验由
staging/src/k8s.io/apiserver、apimachinery及各 API 包共同完成。
Controller Manager 控制器注册
cmd/kube-controller-manager/app 负责解析配置、建立 shared informer factory 和 client,再按 feature gate 注册控制器。单个控制器通常由 informer 事件写入 workqueue,worker 从队列取 key,读取最新对象并执行幂等的 reconcile;排查问题时应同时看队列重试和 resourceVersion 冲突。
Scheduler 调度循环
从 cmd/kube-scheduler/app 进入 pkg/scheduler/schedule_one.go,重点观察 PreFilter → Filter → PostFilter → PreScore → Score → Reserve → Permit → PreBind → Bind 扩展点。Filter 决定可行节点,Score 只负责排序,绑定前仍可能因缓存过期或抢占产生失败,因此不能把 Score 结果当作最终保证。
Kubelet Pod 生命周期
从 cmd/kubelet/kubelet.go 创建 kubelet,再跟踪 pkg/kubelet/ 中的 pod manager、pod workers、PLEG 和 syncPod。配置来源包括 API Server 的 PodSpec、静态 Pod 目录和运行时状态;CRI 调用通过 containerRuntimeEndpoint 连接 containerd/CRI-O。修改镜像或运行时参数后,应区分 kubelet 重启、Pod 重建和镜像拉取缓存这三个动作。
client-go Informer 机制
典型链路为 ListWatch → Reflector → DeltaFIFO → sharedIndexInformer → ResourceEventHandler → workqueue。Informer 回调只负责入队,不应在回调中执行长时间阻塞操作;worker 必须通过 lister 读取缓存,并在收到 NotFound 时把对象视为已删除。生产控制器还应处理 resync、限速重试、队列 shutdown 和 RBAC 权限。
建议的实操方法
# 固定版本后再阅读,例如:
git checkout v1.30.0
rg "CreateServerChain|syncPod|Run\(" cmd pkg staging/src/k8s.io
go test ./staging/src/k8s.io/client-go/tools/cache/...不要直接修改 vendor/ 或生成代码;需要理解行为时优先阅读源码和对应单元测试,变更实现时再运行 make generated 或项目规定的生成脚本。
相关链接
- Kubernetes组件详解和高可用配置 - 组件详解
- Kubelet配置 - Kubelet 配置说明
- Kubernetes常见问题 - 常见问题汇总
返回: Kubernetes