集群证书升级
2025-12-26 1708字

概述

当遇到 Kubernetes 证书过期导致的故障时(例如 kubectl 报证书过期),通常会执行 kubeadm certs renew all 进行续期。续期后,kubectl 可能恢复正常,但如果集群核心组件仍在使用内存中的旧证书,仍会出现部署或通信错误。本文是一个按步骤的操作手册,包含 Master/Worker 节点的处理流程与常见故障处理方法。

问题示例

在某次操作中,执行证书续期后 kubectl 在 Master 上可以正常查看 Pod,但部署应用失败。apiserver 日志中可能出现类似的 x509 证书相关错误:

apiserver-error

前提

第一阶段:Master 节点(控制平面)

在 Master 节点上按顺序执行:

1) 基础检查与备份

sudo kubeadm certs check-expiration

说明:确认哪些证书过期与到期时间。

备份现有证书与配置:

sudo cp -r /etc/kubernetes/ /tmp/backup/
sudo cp -r /var/lib/kubelet/pki/ /tmp/backup.kubelet_pki/

2) 续期证书

sudo kubeadm certs renew all

说明:此命令会更新集群内部的核心证书文件,但组件内存可能仍加载旧证书。

3) 强制使控制平面组件加载新证书(移动 manifest 法)

注意:仅更新证书文件不足以让运行中的控制面组件立即生效,需要重启这些静态 Pod。

sudo mkdir -p /tmp/k8s-renew
sudo mv /etc/kubernetes/manifests/*.yaml /tmp/k8s-renew/
# 等待 20-30 秒,确认容器停止
crictl -r unix:///var/run/containerd/containerd.sock ps

# 再把 manifest 移回,触发静态 Pod 重启
sudo mv /tmp/k8s-renew/*.yaml /etc/kubernetes/manifests/

说明:/etc/kubernetes/manifests 由 kubelet 监控,移走会停止 API Server、Controller Manager、Scheduler 等静态 Pod,移回后会使用最新证书重启。

4) 更新 kubeconfig(管理员配置)

cp /root/.kube/config /tmp/kube.old/config
cp /etc/kubernetes/admin.conf ~/.kube/config

说明:admin.conf 包含与集群通信的凭据,若不替换,kubectl 可能仍使用旧凭据。

5) 重启 kubelet

sudo systemctl restart kubelet

说明:让 kubelet 加载并识别最新的证书与配置。

第二阶段:Worker 节点(工作节点)

Worker 节点通常会自动轮换证书,操作相对简单:

sudo systemctl restart kubelet

在每一台 Worker 上执行该命令,通常足以恢复节点与控制面的连接。

第三阶段:特殊故障处理(x509 / 加入失败)

如果在重启 kubelet 后,Worker 仍然报 x509 或证书认证相关错误,可按下面步骤强制重新加入:

1) 在 Master 上生成 join 命令:

kubeadm token create --print-join-command

2) 在问题节点上重置并重新加入:

sudo kubeadm reset -f
# 然后执行第 1 步生成的 kubeadm join <...> 命令

说明:kubeadm reset 会清除该节点的集群配置,重加入会重新建立可信链与凭据。

附录:调试建议