证书自动轮换未启用导致集群瘫痪时,需手动诊断并强制重签证书:先确认kubelet未启用rotateCertificates及controller-manager未签发新证书,再备份pki、停组件、执行kubeadm certs renew all,替换kubelet客户端证书,重启kubelet恢复节点Ready状态。

当Kubernetes集群因证书自动更新机制未启用而突然瘫痪,表现为kubectl命令报x509: certificate has expired or is not yet valid、节点NotReady、kubelet反复CrashLoopBackOff,且集群已无法通过常规kubeadm certs renew恢复时,必须立即进入手动诊断链路。
确认是否为证书自动轮换缺失引发的连锁故障
登录任一Master节点,执行:kubectl get nodes。若返回error: You must be logged in to the server (Unauthorized)或直接报x509证书错误,则说明当前用户kubeconfig中admin.conf所含客户端证书已失效——这本身不致命,但若同时出现kubectl get pods -n kube-system也失败,就指向更深层问题。
运行sudo systemctl status kubelet,观察输出中是否包含Unable to load client CA file /etc/kubernetes/pki/ca.crt: open /etc/kubernetes/pki/ca.crt: no such file或certificate has expired。若出现前者,说明kubelet启动时连CA根证书都读不到,极大概率是kubeadm init时未启用--cert-dir或证书目录被误删;若出现后者,且kubeadm certs check-expiration显示所有证书均过期,则基本锁定为自动轮换从未启用。
【关键判断依据】检查/var/lib/kubelet/config.yaml中是否存在rotateCertificates: true字段。若该字段不存在或值为false,且集群初始化时未使用--feature-gates=RotateKubeletServerCertificate=true参数,则证明kubelet服务端证书轮换机制自始未激活。
定位自动轮换未启用的具体组件层级
方法一:查kubelet启动参数
执行ps aux | grep kubelet | grep -o 'rotateCertificates'。若无输出,说明systemd服务文件中未注入该参数;再检查/var/lib/kubelet/kubeadm-flags.env,确认其中是否含--rotate-server-certificates=true(旧版本)或--feature-gates=RotateKubeletServerCertificate=true(1.19+)。
方法二:验证书签名链
执行openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -text | grep -A1 "X509v3 Extended Key Usage"。若输出中不含TLS Web Client Authentication或TLS Web Server Authentication,说明该证书非由kube-controller-manager签发的可轮换证书,而是kubeadm init时一次性生成的静态证书。
方法三:看controller-manager日志
执行sudo journalctl -u kube-controller-manager -n 100 --since "2 hours ago" | grep -i "signing.*client"。若无任何匹配行,且日志中频繁出现no client certificate found for node,则证实controller-manager根本未尝试为kubelet签发新证书——自动轮换管道已断裂。
紧急恢复:绕过自动轮换直接重签核心证书
第一步:在首个Master节点上备份现有证书目录sudo cp -r /etc/kubernetes/pki /etc/kubernetes/pki.bak.$(date +%s)
第二步:停止所有控制平面组件sudo systemctl stop kubelet && sudo systemctl stop kube-apiserver kube-controller-manager kube-scheduler kube-proxy
第三步:强制重新生成全部证书sudo kubeadm certs renew all --config /etc/kubernetes/kubeadm-config.yaml。注意:此命令依赖kubeadm-config.yaml中certificatesDir字段指向正确路径,若该文件丢失,需先从/tmp/etcd/备份中恢复或手动生成最小配置。
第四步:替换kubelet客户端证书sudo cp /etc/kubernetes/pki/apiserver-kubelet-client.crt /var/lib/kubelet/pki/kubelet-client-current.pem && sudo cp /etc/kubernetes/pki/apiserver-kubelet-client.key /var/lib/kubelet/pki/kubelet-client-current.pem。这一步是临时救急,让kubelet能用新证书连接apiserver,否则节点永远卡在NotReady。
第五步:重启kubelet并验证sudo systemctl start kubelet && sudo systemctl status kubelet。待状态变为active (running)后,立刻执行kubectl get nodes。若节点状态转为Ready,说明证书链已通;若仍NotReady,需检查journalctl -u kubelet -n 50中是否还有证书校验失败记录。

















