1.7 Kubelet :节点代理的核心组件
一、Kubelet 概述
Kubelet 是 Kubernetes 集群中运行在每个工作节点上的主要”节点代理”,负责管理 Pod 和容器的生命周期。它是 Kubernetes 操作的最小单元,确保容器按照预期运行。
二、核心功能详解
接收到在节点上加载容器或pod的指令时,请求容器运行时引擎(Docker)拉取所需的Image并运行一个实例;Kubelet继续监控pod和容器的状态并及时向Kube API服务器报告。
1. 节点注册 (Register Node)
工作流程:
- 启动时注册:
1 2
| kubectl describe node <node-name> | grep -A 10 "System Info"
|
- 定期心跳:
- 通过
--node-status-update-frequency 参数控制频率(默认10秒)1 2
| kubectl get node <node-name> -o jsonpath='{.status.conditions[?(@.type=="Ready")].lastHeartbeatTime}'
|
关键配置:
1 2
| ps aux | grep kubelet | grep -E "register-node|node-labels|node-ip"
|
2. 创建和管理 Pods
Pod 创建流程:
接收 PodSpec:通过以下方式之一:
- API Server(主要方式)
- 静态 Pod 的清单文件(
--pod-manifest-path 指定目录)
容器运行时交互:
1 2
| ps aux | grep kubelet | grep -E "container-runtime|pod-infra-container-image"
|
资源准备:
- 挂载卷(Volumes)
- 下载镜像(Images)
- 准备网络命名空间
3. 监控节点和 Pods
监控机制:
节点健康检查:
1 2
| kubectl get node <node-name> -o jsonpath='{.status.conditions}'
|
Pod 健康检查:
- Liveness probes
- Readiness probes
- Startup probes
状态上报:
1 2
| 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
| ls -l /var/lib/kubelet/
|
重要子目录:
pods/:Pod数据目录
plugins/:卷插件
pod-resources/:Pod资源信息
四、Kubelet 命令与操作
1. 服务管理
1 2 3 4 5 6
| systemctl status kubelet
sudo systemctl restart kubelet
journalctl -u kubelet -f
|
2. 运行时检查
1 2 3 4
| ps aux | grep kubelet
sudo netstat -tulnp | grep kubelet
|
3. 调试命令
1 2 3 4
| kubectl delete pod <pod-name> --grace-period=0 --force
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -text
|
五、Kubelet 配置详解
1. 重要启动参数
关键参数:
--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
| 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
| 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 get --raw "/api/v1/nodes/<node-name>/proxy/healthz"
|
3. 资源不足处理
1 2 3 4
| kubectl describe node <node-name> | grep -A 10 "Allocated resources"
kubectl get pods --all-namespaces -o wide | grep Evicted
|