好的,下面我帮你做一份 Kubelet 源码分析指南,从整体架构、核心组件到关键源码逻辑,适合想深入理解 Kubernetes 节点管理的同学参考。内容尽量兼顾可读性和源码细节。
🟢 Kubelet 源码分析指南
一、Kubelet 简介
Kubelet 是 Kubernetes 节点上的核心代理组件,负责:
- 管理节点上运行的容器(通过容器运行时 CRI)
- 上报节点状态和 Pod 状态到 API Server
- 执行 PodSpec 中定义的资源、卷挂载、健康检查等
- 保证节点上 Pod 的实际状态与期望状态一致
关键定位:Kubelet 是 节点端的控制器,连接 API Server 与容器运行时。
二、源码目录结构(go 项目)
Kubelet 代码在 Kubernetes 仓库的路径:
kubernetes/pkg/kubelet
主要目录和文件:
目录/文件 | 作用 |
---|---|
kubelet.go | Kubelet 主启动入口 |
kubelet_node_status.go | 节点状态上报逻辑 |
kubelet_pods.go | Pod 同步、生命周期管理 |
container/runtime | 容器运行时接口(CRI)实现 |
volume | 卷管理、挂载和卸载 |
server | Kubelet 内置 HTTP/gRPC server |
status | Pod 和容器状态管理 |
config | 配置管理与动态更新 |
device | 节点设备管理(GPU 等) |
三、Kubelet 启动流程
1️⃣ 入口:cmd/kubelet/kubelet.go
- 函数:
NewMainKubeletCommand()
- 流程:
- 解析 CLI flags 和配置文件
- 创建
Kubelet
对象 - 初始化容器运行时、卷管理、证书、cAdvisor
- 启动主循环
kubelet.Run()
2️⃣ 核心循环:syncLoop
- 位于
pkg/kubelet/kubelet.go
- 核心逻辑:
- 通过
podWorkers
并发执行 Pod 同步任务 - 调用
syncPod()
保证 Pod 实际状态与期望状态一致 - 更新 Pod 状态到 API Server
- 通过
func (kl *Kubelet) syncLoop() {
for {
select {
case pod := <-kl.podAddCh:
kl.syncPod(pod)
case pod := <-kl.podUpdateCh:
kl.syncPod(pod)
case pod := <-kl.podDeleteCh:
kl.deletePod(pod)
}
}
}
四、Pod 管理关键源码
1️⃣ Pod 同步 syncPod()
- 核心职责:
- 创建/启动容器
- 健康检查
- 卷挂载
- 状态上报
func (kl *Kubelet) syncPod(pod *v1.Pod) error {
for _, container := range pod.Spec.Containers {
kl.runtimeService.PullImage(container.Image)
kl.runtimeService.CreateContainer(container)
kl.runtimeService.StartContainer(container)
}
kl.statusManager.SetPodStatus(pod, &status)
}
2️⃣ Pod 状态管理
- 状态缓存:
statusManager
- 节点周期性上报
NodeStatus
到 API Server - 调用
kl.nodeStatusManager.SetNodeStatus(...)
五、容器运行时接口(CRI)
Kubelet 与容器运行时解耦,通过 CRI 接口调用不同容器引擎(Docker、containerd、CRI-O):
type RuntimeService interface {
Version() (*VersionResponse, error)
RunPodSandbox(*RunPodSandboxRequest) (*RunPodSandboxResponse, error)
StopPodSandbox(*StopPodSandboxRequest) error
CreateContainer(*CreateContainerRequest) (*CreateContainerResponse, error)
StartContainer(*StartContainerRequest) error
}
- Pod 的每个容器都通过 CRI 创建、启动、停止、删除
- Kubelet 只关心 API 调用和状态,不直接操作底层容器
六、卷(Volume)管理
- Kubelet 负责卷挂载与卸载,保证 Pod 的持久化存储
- 主要接口:
volume.Manager
- 流程:
- 挂载卷(Mount)
- 绑定 Pod 与卷
- Pod 删除时卸载卷(Unmount)
七、健康检查与 cAdvisor
- Kubelet 内置 cAdvisor 收集节点和容器资源使用情况(CPU、内存、网络)
- 健康检查类型:
- LivenessProbe
- ReadinessProbe
- StartupProbe
- 探针失败时 Kubelet 会重启容器或更新 Pod 状态
八、与 API Server 的交互
- 节点注册
- kubelet 自启动时调用
NodeRegistrationHandler
注册节点信息
- kubelet 自启动时调用
- Pod Watcher
- 通过
podInformer
监听 API Server Pod 变更
- 通过
- 状态上报
NodeStatus
上报节点资源与健康PodStatus
上报 Pod 容器状态
九、关键源码函数总结
功能 | 函数/文件 |
---|---|
Kubelet 启动 | cmd/kubelet/kubelet.go -> Run() |
Pod 同步 | pkg/kubelet/kubelet.go -> syncPod() |
容器创建 | pkg/kubelet/kuberuntime/kuberuntime_manager.go -> CreateContainer() |
卷管理 | pkg/kubelet/volume/volume_manager.go |
状态管理 | pkg/kubelet/status/status_manager.go |
节点注册 | pkg/kubelet/kubelet_node_status.go -> registerNode() |
API Server watch | pkg/kubelet/kubelet.go -> podWorkers |
🔟 总结
Kubelet 核心职责:
- Pod 生命周期管理:创建、启动、健康检查、删除
- 容器运行时接口:通过 CRI 管理容器
- 卷管理:挂载/卸载存储卷
- 节点状态上报:NodeStatus & PodStatus
- 资源监控:cAdvisor + 健康检查
- API Server 交互:获取 Pod 指令、上报状态
源码分析建议:
- 先看
kubelet.go
的启动流程 - 理解
syncLoop
与podWorkers
- 理解 CRI 调用流程(containerd / Docker)
- 理解状态管理与健康检查机制
发表回复