好的,下面我帮你做一份 Kubelet 源码分析指南,从整体架构、核心组件到关键源码逻辑,适合想深入理解 Kubernetes 节点管理的同学参考。内容尽量兼顾可读性和源码细节。


🟢 Kubelet 源码分析指南


一、Kubelet 简介

Kubelet 是 Kubernetes 节点上的核心代理组件,负责:

  • 管理节点上运行的容器(通过容器运行时 CRI)
  • 上报节点状态和 Pod 状态到 API Server
  • 执行 PodSpec 中定义的资源、卷挂载、健康检查等
  • 保证节点上 Pod 的实际状态与期望状态一致

关键定位:Kubelet 是 节点端的控制器,连接 API Server 与容器运行时。


二、源码目录结构(go 项目)

Kubelet 代码在 Kubernetes 仓库的路径:

kubernetes/pkg/kubelet

主要目录和文件:

目录/文件作用
kubelet.goKubelet 主启动入口
kubelet_node_status.go节点状态上报逻辑
kubelet_pods.goPod 同步、生命周期管理
container/runtime容器运行时接口(CRI)实现
volume卷管理、挂载和卸载
serverKubelet 内置 HTTP/gRPC server
statusPod 和容器状态管理
config配置管理与动态更新
device节点设备管理(GPU 等)

三、Kubelet 启动流程

1️⃣ 入口:cmd/kubelet/kubelet.go

  • 函数:NewMainKubeletCommand()
  • 流程:
    1. 解析 CLI flags 和配置文件
    2. 创建 Kubelet 对象
    3. 初始化容器运行时、卷管理、证书、cAdvisor
    4. 启动主循环 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
  • 流程:
    1. 挂载卷(Mount)
    2. 绑定 Pod 与卷
    3. Pod 删除时卸载卷(Unmount)

七、健康检查与 cAdvisor

  • Kubelet 内置 cAdvisor 收集节点和容器资源使用情况(CPU、内存、网络)
  • 健康检查类型:
    • LivenessProbe
    • ReadinessProbe
    • StartupProbe
  • 探针失败时 Kubelet 会重启容器或更新 Pod 状态

八、与 API Server 的交互

  1. 节点注册
    • kubelet 自启动时调用 NodeRegistrationHandler 注册节点信息
  2. Pod Watcher
    • 通过 podInformer 监听 API Server Pod 变更
  3. 状态上报
    • 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 watchpkg/kubelet/kubelet.go -> podWorkers

🔟 总结

Kubelet 核心职责:

  1. Pod 生命周期管理:创建、启动、健康检查、删除
  2. 容器运行时接口:通过 CRI 管理容器
  3. 卷管理:挂载/卸载存储卷
  4. 节点状态上报:NodeStatus & PodStatus
  5. 资源监控:cAdvisor + 健康检查
  6. API Server 交互:获取 Pod 指令、上报状态

源码分析建议

  • 先看 kubelet.go 的启动流程
  • 理解 syncLooppodWorkers
  • 理解 CRI 调用流程(containerd / Docker)
  • 理解状态管理与健康检查机制