主题
uat1 集群删除节点未删干净卡在 Updating 状态排查手册
- 日期:2026-08-05
- 集群:
uat1(Rancher 自定义集群,RKE2 v1.35.6+rke2r1,下游 API192.168.122.31:6443,管理集群 IDc-m-5dx2sdbr) - Rancher:v2.14.3,部署在
sza122020.local(192.168.122.20)RKE2 local 集群 - 现象:在 Rancher UI 上 uat1 集群一直停留在 Updating 状态,节点删除操作迟迟不结束
1. 问题现象与根因
1.1 现象
- 节点
yu(10.20.24.225,worker)被删除后,Rancher UI 集群状态卡在 Updating; - 下游集群
kubectl get nodes中已经看不到yu,节点本身已经没了。
1.2 根因
删除方式错误:直接在下游集群执行了 kubectl delete node yu(或直接在虚拟化层删了虚拟机),而不是从 Rancher 侧删除。
Rancher v2 自定义集群中,每个节点在管理面都对应一个 CAPI Machine 对象(fleet-default 命名空间)。直接删下游 Node 后,Machine 对象残留成为孤儿,Rancher provisioning 控制器持续等待这台已不存在节点的探针,集群状态永远无法收敛:
text
# Machine 状态
Ready=False, reason=NodeDeleted
message: Node yu has been deleted while the Machine still exists
# 集群 conditions
Updated=Unknown, reason=Waiting
message: configuring worker node(s) custom-98ad33a62bc4: waiting for probes: calico, kubelet2. 排查步骤
2.1 确认下游集群节点现状
bash
export KUBECONFIG=~/.kube/config-122.31 # 直连下游 API 192.168.122.31:6443
kubectl get nodes -o wide
# 确认被删节点(如 yu)已不在列表中2.2 登录 Rancher 管理集群查 CAPI Machine
Rancher 管理面资源在其 local 集群上,ssh 到任一 Rancher Server 节点操作:
bash
ssh root@192.168.122.20
export KUBECONFIG=/etc/rancher/rke2/rke2.yaml
# 列出所有 Machine,关注 READY=False 的
kubectl get machines.cluster.x-k8s.io -A异常输出示例:
text
fleet-default custom-98ad33a62bc4 uat1 yu False False Running 24h2.3 查看 Machine 详情与集群状态
bash
kubectl get machine -n fleet-default custom-98ad33a62bc4 -o yaml | grep -A5 'type: Ready'
# message: '* NodeHealthy: Node yu has been deleted while the Machine still exists'
kubectl get clusters.provisioning.cattle.io -n fleet-default uat1 \
-o jsonpath='{range .status.conditions[*]}{.type}={.status} {.message}{"\n"}{end}'
# Updated=Unknown configuring worker node(s) custom-98ad33a62bc4: waiting for probes: calico, kubelet确认是该 Machine 残留导致 Updating 卡住后再进行修复。
3. 修复
删除残留的 Machine 对象(等价于在 Rancher UI 上删除该节点):
bash
kubectl delete machine -n fleet-default custom-98ad33a62bc4删除后 Machine finalizer(machine.cluster.x-k8s.io)正常执行完毕,以下关联对象自动级联清理,无需手工处理:
RKEBootstrap/custom-98ad33a62bc4(fleet-default)CustomMachine/custom-98ad33a62bc4(fleet-default)- 注册 Secret
custom-98ad33a62bc4(集群命名空间c-m-5dx2sdbr)
若 Machine 删除卡在 finalizer(一般发生在节点还在、drain 失败的场景),确认节点确实已不存在后,可
kubectl patch machine ... -p '{"metadata":{"finalizers":[]}}' --type=merge强制移除 finalizer。本案例节点已消失,删除即完成,未触发该情况。
4. 验证
bash
# ① Machine 列表干净,与节点一一对应
kubectl get machines -n fleet-default
# ② 集群条件全部收敛,Updating 消除
kubectl get clusters.provisioning.cattle.io -n fleet-default uat1 \
-o jsonpath='{range .status.conditions[*]}{.type}={.status}{"\n"}{end}'
# 预期:Updated=True / Provisioned=True / Ready=True
# ③ 三处数量一致:Machines = 管理面 Node 记录 = 下游节点
kubectl get nodes.management.cattle.io -n c-m-5dx2sdbrbash
# ④ 下游节点全部 Ready
export KUBECONFIG=~/.kube/config-122.31
kubectl get nodes本案例验证结果:6 Machines / 6 管理面 Node / 6 下游节点,全部 Ready,无任何 yu 残留。
5. 正确删除节点姿势(避免复发)
| 操作 | 后果 |
|---|---|
Rancher UI 勾选节点 → Delete(或删对应 machine.cluster.x-k8s.io 对象) | ✅ 正确。Rancher 自动 cordon/drain/摘除节点,全链路清理 |
下游集群 kubectl delete node | ❌ 留下 Machine 孤儿,集群卡 Updating(本案例) |
| 直接删虚拟机/关机 | ❌ 同上,且可能伴随 etcd/探针超时告警 |
6. 排障要点回顾
- Rancher 纳管集群卡 Updating,先查管理面 CAPI Machine:
kubectl get machines -A,找 READY=False 的; Node yu has been deleted while the Machine still exists是"绕开 Rancher 直接删 Node"的标志性报错;- 修复 = 删除残留 Machine 对象,finalizer 会自动级联清理 RKEBootstrap/CustomMachine/注册 Secret;
- 一切节点增删都必须从 Rancher 侧发起。