0
点赞
收藏
分享

微信扫一扫

k8s证书过期的处理记录---kubeadm部署的集群

我将分两种情况为您提供详细的处理办法:

  1. 证书即将过期(预防)
  2. 证书已经过期(修复)

情况一:证书即将过期(预防性续期)

这是最理想的情况。Kubernetes 从 v1.15 版本开始引入了自动轮换机制(kubelet 证书),但很多核心组件(如 apiserver, etcd, controller-manager)的证书仍需手动或通过工具更新。

最佳实践:使用 kubeadm 工具续期(适用于 kubeadm 搭建的集群)

kubeadm 可以非常安全、便捷地更新证书。


  1. 检查证书有效期
    首先,确认证书的过期时间。

# 在主节点上执行
kubeadm certs check-expiration

输出会显示所有证书的剩余有效期。

  1. 备份集群配置(重要!)
    在进行任何关键操作前,请先备份。

# 备份 /etc/kubernetes 目录
sudo cp -r /etc/kubernetes /etc/kubernetes.bak

# 备份你的 kubeconfig 文件(通常在 $HOME/.kube/config)
cp ~/.kube/config ~/.kube/config.bak

  1. 更新证书
    使用一条命令更新所有证书:

sudo kubeadm certs renew all

这个命令会更新 /etc/kubernetes/pki 目录下所有已过期或即将过期的证书。

  1. 更新 kubeconfig 文件
    证书更新后,需要让 kubeconfig 文件使用新的证书数据。

sudo kubeadm init phase kubeconfig all

注意:此命令会覆盖现有的 kubeconfig 文件。你需要将新的配置合并到你的 $HOME/.kube/config 中,或者直接替换(如果你只有一套集群配置)。

  1. 重启控制平面组件 为了让 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/

  1. 验证
    再次检查证书有效期,并确认集群状态正常。

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 命令通常也能工作。


  1. SSH 登录到 Master 节点
  2. 强制更新证书

# 使用 alpha 子命令更新所有证书
sudo kubeadm alpha certs renew all

# 或者,如果只想更新 apiserver 的证书
sudo kubeadm alpha certs renew apiserver

  1. 后续步骤
    后续步骤与情况一完全相同:
  • 更新 kubeconfig:sudo kubeadm init phase kubeconfig all
  • 重启控制平面组件(通过移动 manifest 文件)
  • 验证

方法 B:完全手动更新(如果 kubeadm 方法失败)

这是一种更底层的备用方案。

  1. 备份原有 PKI 目录

sudo cp -r /etc/kubernetes/pki /etc/kubernetes/pki.bak

  1. 删除旧的证书和密钥

# 删除 apiserver 相关的证书和密钥
sudo rm /etc/kubernetes/pki/apiserver.*

  1. 重新生成证书

# 使用 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 就是解决证书问题的万能钥匙,关键在于操作前做好备份,并记得重启相应的组件。

举报

相关推荐

0 条评论