K8s集群kubelet证书过期节点失联更新指南
问题现象:节点状态变为NotReady
Kubernetes集群运行一段时间后,部分工作节点突然从集群中失联,通过kubectl get nodes查看节点状态为NotReady,且节点上kubelet日志持续刷新类似错误:
Unable to authenticate as user "system:node:xxx" (get nodes xxx)
这种情况通常与kubelet客户端证书过期有关。Kubelet默认通过TLS Bootstrap机制向API Server申请证书,证书有效期通常为1年。证书过期后,kubelet与API Server的通信认证失败,导致节点失联。
原因分析:证书轮换未生效
K8s从1.8版本起支持证书自动轮换,但需要满足两个条件:
- kubelet启动参数中启用
--rotate-certificates=true - 集群部署了
CertificateApprover或相关控制器自动批准CSR
若集群关闭了自动轮换,或证书已超过轮换窗口,kubelet无法自行更新证书。常见的诱因还包括:证书文件权限问题、/etc/kubernetes/pki目录被错误修改、或节点时间偏差过大。
处理步骤:手动更新kubelet证书
1. 确认证书过期状态
在故障节点上执行以下命令查看证书有效期:
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -dates
若输出显示notAfter时间早于当前时间,则证书已过期。
2. 删除旧证书并触发重新申请
备份并删除kubelet客户端证书和私钥:
mv /var/lib/kubelet/pki/kubelet-client-current.pem /var/lib/kubelet/pki/kubelet-client-current.pem.bak$(date +%s) mv /var/lib/kubelet/pki/kubelet-client-current.key /var/lib/kubelet/pki/kubelet-client-current.key.bak$(date +%s)
重启kubelet服务,使其重新执行Bootstrap流程:
systemctl restart kubelet
3. 批准CSR请求
在控制平面节点查看待批准的CSR(CertificateSigningRequest):
kubectl get csr
找到由该节点发起的Pending状态的CSR,批准它:
kubectl certificate approve
若有多个节点同时失联,可批量批准所有Pending CSR:
kubectl get csr -o name | xargs -r kubectl certificate approve
4. 验证节点恢复
等待约30秒后,检查节点状态:
kubectl get nodes
节点应变为Ready。同时在新节点上再次检查证书有效期,确认已更新。
预防措施:配置证书自动轮换
- 确保kubelet配置文件中包含
rotateCertificates: true,并设置serverTLSBootstrap: true(如使用kubeadm部署)。 - 部署RBAC授权,使kubelet有权创建CSR并自动批准
system:nodes组的CSR请求。参考官方配置示例:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: certificate-rotation rules: - apiGroups: ["certificates.k8s.io"] resources: ["certificatesigningrequests/selfnodeclient"] verbs: ["create"]
- 设置监控告警:巡检
/var/lib/kubelet/pki/kubelet-client-current.pem的到期时间,或使用Prometheus的kubelet_certificate_manager_client_ttl_seconds指标。建议在证书到期前30天触发预警。 - 对于生产环境,建议使用cert-manager或定制控制器统一管理节点证书,避免单点故障。
结语
kubelet证书过期属于K8s集群常见运维事故。通过手动更新可快速恢复节点,但长期应配置自动轮换和监控机制。每次集群升级或网络调整后,也要留意节点证书状态,避免基础组件静默失效。