排查卡在 Deleting 状态的 DCSMachine

当 Huawei DCS 业务集群上的 DCSMachine 停留在 Phase: Deleting 状态超过预期的约 60 秒,导致在缩容、滚动升级或拆除整个集群期间节点无法更替时,请使用本指南。

适用范围

本指南涵盖 DCS 侧阻止 cluster-api-provider-dcs 在节点上完成 reconcileDelete 流程的故障模式。provider 的正常删除顺序如下:

running VM  →  safe StopVm  →  stopped  →  (detach persistent disks if any)  →  DeleteVm  →  VM gone in DCS

每个步骤都依赖 DCS 平台做出响应。当 DCS 无响应或拒绝执行某个步骤时,controller 会在 DCSMachine.Status.Conditions.VMStopPending 上显示等待原因。首先查看此状态,通常无需访问 controller 日志即可识别问题。

本指南不涵盖正常的删除前限制(CAPI Machine drain 超时、被其他 controller 保留的 finalizer)——这些问题属于上游 Cluster API 故障排查范围。

症状

查看位置所见情况
Machine.status.phase(位于 global 集群上)Deleting 超过 5 分钟
DCSMachine.status.conditions[?(@.type=="VMStopPending")]Status: False,其中包含 Reason 和描述等待原因的 Message
DCS 门户 VM 视图VM 仍在列表中(处于运行、停止中或其他非已停止状态)
global 集群上的 controller 日志类似 issued safe StopVm 或 DeleteVm rejected by FC site policy 的 cluster-api-provider-dcs-manager 行

如果缺少 VMStopPending,且 Machine.status.phase 仍为 Deleting,则问题更可能发生在 reconcileDelete 之前的上游环节(例如 CAPI drain、kubeadm 删除前钩子)。这种情况下,请参阅 CAPI 故障排查文档。

读取 VMStopPending Condition

VMStopPending condition 是本指南的主要信号。

kubectl -n <ns> describe dcsmachine <name>

查找:

Conditions:
  Type:               VMStopPending
  Status:             False
  Severity:           Warning
  Reason:             VMMidTransition
  Message:            VM stuck in stopping; awaiting transition to stopped

Reason 字段提供诊断信息:

ReasonSeverity含义下一步
WaitingForStopInfo已发出安全的 StopVm;controller 每 10 秒轮询一次 stopped最多等待 ~60 秒。如果 VM 超过此时间仍处于 stopping,请跳转到 VM Stuck in stopping。
VMMidTransitionWarningVM 处于除 running / stopped 之外的临时状态(例如 stopping、starting、migrating、paused、hibernated)检查 Message 字段以了解具体状态。请参阅 VM Stuck in Mid-Transition。
(condition absent)—VM 要么已经处于 stopped 状态,要么已经消失——controller 已完成停止阶段。检查 DCS 门户中 VM 是否存在,以及 Machine finalizer。

诊断流程

VM 卡在 stopping

controller 发出了优雅的 StopVm(调用 DCS API /action/stop?mode=safe),VM 已确认但始终未完成状态收敛。

常见原因:

  1. VM pvDriverStatus 不是 running:优雅关机所需的 guest tools(vmtools / pvdriver)没有响应。在 DCS 门户中验证:打开 VM 详情页,检查 pvDriverStatus 字段。如果显示的不是 running,VM 就无法接受安全停止操作。
  2. VM 模板早于 4.2.1:较旧的 DCS VM 模板缺少安全停止所需的 guest tools。确认 DCSMachine 中的 vmTemplateName 与 4.2.1+ 模板匹配(cpaas-system/<release>-dcs-vm-template ConfigMap 上的标签 cpaas.io/dcs-vm-template,请参阅解析占位符值)。
  3. 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。

消息中的状态可能原因解决方法
migrating平台发起的 vMotion / 实时迁移等待。迁移会自行完成;状态达到 running 或 stopped 后,controller 会恢复处理。
starting电源事件后平台发起 VM 启动等待状态变为 running,然后继续删除。
paused / hibernated平台暂停了 VM(不会自动恢复)在 DCS 门户中手动恢复 VM(Operations → Resume),或使用 cpaas.io/retain-vm 绕过并稍后清理 VM。

controller 无法访问 DCS API

如果 VMStopPending condition 不存在,但 Machine.status.phase 长时间仍为 Deleting,则 controller 可能完全无法与 DCS 通信。检查 controller 日志:

kubectl -n cpaas-system logs deployment/cluster-api-provider-dcs-manager --tail=50

查找以下关键字之一:

日志关键字原因
connection refused / timeout从 global 集群无法访问 DCS API endpoint
errorCode: 10100116 "帐户锁定中"DCS 管理员帐户已锁定。请参阅 DCS 帐户锁定。
401 UnauthorizedCredential Secret 已过期;按照 Cloud Credentials 轮换。

DCS 帐户锁定

errorCode: 10100116 表示集群凭证 Secret 中的 DCS 门户帐户处于暴力破解锁定窗口。DCS 门户的锁定策略会在每次登录失败后重置,因此陷入重试循环的 controller 会无限期延长锁定时间。

要打破此循环:

# 1. Scale the manager to 0 so it stops retrying
kubectl -n cpaas-system scale deployment cluster-api-provider-dcs-manager --replicas=0

# 2. Wait 5 minutes for the DCS lockout window to expire naturally
sleep 300

# 3. Restore the manager
kubectl -n cpaas-system scale deployment cluster-api-provider-dcs-manager --replicas=1

# 4. Verify the controller is happy
kubectl -n cpaas-system logs deployment/cluster-api-provider-dcs-manager --tail=20

请避免在生产环境中复用 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 log:
  INFO  DeleteVm rejected by FC site policy, requeuing
        vmUrn=urn:sites:<site>:vms:<vm-id>
        errorCode=102212808

这不是错误——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 添加注解:

kubectl -n <ns> annotate machine <machine-name> cpaas.io/retain-vm=true

效果:

  • controller 的 reconcileDelete 会识别此注解,跳过 ensureVmStopped 和 DeleteVm,并释放 DCSMachine finalizer。
  • 随后,Machine 会退出 Deleting 状态,Cluster API 可以完成父级操作。

副作用——请务必注意:

  • VM 不会从 DCS 中删除——它会保留在 DCS 平台上,继续占用计算和存储资源,不再受 Cluster API 生命周期管理。
  • DCSIpHostnamePool 中的 IP / 主机名槽位也不会释放——在你手动释放之前,池条目会显示为仍在使用。

应用 retain-vm 后,请计划手动执行以下操作:

  1. 在 DCS 门户中(或通过 DCS API)停止并删除 VM。
  2. 从对应的 DCSIpHostnamePool 中释放 IP / 主机名条目。
  3. (可选)清理已附加的任何持久磁盘。

验证恢复情况

应用上述任一解决方案后,监视 DCSMachine,直到条件清除:

kubectl -n <ns> describe dcsmachine <name>
# Look for: Conditions: VMStopPending  Status: True
#           (or the condition disappears as the resource is deleted)

kubectl -n <ns> get machines | grep <machine-name>
# Phase should transition: Deleting → (Machine gone within ~30s)

如果 Machine 已完全消失,且 DCS 门户中不再列出该 VM,则恢复完成。

另请参阅