什么是 Kubelet?#
Kubelet 是 Kubernetes 中最关键的节点代理组件,它运行在集群的每个节点(包括 master 和 worker 节点)上,负责确保容器在 Pod 中正常运行。简单来说,Kubelet 是 Kubernetes 控制平面与节点上容器运行时之间的桥梁,它将 API Server 中描述的 Pod 规范转化为实际运行的容器。
作为 Kubernetes 架构中唯一直接与容器运行时交互的控制平面组件,Kubelet 是整个系统稳定性的基石。没有 Kubelet,节点就无法加入集群,容器也无法被调度和管理。
Kubelet 在 Kubernetes 中的核心角色#
1. 节点的"注册员"#
- 向 API Server 注册节点信息(CPU、内存、存储、网络等)
- 定期发送心跳(node status updates),报告节点健康状态
- 当节点失联时,触发节点 NotReady 状态,促使调度器重新分配 Pod
2. Pod 生命周期的"管理员"#
- 监听 API Server 中分配给本节点的 Pod
- 调用容器运行时创建、启动、停止和删除容器
- 确保容器按照 Pod 规范运行,监控容器健康状态
- 执行容器探针(liveness、readiness、startup)
3. 节点资源的"协调员"#
- 管理节点上的计算资源(CPU、内存)
- 管理节点上的存储(卷挂载、卸载)
- 管理节点上的网络(通过 CNI 插件配置网络)
- 实施资源限制(QoS 策略:Guaranteed、Burstable、BestEffort)
Kubelet 的核心架构与工作流程#
1. Kubelet 组件架构#
graph LR A[API Server] -->|PodSpec| B(Kubelet) B --> C[Pod Manager] B --> D[Volume Manager] B --> E[Container Runtime Interface CRI] B --> F[网络插件 CNI] B --> G[镜像管理] C --> E D --> E E --> H[Containerd/Docker] F --> I[网络配置]
Kubelet 由多个关键子系统组成:
- Pod 管理器:处理 Pod 生命周期
- 卷管理器:挂载/卸载存储卷
- CRI (Container Runtime Interface):与容器运行时交互
- CNI (Container Network Interface):配置网络
- 镜像管理器:拉取和管理容器镜像
2. Kubelet 工作流程#
Pod 获取:
- 通过 API Server 监听分配给本节点的 Pod
- 也可以通过静态 Pod 配置文件(/etc/kubernetes/manifests/)直接创建
Pod 同步:
- 检查当前运行的 Pod 与期望状态的差异
- 执行必要操作(创建新容器、停止旧容器等)
健康监控:
- 定期执行存活探针(liveness probe)
- 执行就绪探针(readiness probe)
- 根据结果重启容器或修改 Pod 状态
状态报告:
- 定期向 API Server 报告节点状态
- 报告 Pod 状态(Running、Failed、Succeeded 等)
- 报告资源使用情况(CPU、内存等)
Kubelet 与容器运行时的交互#
1. CRI (Container Runtime Interface) 架构#
graph TD A[Kubelet] -->|gRPC API| B[CRI Shim] B -->|具体实现| C[Container Runtime] C --> D[Containerd] C --> E[CRI-O] C --> F[Docker*]
*注意:Docker 通过 dockershim 间接支持 CRI,但已在 Kubernetes 1.24+ 中移除
2. 容器生命周期管理#
Kubelet 通过 CRI 调用容器运行时执行以下操作:
- 拉取容器镜像 (
ImageService) - 创建 Pod 沙箱 (
RunPodSandbox) - 创建/启动/停止/删除容器 (
ContainerService) - 执行命令 (
ExecSync) - 获取容器日志 (
ContainerLog) - 监控资源使用 (
ListContainerStats)
3. 主流容器运行时对比#
| 运行时 | 特点 | 适用场景 |
|---|---|---|
| Containerd | 轻量级,源自 Docker 核心组件 | 通用生产环境 |
| CRI-O | 专为 Kubernetes 设计,OCI 兼容 | OpenShift/严格安全要求环境 |
| Docker Engine | 需要 dockershim,已弃用 | 旧版 Kubernetes 集群 |
Kubelet 的核心功能详解#
1. 静态 Pod#
# /etc/kubernetes/manifests/static-web.yaml
apiVersion: v1
kind: Pod
metadata:
name: static-web
namespace: default
spec:
containers:
- name: web
image: nginx
ports:
- containerPort: 80- 存放在特定目录(通常为
/etc/kubernetes/manifests/)的 Pod 清单 - 由 Kubelet 直接管理,不通过 API Server
- 用于运行关键系统组件(如 kube-apiserver、etcd)
- API Server 会为静态 Pod 创建镜像 Pod (Mirror Pod),用于监控但不能修改
2. 资源管理与 QoS#
Kubelet 根据 Pod 的资源请求/限制实施服务质量策略:
| QoS 类别 | CPU/内存请求与限制 | 驱逐优先级 | 适用场景 |
|---|---|---|---|
| Guaranteed | 请求=限制≠0 | 最后驱逐 | 关键应用 |
| Burstable | 请求<限制 或 仅设置请求 | 中等优先级 | 一般应用 |
| BestEffort | 无请求/限制 | 首先驱逐 | 批处理任务 |
当节点资源不足时,Kubelet 按 QoS 优先级驱逐 Pod,保护高优先级应用。
3. 健康检查机制#
Kubelet 执行三种探针:
- Liveness Probe:确定容器是否存活,失败则重启容器
- Readiness Probe:确定容器是否准备好接收流量,失败则从 Service 端点移除
- Startup Probe:确定容器是否已启动,保护启动缓慢的容器
spec:
containers:
- name: app
image: my-app
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
exec:
command:
- cat
- /tmp/ready
initialDelaySeconds: 5
periodSeconds: 54. 节点资源预留#
Kubelet 为系统守护进程和 Kubernetes 组件预留资源,防止资源耗尽:
kubelet \
--system-reserved=cpu=100m,memory=1Gi \
--kube-reserved=cpu=200m,memory=1Gi \
--eviction-hard=memory.available<500Mi,nodefs.available<10%- system-reserved:为系统进程(如 sshd、systemd)保留资源
- kube-reserved:为 Kubernetes 系统组件(如 docker、kubelet)保留资源
- eviction-thresholds:触发 Pod 驱逐的阈值
Kubelet 的配置与管理#
1. 配置方式#
Kubelet 支持多种配置方式(优先级从高到低):
- 命令行标志(Flags)
- 配置文件(推荐)
- Kubelet 配置资源(ConfigMap + Dynamic Kubelet Configuration,已弃用)
示例配置文件 (/var/lib/kubelet/config.yaml)#
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
address: 0.0.0.0
port: 10250
readOnlyPort: 0
authentication:
anonymous:
enabled: false
webhook:
enabled: true
x509:
clientCAFile: /etc/kubernetes/pki/ca.crt
authorization:
mode: Webhook
cgroupDriver: systemd
clusterDNS:
- 10.96.0.10
clusterDomain: cluster.local
failSwapOn: true
staticPodPath: /etc/kubernetes/manifests
podCIDR: 10.244.0.0/24
resolvConf: /run/systemd/resolve/resolv.conf
runtimeRequestTimeout: 15m
serializeImagePulls: false
tlsCertFile: /var/lib/kubelet/pki/kubelet.crt
tlsPrivateKeyFile: /var/lib/kubelet/pki/kubelet.key2. 关键配置参数#
| 参数 | 说明 | 推荐值 |
|---|---|---|
| cgroupDriver | Cgroup 驱动,需与容器运行时一致 | systemd |
| podCIDR | 节点分配的 Pod IP 范围 | 由控制器分配 |
| maxPods | 节点允许的最大 Pod 数 | 110 (默认) |
| kubeReserved | 为 Kubernetes 系统组件保留的资源 | 根据节点大小配置 |
| systemReserved | 为系统守护进程保留的资源 | 根据节点大小配置 |
| evictionHard | 硬性驱逐阈值 | memory.available<500Mi |
| featureGates | 启用/禁用实验性功能 | 根据需求配置 |
3. 启动与管理#
Kubelet 通常作为系统服务运行:
# 检查 Kubelet 状态
systemctl status kubelet
# 重启 Kubelet (配置更改后)
systemctl restart kubelet
# 查看 Kubelet 日志
journalctl -u kubelet -f
# 检查 Kubelet 配置
kubelet --helpKubelet 的安全机制#
1. 认证与授权#
Kubelet 实现严格的访问控制:
认证:
- TLS 客户端证书认证(默认)
- 令牌认证(ServiceAccount 令牌)
- 禁用匿名访问(–anonymous-auth=false)
授权:
- Webhook 模式:调用 API Server 的 SubjectAccessReview API
- 确保只有授权用户和服务可以访问 Kubelet API
2. 关键安全配置#
kubelet \
--anonymous-auth=false \
--authorization-mode=Webhook \
--read-only-port=0 \ # 禁用不安全的只读端口
--protect-kernel-defaults=true \
--tls-cert-file=/var/lib/kubelet/pki/kubelet.crt \
--tls-private-key-file=/var/lib/kubelet/pki/kubelet.key \
--client-ca-file=/etc/kubernetes/pki/ca.crt3. 安全加固措施#
- 禁用不必要的功能:关闭只读端口(10255),限制 Kubelet API 访问
- 最小权限原则:Kubelet 证书仅授予必要权限
- 网络隔离:通过防火墙限制 Kubelet 端口(10250)的访问
- 文件权限:保护 Kubelet 配置文件和证书
- Seccomp/AppArmor:限制容器系统调用
Kubelet 的监控与故障排除#
1. 关键监控指标#
| 指标类别 | 重要指标 | 健康阈值 |
|---|---|---|
| 资源使用 | Kubelet CPU/内存 | < 20% 节点资源 |
| Pod 状态 | Running Pods 数量 | 与期望值匹配 |
| 同步延迟 | Pod 同步延迟 | < 5 秒 |
| PLEG 延迟 | Pod 生命周期事件生成延迟 | < 1 秒 |
| 驱逐事件 | 驱逐次数/小时 | 0 (正常情况) |
2. 诊断命令#
# 检查节点状态
kubectl describe node <node-name>
# 检查 Kubelet 证书
openssl x509 -in /var/lib/kubelet/pki/kubelet.crt -text -noout
# 检查已注册的 Pod
curl -k https://localhost:10250/pods \
--cert /var/lib/kubelet/pki/kubelet-client-current.pem \
--key /var/lib/kubelet/pki/kubelet-client-current.pem
# 检查卷挂载
kubectl get volumeattachment
# 检查 Kubelet 配置
curl -k https://localhost:10250/configz \
--cert /var/lib/kubelet/pki/kubelet-client-current.pem \
--key /var/lib/kubelet/pki/kubelet-client-current.pem3. 常见问题与解决方案#
| 问题现象 | 可能原因 | 诊断命令 | 解决方案 |
|---|---|---|---|
| 节点 NotReady | Kubelet 未运行/不健康 | systemctl status kubelet | 重启 Kubelet,检查日志 |
| Pod 无法启动 | 容器运行时不可用 | crictl info | 检查容器运行时状态 |
| 镜像拉取失败 | 镜像不存在/认证失败 | journalctl -u kubelet -f | 验证镜像名称,配置 imagePullSecret |
| 证书过期 | Kubelet 证书过期 | openssl x509 -enddate -noout -in /var/lib/kubelet/pki/kubelet.crt | 重新生成证书,重启 Kubelet |
| 资源耗尽 | 节点内存/CPU 不足 | kubectl describe node | 调整资源预留,添加节点 |
| PLEG 不健康 | 容器运行时响应慢 | systemctl status containerd | 重启容器运行时,升级版本 |
Kubelet 与集群组件的交互#
1. 与 API Server#
- Kubelet 通过 API Server 获取分配给节点的 Pod
- 定期向 API Server 发送节点和 Pod 状态
- 通过 watch 机制实时获取 Pod 变化
2. 与容器运行时#
- 通过 CRI gRPC API 与容器运行时交互
- 容器运行时负责实际容器生命周期管理
- Kubelet 仅作为协调者,不直接管理容器
3. 与 CNI 插件#
- Kubelet 调用 CNI 插件配置 Pod 网络
- CNI 插件负责分配 IP、设置网络命名空间
- 通用 CNI 配置位于
/etc/cni/net.d/
4. 与 CSI 驱动#
- 通过 CSI 驱动管理存储卷
- 负责卷的挂载、卸载、格式化
- 与云存储提供商集成
最佳实践#
版本管理:
- 保持 Kubelet 与控制平面版本兼容(最多差一个次要版本)
- 定期更新 Kubelet 以获取安全补丁
资源管理:
- 为系统和 Kubernetes 组件合理预留资源
- 根据节点规格调整
maxPods参数 - 配置合理的驱逐阈值
安全加固:
- 始终启用 TLS 和认证
- 禁用匿名访问和只读端口
- 定期轮换 Kubelet 证书
监控与日志:
- 收集 Kubelet 指标(通过 Prometheus Node Exporter)
- 集中管理 Kubelet 日志
- 设置节点状态告警(NotReady 持续超过 5 分钟)
维护策略:
- 使用维护窗口进行 Kubelet 升级
- 通过 PodDisruptionBudget 避免服务中断
- 采用滚动更新策略更新节点
性能优化:
- 使用
serializeImagePulls: false并行拉取镜像 - 为容器运行时配置镜像缓存
- 优化 DNS 配置(使用 node-local-dns)
- 使用
一个简单类比#
想象 Kubernetes 集群是一座大型酒店:
- Kubelet 是酒店的楼层管家,负责管理一个特定楼层
- 节点(Node) 是酒店的一个完整楼层
- Pod 是楼层上的各个房间
- 容器 是房间内的不同设施(床、浴室、电视等)
- API Server 是酒店的总台和中央管理系统
- 调度器(Scheduler) 是前台接待,分配客人到合适房间
楼层管家(Kubelet)的日常职责:
- 注册与报告:向总台报告本楼层状态(可用房间、设施状况)
- 客人安置:根据总台指令,准备房间(Pod)迎接客人(容器)
- 设施维护:确保房间内所有设施正常工作,及时修理故障
- 服务质量检查:定期检查房间是否满足入住标准(健康检查)
- 资源管理:管理楼层资源(水、电、网络),确保不超负荷
- 紧急响应:当设施故障时,及时上报并采取临时措施(驱逐不健康的 Pod)
当有新客人入住时:
- 前台(调度器)分配房间到特定楼层
- 楼层管家(Kubelet)收到通知
- 准备房间:清洁、配置网络、设置电视等(创建 Pod 和容器)
- 通知前台房间已准备好
- 在客人入住期间,持续监控房间状态,确保舒适体验
Kubelet 作为 Kubernetes 节点上最关键的组件,是整个集群稳定性和可靠性的基石。理解 Kubelet 的工作原理和配置,对于排查集群问题、优化节点性能和确保应用可靠性至关重要。它不仅是一个技术组件,更是 Kubernetes “自愈"和"声明式"设计理念在节点层面的完美体现:持续监控实际状态,确保与期望状态一致。
对于 Kubernetes 运维人员来说,掌握 Kubelet 是进阶的必经之路。它连接了抽象的集群调度和具体的容器运行,是理解 Kubernetes 如何真正工作的重要窗口。通过合理配置和监控 Kubelet,可以显著提升集群的稳定性和资源利用率,为上层应用提供坚实的基础。