Kubernetes 源码框架分析

概述

本文档用于记录 Kubernetes 源码分析的学习笔记,包括核心组件的代码结构、关键流程和设计模式。

源码仓库

核心组件

控制平面组件

组件源码路径说明
kube-apiservercmd/kube-apiserver/API 服务器入口
kube-controller-managercmd/kube-controller-manager/控制器管理器
kube-schedulercmd/kube-scheduler/调度器
etcd外部项目分布式键值存储

节点组件

组件源码路径说明
kubeletcmd/kubelet/节点代理
kube-proxycmd/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/                # 依赖库

学习路线

推荐学习顺序

  1. client-go - 了解如何与 K8S API 交互
  2. apimachinery - 理解 API 对象的基础结构
  3. kube-apiserver - 学习 API 服务器的工作原理
  4. kube-controller-manager - 理解控制器模式
  5. kube-scheduler - 学习调度算法
  6. kubelet - 了解节点管理

核心流程阅读提纲

版本边界

Kubernetes 的目录和启动参数会随发行版变化,以下路径以当前主仓库的 Go 代码为参考。阅读时应固定一个 Git tag,并同时查看该 tag 的 go.mod、生成代码和测试,避免把不同版本的实现拼在一起。

API Server 启动与请求链路

  1. 从 cmd/kube-apiserver/app/server.go 的 Run 入口开始,跟踪 CreateServerChain 创建的主服务器、聚合服务器和 API Extensions Server。
  2. 继续阅读 pkg/kubeapiserver 中的认证、授权、准入和审计装配;请求处理顺序通常是认证 → 授权 → 准入 → REST Storage。
  3. 资源落盘经过 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