Kubelet 详解:Kubernetes 集群的"节点管家"

This article is extracted from the chat log with AI. Please identify it with caution.

什么是 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 工作流程#

  1. Pod 获取

    • 通过 API Server 监听分配给本节点的 Pod
    • 也可以通过静态 Pod 配置文件(/etc/kubernetes/manifests/)直接创建
  2. Pod 同步

    • 检查当前运行的 Pod 与期望状态的差异
    • 执行必要操作(创建新容器、停止旧容器等)
  3. 健康监控

    • 定期执行存活探针(liveness probe)
    • 执行就绪探针(readiness probe)
    • 根据结果重启容器或修改 Pod 状态
  4. 状态报告

    • 定期向 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: 5

4. 节点资源预留#

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 支持多种配置方式(优先级从高到低):

  1. 命令行标志(Flags)
  2. 配置文件(推荐)
  3. 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.key

2. 关键配置参数#

参数说明推荐值
cgroupDriverCgroup 驱动,需与容器运行时一致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 --help

Kubelet 的安全机制#

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.crt

3. 安全加固措施#

  • 禁用不必要的功能:关闭只读端口(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.pem

3. 常见问题与解决方案#

问题现象可能原因诊断命令解决方案
节点 NotReadyKubelet 未运行/不健康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 驱动管理存储卷
  • 负责卷的挂载、卸载、格式化
  • 与云存储提供商集成

最佳实践#

  1. 版本管理

    • 保持 Kubelet 与控制平面版本兼容(最多差一个次要版本)
    • 定期更新 Kubelet 以获取安全补丁
  2. 资源管理

    • 为系统和 Kubernetes 组件合理预留资源
    • 根据节点规格调整 maxPods 参数
    • 配置合理的驱逐阈值
  3. 安全加固

    • 始终启用 TLS 和认证
    • 禁用匿名访问和只读端口
    • 定期轮换 Kubelet 证书
  4. 监控与日志

    • 收集 Kubelet 指标(通过 Prometheus Node Exporter)
    • 集中管理 Kubelet 日志
    • 设置节点状态告警(NotReady 持续超过 5 分钟)
  5. 维护策略

    • 使用维护窗口进行 Kubelet 升级
    • 通过 PodDisruptionBudget 避免服务中断
    • 采用滚动更新策略更新节点
  6. 性能优化

    • 使用 serializeImagePulls: false 并行拉取镜像
    • 为容器运行时配置镜像缓存
    • 优化 DNS 配置(使用 node-local-dns)

一个简单类比#

想象 Kubernetes 集群是一座大型酒店:

  • Kubelet 是酒店的楼层管家,负责管理一个特定楼层
  • 节点(Node) 是酒店的一个完整楼层
  • Pod 是楼层上的各个房间
  • 容器 是房间内的不同设施(床、浴室、电视等)
  • API Server 是酒店的总台和中央管理系统
  • 调度器(Scheduler) 是前台接待,分配客人到合适房间

楼层管家(Kubelet)的日常职责:

  1. 注册与报告:向总台报告本楼层状态(可用房间、设施状况)
  2. 客人安置:根据总台指令,准备房间(Pod)迎接客人(容器)
  3. 设施维护:确保房间内所有设施正常工作,及时修理故障
  4. 服务质量检查:定期检查房间是否满足入住标准(健康检查)
  5. 资源管理:管理楼层资源(水、电、网络),确保不超负荷
  6. 紧急响应:当设施故障时,及时上报并采取临时措施(驱逐不健康的 Pod)

当有新客人入住时:

  • 前台(调度器)分配房间到特定楼层
  • 楼层管家(Kubelet)收到通知
  • 准备房间:清洁、配置网络、设置电视等(创建 Pod 和容器)
  • 通知前台房间已准备好
  • 在客人入住期间,持续监控房间状态,确保舒适体验

Kubelet 作为 Kubernetes 节点上最关键的组件,是整个集群稳定性和可靠性的基石。理解 Kubelet 的工作原理和配置,对于排查集群问题、优化节点性能和确保应用可靠性至关重要。它不仅是一个技术组件,更是 Kubernetes “自愈"和"声明式"设计理念在节点层面的完美体现:持续监控实际状态,确保与期望状态一致。

对于 Kubernetes 运维人员来说,掌握 Kubelet 是进阶的必经之路。它连接了抽象的集群调度和具体的容器运行,是理解 Kubernetes 如何真正工作的重要窗口。通过合理配置和监控 Kubelet,可以显著提升集群的稳定性和资源利用率,为上层应用提供坚实的基础。

本文共 3848 字,创建于 Dec 31, 2025

相关标签: Kubernetes, ByAI