kubelet 的主要职责是什么?它是如何管理 Pod 的?
Kubelet 是 Kubernetes 集群中每个节点(Node)上运行的主要“节点代理”(Node Agent)。它是 Kubernetes 控制平面(Control Plane)与节点计算资源之间的桥梁。
简单来说,如果把 Kubernetes 集群比作一艘大船,API Server 是发号施令的船长,那么 Kubelet 就是甲板上负责具体干活的水手。
以下是关于 Kubelet 主要职责及其管理 Pod 机制的详细解析:
一、 Kubelet 的主要职责
Kubelet 的核心目标是:确保 Pod 按照预期在节点上运行,并向控制平面汇报节点和 Pod 的状态。
具体职责包括:
节点注册与状态汇报:
- Kubelet 启动时会向 API Server 注册自己所在的节点。
- 它会定期向 API Server 汇报节点的状态(磁盘空间、内存、CPU 使用率、健康状况等),以便调度器(Scheduler)决定是否向该节点分配新的 Pod。
Pod 生命周期管理:
- 这是最核心的功能。它负责创建、修改、启动、停止和销毁 Pod 中的容器。
- 它只管理分配给该节点的 Pod,不关心其他节点的状况。
健康检查(Probes):
- Kubelet 负责执行 Pod 定义中的探针(Probes):
- Liveness Probe(存活探针): 容器死了吗?如果死了,Kubelet 会重启它。
- Readiness Probe(就绪探针): 容器准备好接收流量了吗?如果没准备好,Kubelet 会通知 Service 移除该 Pod 的 IP。
- Startup Probe(启动探针): 应用启动完成了吗?
- Kubelet 负责执行 Pod 定义中的探针(Probes):
资源监控:
- Kubelet 内部集成了 cAdvisor,用于收集节点和容器的资源使用数据(CPU、内存、文件系统等),并对外提供 metrics 接口。
容器环境准备:
- 在启动容器前,Kubelet 负责挂载数据卷(Volumes)、下载 Secrets 和 ConfigMaps,并协助配置网络。
管理静态 Pod(Static Pods):
- 除了管理 API Server 分配的 Pod,Kubelet 还可以管理由本地文件(通常在
/etc/kubernetes/manifests)定义的 Pod。这通常用于启动控制平面组件(如 etcd、kube-apiserver 等)。
- 除了管理 API Server 分配的 Pod,Kubelet 还可以管理由本地文件(通常在
二、 Kubelet 是如何管理 Pod 的?
Kubelet 管理 Pod 的核心机制是一个控制循环(Control Loop),通常被称为 Sync Loop。
1. 获取 Pod 清单(PodSpecs)
Kubelet 通过多种渠道获取“我这个节点上应该运行哪些 Pod”的指令:
- API Server(最主要): Kubelet 监听(Watch)API Server,一旦发现有 Pod 被调度到自己所在的节点,就会获取该 Pod 的配置(PodSpec)。
- 本地文件目录: 用于静态 Pod。
- HTTP 端点: 较少使用。
2. 对比与同步(Reconciliation)
Kubelet 不断对比“期望状态”(PodSpec)和“当前状态”(节点上实际运行的容器)。如果两者不一致,它就会采取行动。
3. Pod 启动流程(具体步骤)
当 Kubelet 发现需要创建一个新 Pod 时,它会按以下顺序操作:
- 生成 Pod 状态对象: Kubelet 在内部创建一个 Pod 对象来跟踪状态。
- 挂载 Volume(CSI): 如果 Pod 需要存储,Kubelet 会调用 CSI(容器存储接口)插件将存储卷挂载到宿主机,并准备映射到容器内。
- 下载 Secrets/ConfigMaps: 拉取该 Pod 需要的配置信息。
- 创建 Pause 容器(Sandbox):
- Kubelet 首先通过 CRI(容器运行时接口) 调用底层运行时(如 containerd 或 CRI-O)创建一个“Sandbox 容器”(通常是
pause容器)。 - 这个容器的作用是持有 Pod 的网络命名空间(Network Namespace)和 IPC 命名空间。
- Kubelet 首先通过 CRI(容器运行时接口) 调用底层运行时(如 containerd 或 CRI-O)创建一个“Sandbox 容器”(通常是
- 配置网络(CNI):
- Sandbox 创建后,Kubelet 调用 CNI(容器网络接口) 插件。
- CNI 插件负责给这个 Sandbox 分配 IP 地址,并打通网络。
- 启动业务容器:
- Kubelet 再次调用 CRI,拉取业务镜像(Image Pull),并根据 PodSpec 定义的参数(命令、环境变量、资源限制)在 Sandbox 的网络命名空间内启动实际的业务容器。
- 如果是 Init Container,会先按顺序执行完毕,再启动主容器。
4. 持续监控与 PLEG
- PLEG (Pod Lifecycle Event Generator): Kubelet 内部有一个模块叫 PLEG。它不断轮询容器运行时(CRI),获取容器的实际状态变化(Started, Died, etc.),并生成事件。
- Kubelet 根据这些事件更新内部状态,并向 API Server 汇报。
- 同时,Kubelet 启动定时任务执行 Liveness/Readiness 探针。
5. 垃圾回收(Garbage Collection)
如果 Pod 被删除或节点资源不足,Kubelet 会负责清理停止的容器和未使用的镜像,释放磁盘空间。
总结
Kubelet 是“节点管家”。
它不负责复杂的调度决策(那是 Scheduler 的事),也不负责集群层面的控制(那是 Controller Manager 的事)。它只专注于眼下的任务: 盯着 API Server 给它的清单,通过调用 CRI(管容器)、CNI(管网络)、CSI(管存储)这三个接口,确保节点上的容器老老实实地按定义运行,并随时汇报情况。