RKE2 全集群 TLS 证书过期导致瘫痪的无损修复

RKE2 全集群 TLS 证书过期导致瘫痪的无损修复

起因

这套 RKE2 集群跑了快 2 年零 19 天,3 Master(k140、k141、k142)+ 2 Worker(k145、k146)的高可用架构。

某天上班发现 kubectl 直接报铁板一块:

image-20260610203518284

然后查看日志:

[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 数据丢了那就真是哭死了。

核心思路

高可用集群证书全部过期的时候,千万不能同时重启所有节点,每台节点过期的证书谁也不认谁,全部重启等于全部废掉,到时候神仙难救。

正确的路子就一个原则:

  1. 先保一个 Master——选一台(这里选 k140)当突破口,把它的过期证书清了,用单节点模式强拉起来,保住 etcd 数据。
  2. 再拉 Worker——Worker 没 etcd 包袱,清掉缓存就能归队。
  3. 最后攻坚另外两台 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,修复最简单。分别登录 k145k146,照这个套路来:

# 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 了。

这一步没什么坑,基本秒过。

image-20260610203940951

阶段三:硬骨头——k141 和 k142

剩下两台 Master 卡住了。它们本地带着过期的 etcd 数据,直接启动的话会报:

etcd cluster join failed: duplicate node name found

集群说:”你谁啊?这里已经有一个叫 k141 的成员了(虽然已经死了),你不能用同样的名字再来一次。”

3.1 清理本地残留

先分别登录 k141k142,把旧证和旧数据全部干掉:

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

席位清理干净后,分别回到 k141k142

systemctl start rke2-server

这里会卡 3~5 分钟,因为它要从 k140 全量同步 etcd 快照、再生成新证书,耐心等就行,别急着 Ctrl+C。

耐心等一会,再到 k140 上 kubectl get nodes,k141、k142 终于变成 Ready。看着三台 Master 整整齐齐亮了,这才算真正松了口气。

image-20260610204012253

恢复验证

所有节点 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

全部绿灯通过,集群满血复活。

总结

  1. RKE2 有自动轮转机制,但不是每次都能踩中窗口期。尤其是长期关机或者刚好错过那个时间点,证书就过期了,到时候 kubectl 直接没法用。
  2. 出了问题不要慌,更不能一把梭全重启。高可用的 etcd 集群,全重启基本等同自杀。正确姿势就是:先保一个 Master,然后逐步归队。
  3. 操作时稳着来——用 mv 备份 tls 目录、删 db/etcd 而不是 db 整个目录、别碰 etcd-snapshots。只要 etcd 数据没丢,怎么都能救回来。
  4. 这套流程本质上是 RKE2 证书断代的标准修复方案。以后遇到同类问题,基本可以闭眼按这个节奏走:强开 Master → Worker 归队 → 踢席位 → 其余 Master 同步归队。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇