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..."
  • 核心问题
    1. 无法加载 kubelet 配置文件(可能路径错误或权限不足)。
    2. 缺少客户端证书kube-apiserver-client-kubelet 证书缺失或过期)。
    3. 容器运行时通信异常(可能是 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:root600 权限)。

(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 日志和系统资源(topdf -h)。

总结

  • 直接原因kubelet 因证书/配置/运行时问题崩溃,重启后临时修复。
  • 根本原因:证书过期或配置错误(需进一步验证)。
  • 后续动作:检查证书和日志,配置监控避免重复发生。
posted on 2025-06-23 18:35  Leo-Yide  阅读(106)  评论(0)    收藏  举报