kubelet
从日志和状态变化来看,kubelet 服务在重启前处于 inactive (dead) 状态,重启后恢复正常。以下是根本原因分析和解决方案:
1. 关键日志分析
错误日志(重启前)
E0610 08:26:16.940919 2667 run.go:72] "command failed" err="failed to load kubelet config file"
E0610 08:26:36.518529 2828 certificate_manager.go:562] "Unhandled Error" err="kubernetes.io/kube-apiserver-client-kubelet certificate not found"
E0623 10:19:24.500532 1609 log.go:32] "RemoveContainer from runtime service failed" err="rpc error: code = Unknown desc = failed to set removing state for container..."
- 核心问题:
- 无法加载 kubelet 配置文件(可能路径错误或权限不足)。
- 缺少客户端证书(
kube-apiserver-client-kubelet证书缺失或过期)。 - 容器运行时通信异常(可能是 containerd/docker 未正常运行)。
重启后状态
Active: active (running) since Mon 2025-06-23 10:32:35 UTC
重启后正常,说明问题可能是 临时性资源冲突或证书/配置未自动加载。
2. 根本原因推测
(1) 证书问题(最可能)
kubelet需要与kube-apiserver通信,依赖以下证书:/var/lib/kubelet/pki/kubelet-client-current.pem(当前使用的客户端证书)。/etc/kubernetes/kubelet.conf(kubeconfig 文件)。
- 可能场景:
- 证书过期或损坏。
kubelet启动时证书未就绪(例如集群证书轮换后未重启kubelet)。
(2) 配置加载失败
kubelet的配置文件(如/var/lib/kubelet/config.yaml)可能:- 被误删除或修改。
- 权限不足(需
root:root和600权限)。
(3) 容器运行时异常
kubelet依赖容器运行时(如 containerd/docker),如果运行时服务崩溃,kubelet会报错:"RemoveContainer from runtime service failed" err="rpc error: code = Unknown desc = ..."
(4) 资源竞争
- 如果
kubelet进程崩溃后未完全释放资源(如端口、锁文件),重启可能解决临时冲突。
3. 解决方案
步骤 1:检查证书状态
# 检查客户端证书
ls -l /var/lib/kubelet/pki/kubelet-client-current.pem
# 检查证书有效期(如果有 openssl)
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -dates
# 验证 kubeconfig
cat /etc/kubernetes/kubelet.conf | grep client-certificate-data
- 如果证书过期或缺失:
# 重新生成证书(kubeadm 集群) kubeadm init phase kubeconfig kubelet --config /etc/kubernetes/kubeadm.yaml systemctl restart kubelet
步骤 2:验证 kubelet 配置
# 检查配置文件
cat /var/lib/kubelet/config.yaml
# 检查权限
ls -l /var/lib/kubelet/config.yaml
- 修复权限:
chmod 600 /var/lib/kubelet/config.yaml chown root:root /var/lib/kubelet/config.yaml
步骤 3:检查容器运行时
# 查看 containerd/docker 状态
systemctl status containerd # 或 docker
# 重启容器运行时
systemctl restart containerd
步骤 4:长期监控
# 查看 kubelet 日志(实时)
journalctl -u kubelet -f
# 检查 kubelet 健康端口
curl -sk http://localhost:10248/healthz
- 如果输出
ok表示健康。
4. 预防措施
| 问题类型 | 预防方法 |
|---|---|
| 证书过期 | 配置集群证书自动轮换(如 kubeadm alpha certs renew)。 |
| 配置错误 | 使用 kubeadm config 管理配置,避免手动修改。 |
| 运行时故障 | 监控 containerd/docker 服务,设置自动重启(systemctl enable containerd)。 |
| 资源泄漏 | 定期检查 kubelet 日志和系统资源(top、df -h)。 |
总结
- 直接原因:
kubelet因证书/配置/运行时问题崩溃,重启后临时修复。 - 根本原因:证书过期或配置错误(需进一步验证)。
- 后续动作:检查证书和日志,配置监控避免重复发生。

浙公网安备 33010602011771号