K8S集群半夜失联?别慌,这份保姆级证书续期指南(附10年有效期脚本)

K8S集群半夜失联?别慌,这份保姆级证书续期指南(附10年有效期脚本) K8S集群半夜失联别慌这份保姆级证书续期指南附10年有效期脚本凌晨三点手机突然响起刺耳的告警声。睡眼惺忪中打开电脑发现K8S集群全面失联——dashboard无法访问kubectl命令全部报错生产环境正在运行的Pod岌岌可危。这种场景对任何运维人员来说都是噩梦而罪魁祸首往往出人意料证书过期。本文将带你亲历一次真实的救火全过程从故障定位到应急处理最后用一行脚本永久解决这个定时炸弹。1. 事故现场深夜告警的快速诊断当K8S集群突然失联时第一个命令永远是查看基础状态kubectl get nodes典型的证书过期错误会显示Unable to connect to the server: x509: certificate has expired or is not yet valid关键排查步骤检查API Server日志journalctl -u kube-apiserver -n 50验证核心证书有效期openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep Not快速查看所有证书状态kubeadm certs check-expiration注意如果遇到libssl.so.1.1缺失错误需要先修复OpenSSL环境find / -name libssl.so.1.1 ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.12. 证书体系解析为什么总是半夜出问题K8S默认的证书有效期设计存在一个陷阱证书路径默认有效期/etc/kubernetes/pki/apiserver.crt1年/etc/kubernetes/pki/ca.crt10年/etc/kubernetes/pki/etcd/server.crt1年/etc/kubernetes/pki/front-proxy-ca.crt10年核心问题多数业务证书如apiserver有效期仅1年证书过期时间通常设置在凌晨低峰期没有默认的过期告警机制3. 应急恢复三步快速续期方案3.1 获取10年有效期脚本推荐使用经过社区验证的update-kubeadm-cert.shwget https://example.com/update-kubeadm-cert.sh chmod x update-kubeadm-cert.sh3.2 全集群证书更新在所有节点执行./update-kubeadm-cert.sh all3.3 验证与重启# 验证单个证书 openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep Not # 批量验证 kubeadm certs check-expiration # 重启关键服务 systemctl restart kubelet4. 防患未然构建证书监控体系预防方案组合拳监控层Prometheus配置证书过期告警- alert: K8SCertExpiringSoon expr: kubelet_certificate_manager_client_ttl_seconds 86400 * 30 for: 5m巡检层CronJob定期检查# 每月1号检查 0 0 1 * * kubeadm certs check-expiration | mail -s K8S Cert Report adminexample.com架构层改用cert-manager自动管理5. 高级技巧自定义证书参数如果需要调整证书的更多参数可以修改脚本中的关键部分# 修改证书有效期单位年 CERT_YEARS10 # 自定义证书SAN cat openssl.cnf EOF [ req ] req_extensions v3_req [ v3_req ] basicConstraints CA:FALSE keyUsage nonRepudiation, digitalSignature, keyEncipherment subjectAltName alt_names [alt_names] DNS.1 kubernetes DNS.2 kubernetes.default DNS.3 kubernetes.default.svc DNS.4 kubernetes.default.svc.cluster.local IP.1 10.96.0.1 IP.2 192.168.1.100 EOF6. 灾备方案当证书完全过期时如果集群已经无法连接需要手动恢复备份现有证书mv /etc/kubernetes/pki /etc/kubernetes/pki.bak重新初始化控制平面kubeadm init phase certs all --config kubeadm-config.yaml分发新证书到所有节点那次凌晨三点的故障让我养成了每月检查证书的习惯。现在每次执行kubeadm certs check-expiration看到2030年的到期时间终于能睡个安稳觉了。