K8S证书过期实战:从x509错误到集群恢复的完整指南

张开发
2026/4/19 19:36:01 15 分钟阅读

分享文章

K8S证书过期实战:从x509错误到集群恢复的完整指南
1. 凌晨告警当K8S证书突然失效时凌晨3点15分手机突然疯狂震动。抓起来一看监控系统正在轰炸式报警Kubernetes API Server不可达。瞬间清醒的我立刻跳起来开电脑连上VPN后尝试用kubectl查看节点状态结果迎面撞上这个红色错误Unable to connect to the server: x509: certificate has expired or is not yet valid这个报错对K8S运维人员来说就像半夜的火警铃声——证书过期了我看了眼时间戳证书在5小时前就已过期。更棘手的是这个生产集群承载着公司核心业务系统如果不能快速恢复早高峰时段的在线服务将全部瘫痪。为什么证书过期会导致整个集群瘫痪这得从K8S的认证机制说起。API Server作为集群的中枢神经系统所有组件kubelet、controller-manager等和用户操作kubectl都需要通过TLS证书与其建立安全连接。当CA证书或客户端证书过期时就像门锁突然换了钥匙所有通信都会被拒绝。2. 紧急诊断全面检查证书状态2.1 快速确认证书过期情况首先需要确认哪些证书已经过期。在任意Master节点执行kubeadm certs check-expiration这个命令会列出所有核心证书的过期状态。在我的案例中返回结果如下CERTIFICATE EXPIRES RESIDUAL TIME admin.conf Dec 10, 2022 01:55 UTC invalid apiserver Dec 10, 2022 01:55 UTC invalid apiserver-kubelet-client Dec 10, 2022 01:55 UTC invalid看到满屏的invalid我意识到问题比想象的严重——不仅是客户端证书连API Server的服务端证书也过期了。此时常规的kubectl命令已经无法使用必须直接操作Master节点上的证书文件。2.2 证书目录结构解析K8S证书默认存放在/etc/kubernetes/pki目录关键文件包括ca.crt和ca.key根证书有效期通常10年apiserver.crtAPI Server服务端证书apiserver-kubelet-client.crtAPI Server访问kubelet的客户端证书front-proxy-ca.crt前端代理CA证书重要安全提示操作前务必备份整个目录cp -r /etc/kubernetes /etc/kubernetes_bak3. 证书更新操作实战3.1 一键更新所有证书Kubeadm提供了便捷的证书更新命令kubeadm certs renew all这个命令会重新生成所有即将过期或已过期的证书新证书默认有效期1年。执行完成后再次检查证书状态kubeadm certs check-expiration此时应该能看到所有证书的RESIDUAL TIME变为364d即365天。但别高兴太早——我遇到了第一个坑更新后kubectl仍然报证书过期错误。3.2 证书更新的工作原理这里需要理解kubeadm renew的机制只更新/etc/kubernetes/pki下的证书文件不会自动更新kubeconfig文件中的证书嵌入需要手动重启控制平面组件这就是为什么更新后仍然报错——kubectl使用的~/.kube/config中的旧证书还未更新。4. 解决更新后的授权问题4.1 更新kubeconfig证书执行以下命令更新用户配置文件# 备份原配置 cp $HOME/.kube/config $HOME/.kube/config.bak # 使用新admin证书覆盖 sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config这时候再运行kubectl get nodes可能又会遇到新的错误error: You must be logged in to the server (Unauthorized)4.2 权限问题的根本原因这是因为证书更新后其包含的用户信息如CN、O等字段必须与集群RBAC配置匹配。解决方法有两种方案A重新生成kubeconfig# 获取新的token kubeadm token create # 重新配置集群连接 kubeadm init phase kubeconfig admin --config /etc/kubernetes/kubeadm-config.yaml方案B直接复制admin.conf推荐sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config5. 控制平面组件重启指南5.1 必须重启的组件列表即使证书和kubeconfig都更新正确如果不重启以下组件集群仍然无法正常工作kube-apiserverkube-controller-managerkube-scheduleretcd5.2 不同运行环境下的重启方法Docker环境docker ps | grep -E kube-apiserver|kube-controller-manager|kube-scheduler|etcd | grep -v pause | awk {print $1} | xargs docker restartContainerd环境crictl pods --namespace kube-system --name kube-apiserver|kube-controller-manager|kube-scheduler|etcd -q | xargs -I{} crictl stopp {}Systemd环境systemctl restart kubelet6. 验证集群完全恢复6.1 基础功能检查执行以下命令验证核心功能# 检查节点状态 kubectl get nodes -o wide # 检查核心Pod kubectl get pods -n kube-system # 测试部署功能 kubectl create deployment nginx --imagenginx6.2 常见后续问题处理如果遇到控制器不生效的情况如Deployment变更不触发更新通常需要检查controller-manager日志kubectl logs -n kube-system kube-controller-manager-pod-id确认控制器使用的kubeconfig已更新grep client-certificate /etc/kubernetes/controller-manager.conf最终手段重启整个节点上的kubelet服务7. 防患于未然证书管理最佳实践7.1 监控证书过期时间将以下命令加入监控系统kubeadm certs check-expiration | grep -E RESIDUAL TIME|invalid7.2 自动化更新方案创建每月执行的定时任务# 更新证书 kubeadm certs renew all # 滚动重启控制平面 kubectl -n kube-system rollout restart deploy7.3 长期维护建议为CA证书设置更长的有效期编辑/etc/kubernetes/pki/ca.cnf使用外部CA如Vault管理集群证书定期轮换kubeconfig文件那次凌晨救火经历让我深刻认识到证书管理的重要性。现在我的团队不仅建立了完善的监控机制还定期进行证书更新演练。记住在K8S集群中证书就是通往各个组件的钥匙串保管好它们才能确保集群永远畅通无阻。

更多文章