1.7 Kubelet

1.7 Kubelet :节点代理的核心组件

一、Kubelet 概述

Kubelet 是 Kubernetes 集群中运行在每个工作节点上的主要”节点代理”,负责管理 Pod 和容器的生命周期。它是 Kubernetes 操作的最小单元,确保容器按照预期运行。

二、核心功能详解

接收到在节点上加载容器或pod的指令时,请求容器运行时引擎(Docker)拉取所需的Image并运行一个实例;Kubelet继续监控pod和容器的状态并及时向Kube API服务器报告。

1. 节点注册 (Register Node)

工作流程

  1. 启动时注册
    1
    2
    # 查看节点注册信息
    kubectl describe node <node-name> | grep -A 10 "System Info"
  2. 定期心跳
    • 通过 --node-status-update-frequency 参数控制频率(默认10秒)
      1
      2
      # 查看节点状态更新时间戳
      kubectl get node <node-name> -o jsonpath='{.status.conditions[?(@.type=="Ready")].lastHeartbeatTime}'

关键配置

1
2
# 查看kubelet注册参数
ps aux | grep kubelet | grep -E "register-node|node-labels|node-ip"

2. 创建和管理 Pods

Pod 创建流程

  1. 接收 PodSpec:通过以下方式之一:

    • API Server(主要方式)
    • 静态 Pod 的清单文件(--pod-manifest-path 指定目录)
  2. 容器运行时交互

    1
    2
    # 查看kubelet与容器运行时通信配置
    ps aux | grep kubelet | grep -E "container-runtime|pod-infra-container-image"
  3. 资源准备

    • 挂载卷(Volumes)
    • 下载镜像(Images)
    • 准备网络命名空间

3. 监控节点和 Pods

监控机制

  1. 节点健康检查

    1
    2
    # 查看节点健康状况
    kubectl get node <node-name> -o jsonpath='{.status.conditions}'
  2. Pod 健康检查

    • Liveness probes
    • Readiness probes
    • Startup probes
  3. 状态上报

    1
    2
    # 查看kubelet状态上报频率
    ps aux | grep kubelet | grep -E "node-status-update-frequency|sync-frequency"

三、Kubelet 架构深入

1. 主要组件

  • **PLEG (Pod Lifecycle Event Generator)**:生成Pod生命周期事件
  • cAdvisor:容器监控数据收集
  • Volume Manager:卷管理
  • **Container Runtime Interface (CRI)**:与容器运行时交互

2. 关键目录结构

1
2
# 查看kubelet工作目录
ls -l /var/lib/kubelet/

重要子目录:

  • pods/:Pod数据目录
  • plugins/:卷插件
  • pod-resources/:Pod资源信息

四、Kubelet 命令与操作

1. 服务管理

1
2
3
4
5
6
# 查看kubelet服务状态
systemctl status kubelet
# 重启kubelet
sudo systemctl restart kubelet
# 查看日志
journalctl -u kubelet -f

2. 运行时检查

1
2
3
4
# 查看kubelet进程详情
ps aux | grep kubelet
# 检查kubelet端口监听
sudo netstat -tulnp | grep kubelet

3. 调试命令

1
2
3
4
# 强制删除异常Pod
kubectl delete pod <pod-name> --grace-period=0 --force
# 检查kubelet证书
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -text

五、Kubelet 配置详解

1. 重要启动参数

1
2
# 查看当前运行的参数
ps aux | grep kubelet

关键参数:

  • --config:配置文件路径
  • --kubeconfig:连接API Server的认证文件
  • --pod-manifest-path:静态Pod路径
  • --fail-swap-on:是否禁止swap
  • --container-runtime:容器运行时选择
  • --node-status-update-frequency:状态上报频率

2. 配置文件示例

/var/lib/kubelet/config.yaml 典型内容:

1
2
3
4
5
6
7
8
9
10
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
address: "0.0.0.0"
port: 10250
serializeImagePulls: false
evictionHard:
memory.available: "100Mi"
nodefs.available: "10%"
nodefs.inodesFree: "5%"
imagefs.available: "15%"

六、Kubelet 与其他组件交互

1. 与 API Server 交互

  • 认证:使用 TLS 证书
  • 授权:通过 Node authorizer
  • 通信:通过 --kubeconfig 指定配置

2. 与容器运行时交互

支持多种运行时:

1
2
# 查看当前使用的运行时
ps aux | grep kubelet | grep container-runtime

3. 与 cAdvisor 集成

1
2
3
# 获取节点监控数据(需要先进行端口转发)
kubectl proxy &
curl http://localhost:8001/api/v1/nodes/<node-name>/proxy/metrics/cadvisor

七、特殊注意事项

1. Kubeadm 不部署 Kubelet

1
2
3
# 手动安装kubelet示例(Ubuntu)
sudo apt-get update && sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

2. 证书轮换管理

1
2
3
4
# 检查证书状态
sudo journalctl -u kubelet | grep -i "certificate"
# 手动轮换证书
sudo systemctl restart kubelet

3. 资源清理

1
2
3
4
# 清理未使用的镜像
sudo docker image prune -a
# 清理终止的容器
sudo docker container prune

八、故障排查指南

1. 常见问题诊断

1
2
3
4
# 检查kubelet日志中的错误
sudo journalctl -u kubelet --no-pager | grep -i error
# 检查证书过期
openssl x509 -in /var/lib/kubelet/pki/kubelet.crt -noout -dates

2. 健康检查端点

1
2
3
curl -sk https://<node-ip>:10250/healthz
# 或通过kubectl proxy
kubectl get --raw "/api/v1/nodes/<node-name>/proxy/healthz"

3. 资源不足处理

1
2
3
4
# 查看节点资源压力
kubectl describe node <node-name> | grep -A 10 "Allocated resources"
# 查看被驱逐的Pod
kubectl get pods --all-namespaces -o wide | grep Evicted