RKE2 全集群 TLS 证书过期导致瘫痪的无损修复
起因
这套 RKE2 集群跑了快 2 年零 19 天,3 Master(k140、k141、k142)+ 2 Worker(k145、k146)的高可用架构。
某天上班发现 kubectl 直接报铁板一块:

然后查看日志:
[root@k140 bin]# journalctl -u rke2-server -f
x509: certificate has expired or is not yet valid: current time 2026-06-10... is after 2026-04-21T04:54:29Z
emmm,一看就是 TLS 证书过期了。再一查,所有节点全是 NotReady,集群基本上已经瘫痪了。按理说 RKE2 应该在证书到期前自动轮转的,但不知道为啥这轮没转成——可能是集群长期没重启,窗口期错过了。
当时心里咯噔一下:这要是搞不好,etcd 数据丢了那就真是哭死了。
核心思路
高可用集群证书全部过期的时候,千万不能同时重启所有节点,每台节点过期的证书谁也不认谁,全部重启等于全部废掉,到时候神仙难救。
正确的路子就一个原则:
- 先保一个 Master——选一台(这里选 k140)当突破口,把它的过期证书清了,用单节点模式强拉起来,保住 etcd 数据。
- 再拉 Worker——Worker 没 etcd 包袱,清掉缓存就能归队。
- 最后攻坚另外两台 Master——它们本地有旧的 etcd 席位,得先把席位踢了再让它们重新加入。
全程注意:只清证书和 etcd 数据目录,别碰 etcd-snapshots 和业务数据。数据丢了那就是另一个事故了。
阶段一:强开 k140,保住火种
在 k140 上操作。这台节点的 etcd 数据是全集群唯一的希望。
# 1. 先停服务,杀干净所有残留进程
systemctl stop rke2-server
rke2-killall.sh
# 2. 备份并移走过期的 TLS 证书
mv /var/lib/rancher/rke2/server/tls /var/lib/rancher/rke2/server/tls.bak
# 3. 清掉旧的 Agent 客户端缓存
rm -f /var/lib/rancher/rke2/agent/client-kubelet.*
rm -f /var/lib/rancher/rke2/agent/serving-kubelet.*
rm -rf /var/lib/rancher/rke2/agent/*.kubeconfig
# 4. 直接启动,它会以单节点模式跑起来(跳过 etcd 握手)
systemctl start rke2-server
启动后 kubectl get nodes,k140 应该率先变 Ready。
看到 k140 活过来的那一刻,心里踏实了一半。至少 etcd 数据保住了,后面就是让其他节点归队的问题。
阶段二:Worker 归队(k145、k146)
Worker 节点不跑 etcd,修复最简单。分别登录 k145 和 k146,照这个套路来:
# 1. 停服务、清进程
systemctl stop rke2-agent
rke2-killall.sh
# 2. 清掉旧 Agent 证书——逼它去找 k140 重新领新证
rm -f /var/lib/rancher/rke2/agent/client-kubelet.*
rm -f /var/lib/rancher/rke2/agent/serving-kubelet.*
rm -rf /var/lib/rancher/rke2/agent/*.kubeconfig
# 3. 拉起来
systemctl start rke2-agent
回到 k140 看节点状态,两台 Worker 很快就 Ready 了。
这一步没什么坑,基本秒过。

阶段三:硬骨头——k141 和 k142
剩下两台 Master 卡住了。它们本地带着过期的 etcd 数据,直接启动的话会报:
etcd cluster join failed: duplicate node name found
集群说:”你谁啊?这里已经有一个叫 k141 的成员了(虽然已经死了),你不能用同样的名字再来一次。”
3.1 清理本地残留
先分别登录 k141 和 k142,把旧证和旧数据全部干掉:
systemctl stop rke2-server
rke2-killall.sh
# 移走过期证书
mv /var/lib/rancher/rke2/server/tls /var/lib/rancher/rke2/server/tls.bak
# 清理 Agent 缓存
rm -f /var/lib/rancher/rke2/agent/client-kubelet.*
rm -f /var/lib/rancher/rke2/agent/serving-kubelet.*
rm -rf /var/lib/rancher/rke2/agent/*.kubeconfig
# 【关键】干掉本地过期的 etcd 数据,让它从零开始从 k140 同步
rm -rf /var/lib/rancher/rke2/server/db/etcd
这里只删
db/etcd目录,别手贱把db/etcd-snapshots也删了。
3.2 在 k140 上踢除旧 etcd 席位
回到健康的 k140,发 member list 看看 etcd 里面还占着哪些旧席位:
# 1. 查当前 etcd 成员
/var/lib/rancher/rke2/bin/kubectl --kubeconfig /etc/rancher/rke2/rke2.yaml \
exec -n kube-system etcd-k140 -- \
etcdctl \
--cacert=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt \
--cert=/var/lib/rancher/rke2/server/tls/etcd/server-client.crt \
--key=/var/lib/rancher/rke2/server/tls/etcd/server-client.key \
member list
输出里会看到 k141 和 k142 的旧成员 ID(十六进制),把它们踢掉:
# 2. 剔除 k141 旧席位
/var/lib/rancher/rke2/bin/kubectl --kubeconfig /etc/rancher/rke2/rke2.yaml \
exec -n kube-system etcd-k140 -- \
etcdctl \
--cacert=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt \
--cert=/var/lib/rancher/rke2/server/tls/etcd/server-client.crt \
--key=/var/lib/rancher/rke2/server/tls/etcd/server-client.key \
member remove 99524251e78b8d65
# 3. 剔除 k142 旧席位
/var/lib/rancher/rke2/bin/kubectl --kubeconfig /etc/rancher/rke2/rke2.yaml \
exec -n kube-system etcd-k140 -- \
etcdctl \
--cacert=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt \
--cert=/var/lib/rancher/rke2/server/tls/etcd/server-client.crt \
--key=/var/lib/rancher/rke2/server/tls/etcd/server-client.key \
member remove 2d581b504c79cbb0
3.3 拉起 k141、k142
席位清理干净后,分别回到 k141 和 k142:
systemctl start rke2-server
这里会卡 3~5 分钟,因为它要从 k140 全量同步 etcd 快照、再生成新证书,耐心等就行,别急着 Ctrl+C。
耐心等一会,再到 k140 上 kubectl get nodes,k141、k142 终于变成 Ready。看着三台 Master 整整齐齐亮了,这才算真正松了口气。

恢复验证
所有节点 Ready 之后,在 k140 上做最后体检:
# 1. 全节点状态(预期:5 台全部 Ready)
kubectl get nodes
# 2. etcd 集群健康度(预期:三节点全部 healthy)
/var/lib/rancher/rke2/bin/kubectl --kubeconfig /etc/rancher/rke2/rke2.yaml \
exec -n kube-system etcd-k140 -- \
etcdctl \
--cacert=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt \
--cert=/var/lib/rancher/rke2/server/tls/etcd/server-client.crt \
--key=/var/lib/rancher/rke2/server/tls/etcd/server-client.key \
endpoint health
# 3. 核心组件 Pod(预期:全部 Running)
kubectl get pods -n kube-system
全部绿灯通过,集群满血复活。
总结
- RKE2 有自动轮转机制,但不是每次都能踩中窗口期。尤其是长期关机或者刚好错过那个时间点,证书就过期了,到时候 kubectl 直接没法用。
- 出了问题不要慌,更不能一把梭全重启。高可用的 etcd 集群,全重启基本等同自杀。正确姿势就是:先保一个 Master,然后逐步归队。
- 操作时稳着来——用
mv备份 tls 目录、删db/etcd而不是db整个目录、别碰etcd-snapshots。只要 etcd 数据没丢,怎么都能救回来。 - 这套流程本质上是 RKE2 证书断代的标准修复方案。以后遇到同类问题,基本可以闭眼按这个节奏走:强开 Master → Worker 归队 → 踢席位 → 其余 Master 同步归队。