K8s证书过期别慌!保姆级kubeadm续签教程(含1.23.0版本实操)
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-version=v1.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 & Scheduler:
sudo docker ps | grep -E 'kube-controller|kube-scheduler' | awk '{print $1}' | xargs sudo docker restart验证组件状态:
kubectl get componentstatuses
3. 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 approve
4. 集群状态验证与后续加固
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 --tcp=80:80 kubectl run curl-test --image=curlimages/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 -d'+30 days' +%Y-%m-%d)'") print "WARN: "$1" expires soon: "$2 }'自动化更新方案:
- 使用Ansible等工具编排证书更新流程
- 配置CI/CD流水线定期执行证书检查
- 考虑使用cert-manager等专业证书管理工具
调整默认有效期(需重新初始化集群):
kubeadm init --apiserver-cert-extra-sans=... \ --cert-duration=87600h \ # 10年有效期 --cert-renewal=true
在实际生产环境中,我们曾遇到过一个典型案例:某金融系统在凌晨证书过期导致支付服务中断。由于提前配置了证书监控,团队在证书到期前30天就收到了预警,但误以为是测试环境告警而未处理。这个教训告诉我们,证书管理不仅要技术到位,还需要配套的告警分级和处理流程。
