我将分两种情况为您提供详细的处理办法:
- 证书即将过期(预防)
- 证书已经过期(修复)
情况一:证书即将过期(预防性续期)
这是最理想的情况。Kubernetes 从 v1.15 版本开始引入了自动轮换机制(kubelet 证书),但很多核心组件(如 apiserver, etcd, controller-manager)的证书仍需手动或通过工具更新。
最佳实践:使用 kubeadm 工具续期(适用于 kubeadm 搭建的集群)
kubeadm 可以非常安全、便捷地更新证书。
- 检查证书有效期
首先,确认证书的过期时间。
# 在主节点上执行
kubeadm certs check-expiration
输出会显示所有证书的剩余有效期。
- 备份集群配置(重要!)
在进行任何关键操作前,请先备份。
# 备份 /etc/kubernetes 目录
sudo cp -r /etc/kubernetes /etc/kubernetes.bak
# 备份你的 kubeconfig 文件(通常在 $HOME/.kube/config)
cp ~/.kube/config ~/.kube/config.bak
- 更新证书
使用一条命令更新所有证书:
sudo kubeadm certs renew all
这个命令会更新 /etc/kubernetes/pki 目录下所有已过期或即将过期的证书。
- 更新 kubeconfig 文件
证书更新后,需要让 kubeconfig 文件使用新的证书数据。
sudo kubeadm init phase kubeconfig all
注意:此命令会覆盖现有的 kubeconfig 文件。你需要将新的配置合并到你的 $HOME/.kube/config 中,或者直接替换(如果你只有一套集群配置)。
- 重启控制平面组件 为了让 apiserver, controller-manager, scheduler 等组件加载新的证书,需要重启它们的 Pod。
# 由于这些组件是以 Static Pod 形式运行的,直接删除它们,kubelet 会自动重建。
sudo mv /etc/kubernetes/manifests/kube-apiserver.yaml /tmp/
# 等待十几秒,Pod 被删除并重建
sudo mv /tmp/kube-apiserver.yaml /etc/kubernetes/manifests/
# 对 controller-manager 和 scheduler 做同样操作
sudo mv /etc/kubernetes/manifests/kube-controller-manager.yaml /tmp/
sudo mv /tmp/kube-controller-manager.yaml /etc/kubernetes/manifests/
sudo mv /etc/kubernetes/manifests/kube-scheduler.yaml /tmp/
sudo mv /tmp/kube-scheduler.yaml /etc/kubernetes/manifests/
- 验证
再次检查证书有效期,并确认集群状态正常。
kubeadm certs check-expiration
kubectl get nodes
kubectl get pods --all-namespaces
情况二:证书已经过期(修复)
如果证书已经过期,你最可能遇到的症状是:kubectl 命令无法执行,报错类似 Unable to connect to the server: x509: certificate has expired or is not yet valid。
这时,API Server 的证书无效,导致所有控制命令失效。修复步骤如下:
核心思路:手动为 API Server 生成新证书,或者利用 kubeadm 的 alpha 子命令强制更新。
方法 A:使用 kubeadm alpha certs renew(推荐)
即使证书已过期,kubeadm 的 alpha 命令通常也能工作。
- SSH 登录到 Master 节点
- 强制更新证书
# 使用 alpha 子命令更新所有证书
sudo kubeadm alpha certs renew all
# 或者,如果只想更新 apiserver 的证书
sudo kubeadm alpha certs renew apiserver
- 后续步骤
后续步骤与情况一完全相同:
- 更新 kubeconfig:sudo kubeadm init phase kubeconfig all
- 重启控制平面组件(通过移动 manifest 文件)
- 验证
方法 B:完全手动更新(如果 kubeadm 方法失败)
这是一种更底层的备用方案。
- 备份原有 PKI 目录
sudo cp -r /etc/kubernetes/pki /etc/kubernetes/pki.bak
- 删除旧的证书和密钥
# 删除 apiserver 相关的证书和密钥
sudo rm /etc/kubernetes/pki/apiserver.*
- 重新生成证书
# 使用 kubeadm 重新生成证书
sudo kubeadm init phase certs apiserver
# 如果需要,也重新生成其他证书,或者直接生成所有
sudo kubeadm init phase certs all
注意:确保你的 kubeadm 配置(如 /etc/kubernetes/kubeadm-config.yaml)中的 apiServer.certSANs 字段包含了所有需要的主机名、IP 地址(包括 VIP 和负载均衡器 IP),否则新生成的证书可能不包含这些信息,导致其他节点或客户端无法连接。
1. 重启控制平面组件(同上)
2. 更新 kubeconfig 并验证(同上)
额外重要提示:
1. 定时任务预防:对于生产环境,可以创建一个定时任务(CronJob),定期(例如每月)执行 kubeadm certs check-expiration 并发送警报,或者在维护窗口执行 kubeadm certs renew all 以预防问题。
2. etcd 证书:不要忘记 etcd 的证书也同样重要。上述 kubeadm certs renew all 命令同样会处理 etcd 的证书。重启 etcd Pod 的方法与重启 apiserver 相同(移动 /etc/kubernetes/manifests/etcd.yaml 文件)。
3. Worker Node 证书:Worker Node 上的 kubelet 证书通常是自动轮换的(由 kube-controller-manager 负责)。你可以通过 kubectl get csr 来查看 Certificate Signing Requests 的状态。如果节点证书有问题,可以尝试重启节点上的 kubelet 服务:sudo systemctl restart kubelet。
4. 非 kubeadm 集群:如果你使用的是二进制方式部署的 Kubernetes,修复过程会更复杂。你需要手动使用 cfssl 或 openssl 工具为每个组件重新生成证书和密钥,并更新所有相关的 kubeconfig 文件,然后逐一重启服务。
总结:对于绝大多数使用 kubeadm 部署的集群,kubeadm certs renew all 就是解决证书问题的万能钥匙,关键在于操作前做好备份,并记得重启相应的组件。