)
K8s证书过期应急指南从故障诊断到全集群证书续签实战凌晨三点刺耳的手机警报声将你从睡梦中惊醒——监控系统显示生产环境Kubernetes集群所有节点状态未知。当你匆忙打开终端输入kubectl get nodes时屏幕上赫然显示着Unable to connect to the server: x509: certificate has expired or is not yet valid的错误信息。这种场景对于使用kubeadm部署的Kubernetes集群来说并不罕见因为默认安装的各类证书有效期仅为1年。本文将带你完整走通从故障诊断到全集群证书续签的实战流程涵盖Master节点核心组件证书、kubelet客户端证书以及Worker节点证书的更新策略。1. 证书过期故障诊断与应急准备1.1 快速确认证书过期状态当集群突然失联时首先需要确认是否确实由证书过期引起。通过以下命令检查集群证书状态# 检查控制平面证书过期时间 kubeadm certs check-expiration # 检查kubelet客户端证书所有节点执行 openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -dates典型证书过期故障会呈现以下特征kubeadm certs check-expiration显示EXPIRES列为过去时间kubelet-client-current.pem的notAfter值早于当前时间API Server日志中出现x509: certificate has expired错误1.2 关键文件备份策略在开始修复前必须对关键配置进行完整备份# 备份证书目录 sudo cp -r /etc/kubernetes/pki /opt/k8s-backup/pki-$(date %Y%m%d) # 备份kubelet配置 sudo cp -r /var/lib/kubelet /opt/k8s-backup/kubelet-$(date %Y%m%d) # 备份kubeconfig文件 sudo cp /etc/kubernetes/admin.conf /opt/k8s-backup/admin.conf-$(date %Y%m%d)重要提示备份时应保留原目录结构避免使用压缩包导致权限信息丢失2. Master节点证书更新全流程2.1 核心组件证书批量更新使用kubeadm工具可以一次性更新所有控制平面证书# 续签所有控制平面证书 sudo kubeadm certs renew all # 验证新证书有效期 sudo kubeadm certs check-expiration | grep -v never证书更新后需要特别注意新证书会生成在/etc/kubernetes/pki目录旧证书会被自动备份为.old文件此时各组件仍在使用旧配置需要后续步骤更新2.2 kubeconfig文件重建证书更新后需要重新生成各组件的kubeconfig文件# 删除旧配置文件 sudo rm -f /etc/kubernetes/*.conf # 重新生成所有kubeconfig注意保持版本一致 sudo kubeadm init phase kubeconfig all --kubernetes-versionv1.23.0 # 更新管理员配置 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config2.3 控制平面组件重启顺序组件重启需要遵循特定顺序以避免服务中断API Server集群核心最先重启sudo docker ps | grep kube-apiserver | awk {print $1} | xargs sudo docker restartController Manager Schedulersudo docker ps | grep -E kube-controller|kube-scheduler | awk {print $1} | xargs sudo docker restart验证组件状态kubectl get componentstatuses3. Kubelet客户端证书更新策略3.1 Master节点kubelet证书处理kubelet证书需要特殊处理因为其更新机制与其他组件不同# 重启kubelet触发证书轮换 sudo systemctl restart kubelet # 检查新证书 ls -l /var/lib/kubelet/pki/kubelet-client-current.pem # 批准CSR请求 kubectl get csr | grep Pending | awk {print $1} | xargs kubectl certificate approve3.2 Worker节点证书更新流程对于Worker节点需要单独处理每个节点的kubelet证书生成节点专属kubeconfig# 在Master节点执行替换实际节点名 kubeadm init phase kubeconfig kubelet \ --node-name worker-node1 \ --kubeconfig-dir /tmp/kubelet-confs/分发到对应Worker节点scp /tmp/kubelet-confs/kubelet.conf worker-node1:/etc/kubernetes/重启节点kubelet服务ssh worker-node1 sudo systemctl restart kubelet批准CSR请求kubectl get csr | grep worker-node1 | awk {print $1} | xargs kubectl certificate approve4. 集群状态验证与后续加固4.1 全功能测试方案证书更新完成后需要全面验证集群功能# 基础状态检查 kubectl get nodes kubectl get pods -A # 创建测试资源 cat EOF | kubectl apply -f - apiVersion: apps/v1 kind: Deployment metadata: name: nginx-test spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:alpine ports: - containerPort: 80 EOF # 验证服务发现 kubectl create service clusterip nginx --tcp80:80 kubectl run curl-test --imagecurlimages/curl --command -- sleep 3600 kubectl exec curl-test -- curl -v http://nginx.default.svc.cluster.local4.2 证书管理长效方案为避免再次出现证书过期问题建议实施以下预防措施证书监控告警# 定期检查证书过期情况的监控脚本示例 kubeadm certs check-expiration | awk -F /[0-9]{4}-[0-9]{2}-[0-9]{2}/{ if($2$(date -d30 days %Y-%m-%d)) print WARN: $1 expires soon: $2 }自动化更新方案使用Ansible等工具编排证书更新流程配置CI/CD流水线定期执行证书检查考虑使用cert-manager等专业证书管理工具调整默认有效期需重新初始化集群kubeadm init --apiserver-cert-extra-sans... \ --cert-duration87600h \ # 10年有效期 --cert-renewaltrue在实际生产环境中我们曾遇到过一个典型案例某金融系统在凌晨证书过期导致支付服务中断。由于提前配置了证书监控团队在证书到期前30天就收到了预警但误以为是测试环境告警而未处理。这个教训告诉我们证书管理不仅要技术到位还需要配套的告警分级和处理流程。