排查卡在 Deleting 状态的 DCSMachine
当 Huawei DCS 业务集群上的 DCSMachine 停留在 Phase: Deleting 状态超过预期的约 60 秒,导致在缩容、滚动升级或拆除整个集群期间节点无法更替时,请使用本指南。
目录
适用范围症状读取 VMStopPending Condition诊断流程VM 卡在stoppingVM 卡在中间转换状态controller 无法访问 DCS APIDCS 帐户锁定FC 站点策略“仅能删除已停止虚拟机”(errorCode 102212808)将 cpaas.io/retain-vm 用作应急手段验证恢复情况另请参阅适用范围
本指南涵盖 DCS 侧阻止 cluster-api-provider-dcs 在节点上完成 reconcileDelete 流程的故障模式。provider 的正常删除顺序如下:
每个步骤都依赖 DCS 平台做出响应。当 DCS 无响应或拒绝执行某个步骤时,controller 会在 DCSMachine.Status.Conditions.VMStopPending 上显示等待原因。首先查看此状态,通常无需访问 controller 日志即可识别问题。
本指南不涵盖正常的删除前限制(CAPI Machine drain 超时、被其他 controller 保留的 finalizer)——这些问题属于上游 Cluster API 故障排查范围。
症状
如果缺少 VMStopPending,且 Machine.status.phase 仍为 Deleting,则问题更可能发生在 reconcileDelete 之前的上游环节(例如 CAPI drain、kubeadm 删除前钩子)。这种情况下,请参阅 CAPI 故障排查文档。
读取 VMStopPending Condition
VMStopPending condition 是本指南的主要信号。
查找:
Reason 字段提供诊断信息:
诊断流程
VM 卡在 stopping
controller 发出了优雅的 StopVm(调用 DCS API /action/stop?mode=safe),VM 已确认但始终未完成状态收敛。
常见原因:
- VM
pvDriverStatus不是running:优雅关机所需的 guest tools(vmtools / pvdriver)没有响应。在 DCS 门户中验证:打开 VM 详情页,检查pvDriverStatus字段。如果显示的不是running,VM 就无法接受安全停止操作。 - VM 模板早于
4.2.1:较旧的 DCS VM 模板缺少安全停止所需的 guest tools。确认 DCSMachine 中的vmTemplateName与4.2.1+模板匹配(cpaas-system/<release>-dcs-vm-templateConfigMap 上的标签cpaas.io/dcs-vm-template,请参阅解析占位符值)。 - Guest OS 挂起:VM 内核卡住,未处理 ACPI 关机请求。
解决路径:
- 对于 (1) 和 (3):在 DCS 门户中手动发出
force停止操作(VM 详情 → Operations → Stop → Force)。VM 达到stopped后,controller 的下一次 reconcile 会获取新状态,并继续执行DeleteVm。 - 对于 (2):此 provider 无法在该模板上安全删除 VM;先将业务负载从节点迁出,手动关闭 VM,然后使用
cpaas.io/retain-vm跳过 controller 端删除。
VM 卡在中间转换状态
Message 显示的状态类似于 migrating、starting、paused 或 hibernated。controller 不会对处于这些状态的 VM 发出任何操作(DCS 会拒绝),而是无限期等待 VM 收敛到 running 或 stopped。
controller 无法访问 DCS API
如果 VMStopPending condition 不存在,但 Machine.status.phase 长时间仍为 Deleting,则 controller 可能完全无法与 DCS 通信。检查 controller 日志:
查找以下关键字之一:
DCS 帐户锁定
errorCode: 10100116 表示集群凭证 Secret 中的 DCS 门户帐户处于暴力破解锁定窗口。DCS 门户的锁定策略会在每次登录失败后重置,因此陷入重试循环的 controller 会无限期延长锁定时间。
要打破此循环:
请避免在生产环境中复用 DCS 门户的 admin 帐户作为 provider 的 Secret。 配置专用的 DCS 帐户(interconnect 或 domain user,请参阅凭证用户类型),并放宽其锁定策略,这样 controller 的暂时性故障就不会导致整个平台对所有人锁定。
FC 站点策略“仅能删除已停止虚拟机”(errorCode 102212808)
如果业务集群运行在某个 DCS 站点上,而其底层 FusionCompute 平台启用了“仅能删除已停止虚拟机”安全策略,则当 VM 仍处于 running 状态时,DeleteVm 会被拒绝。provider 的正常删除流程会先发出安全的 StopVm,然后再执行 DeleteVm,从而自动处理此情况;但在少见的竞态条件下,外部操作者(DCS 门户中的人工操作员或其他自动化程序)可能在 controller 检查停止状态与调用 DeleteVm 之间重启 VM。controller 会将此竞态显示为:
这不是错误——controller 会将 errorCode 102212808 视为可恢复情况并重新排队。下一次 reconcile 会重新检查 VM 状态;如果 VM 再次运行,controller 会重新发出 StopVm(safe) 并继续处理。正常恢复时间约为 ~30 秒。
如果反复看到此 errorCode(超过 3 个周期),说明外部操作者正在与 controller 争抢操作。请暂停外部自动化程序,或应用 cpaas.io/retain-vm,以完全在 controller 之外接管 VM 生命周期。
将 cpaas.io/retain-vm 用作应急手段
当 controller 因任何原因无法完成 reconcileDelete,而你需要释放 Machine finalizer,以便业务集群继续执行操作(缩容、升级、移除)时,请为 Machine 或 DCSMachine 添加注解:
效果:
- controller 的
reconcileDelete会识别此注解,跳过ensureVmStopped和DeleteVm,并释放DCSMachinefinalizer。 - 随后,
Machine会退出Deleting状态,Cluster API 可以完成父级操作。
副作用——请务必注意:
- VM 不会从 DCS 中删除——它会保留在 DCS 平台上,继续占用计算和存储资源,不再受 Cluster API 生命周期管理。
DCSIpHostnamePool中的 IP / 主机名槽位也不会释放——在你手动释放之前,池条目会显示为仍在使用。
应用 retain-vm 后,请计划手动执行以下操作:
- 在 DCS 门户中(或通过 DCS API)停止并删除 VM。
- 从对应的
DCSIpHostnamePool中释放 IP / 主机名条目。 - (可选)清理已附加的任何持久磁盘。
验证恢复情况
应用上述任一解决方案后,监视 DCSMachine,直到条件清除:
如果 Machine 已完全消失,且 DCS 门户中不再列出该 VM,则恢复完成。
另请参阅
- 在 Huawei DCS 上创建集群 — 完整的集群清单参考
- Huawei DCS 的云凭证 — Secret 格式和用户类型
- 排查卡在 Provisioned 状态的业务集群 — 与集群启动问题相关的指南
- 排查卡在 Deleting 状态的集群 — 每个子 Machine 都已消失后,顶级
ClusterCR 仍卡在Deleting状态