Skip to content

uat1 集群删除节点未删干净卡在 Updating 状态排查手册

  • 日期:2026-08-05
  • 集群:uat1(Rancher 自定义集群,RKE2 v1.35.6+rke2r1,下游 API 192.168.122.31:6443,管理集群 ID c-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, kubelet

2. 排查步骤

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   24h

2.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-5dx2sdbr
bash
# ④ 下游节点全部 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. 排障要点回顾

  1. Rancher 纳管集群卡 Updating,先查管理面 CAPI Machine:kubectl get machines -A,找 READY=False 的;
  2. Node yu has been deleted while the Machine still exists 是"绕开 Rancher 直接删 Node"的标志性报错;
  3. 修复 = 删除残留 Machine 对象,finalizer 会自动级联清理 RKEBootstrap/CustomMachine/注册 Secret;
  4. 一切节点增删都必须从 Rancher 侧发起。