Kubernetes api-server证书过期认证失败求助:集群升级后证书异常
嘿,哥们儿,我刚好踩过这个K8s证书过期的坑,咱们一步步来把它解决掉!
问题根源先理清楚
你的情况太典型了:Kubernetes 1.19之前的版本,默认生成的证书有效期都是1年。你2017年4月13日搭建1.6集群时生成的证书,到2018年4月13日刚好到期。虽然后来升级到1.8时生成了新证书,但显然操作没做完整,API Server这类核心组件还在沿用旧的过期证书,直接导致了认证失败——就是你看到的[authentication.go:64] Unable to authenticate the request due to an error: [x509: certificate has expired...]报错。
一步步解决问题
1. 先确认过期的证书
登录到集群的Master节点,先去默认证书目录/etc/kubernetes/pki/检查,用下面的命令查看API Server证书的有效期:
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text -noout | grep Not
输出里的Not After如果是2018年4月13日左右,那实锤就是证书过期了。
2. 备份旧证书(重要!)
在操作之前,一定要先备份当前的证书目录,防止操作失误无法回滚:
cp -r /etc/kubernetes/pki /etc/kubernetes/pki.bak
3. 重新生成完整的核心证书集
因为升级1.8时证书生成不完整,咱们用kubeadm重新生成所有核心证书。首先得先停掉依赖这些证书的核心组件:
systemctl stop kube-apiserver systemctl stop kube-controller-manager systemctl stop kube-scheduler
然后执行kubeadm的证书生成命令(1.8版本支持init phase子命令):
kubeadm init phase certs all
这个命令会重新生成API Server、API Server-Kubelet客户端、Front-Proxy客户端等所有核心组件需要的证书。
4. 更新kubeconfig配置文件
证书更新后,还要同步更新admin.conf、kubelet.conf这些配置文件里的证书引用,不然kubectl和kubelet还是会用旧证书:
kubeadm init phase kubeconfig all
别忘了把新的admin.conf复制到当前用户的kube目录,保证kubectl能正常使用:
cp /etc/kubernetes/admin.conf ~/.kube/config
5. 重启所有核心组件和kubelet
现在把刚才停掉的组件重启,让它们加载新证书:
systemctl start kube-apiserver systemctl start kube-controller-manager systemctl start kube-scheduler systemctl restart kubelet
6. 验证修复效果
执行kubectl get nodes命令,如果能正常返回集群节点列表,说明认证已经恢复正常了。再去看API Server的日志,确认authentication.go:64的报错已经消失。
后续预防建议
- 因为K8s 1.19之前的版本证书默认只有1年有效期,建议你写个简单的脚本定期检查证书到期时间,提前1个月发出提醒,避免再次踩坑。
- 下次升级集群时,升级完成后一定要检查所有核心证书的有效期,确保kubeadm完成了完整的证书更新操作。
内容的提问来源于stack exchange,提问作者NoobSkywalker

