• Русский
  • Устранение неполадок DCSMachine, застрявшего в Deleting

    Используйте это руководство, если DCSMachine в рабочем кластере Huawei DCS остается в Phase: Deleting дольше ожидаемых ~60 секунд, блокируя смену ноды во время scale-down, rolling upgrade или полного удаления кластера.

    Область применения

    Это руководство охватывает сбои на стороне DCS, из-за которых cluster-api-provider-dcs не может завершить поток reconcileDelete для ноды. Обычная последовательность удаления у провайдера выглядит так:

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

    Каждый шаг зависит от ответа платформы DCS. Когда DCS не отвечает или отклоняет шаг, контроллер показывает причину ожидания в DCSMachine.Status.Conditions.VMStopPending. Сначала прочтите именно это условие — оно обычно позволяет определить проблему без доступа к логам контроллера.

    Это руководство не охватывает обычные блокировки перед удалением (тайм-ауты drain для CAPI Machine, finalizers, удерживаемые другими контроллерами) — они относятся к стандартной документации Cluster API по устранению неполадок.

    Симптомы

    Где смотретьЧто вы видите
    Machine.status.phase (в кластере global)Deleting более 5 минут
    DCSMachine.status.conditions[?(@.type=="VMStopPending")]Status: False с Reason и Message, описывающими ожидание
    Представление VM в портале DCSVM по-прежнему отображается в списке (running, stopping или в другом состоянии, отличном от stopped)
    Лог контроллера в кластере globalСтрока cluster-api-provider-dcs-manager, например issued safe StopVm или DeleteVm rejected by FC site policy

    Если VMStopPending отсутствует, а Machine.status.phase все еще Deleting, проблема, скорее всего, находится выше reconcileDelete (например, CAPI drain, kubeadm pre-delete hooks). В этом случае обратитесь к документации по устранению неполадок CAPI.

    Чтение условия VMStopPending

    Условие VMStopPending — это основной сигнал для этого руководства.

    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; контроллер опрашивает состояние каждые 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, либо уже удалена — контроллер прошел фазу остановки.Проверьте наличие VM в портале DCS и finalizers у Machine.

    Потоки диагностики

    VM застряла в stopping

    Контроллер отправил корректный StopVm (вызов DCS API /action/stop?mode=safe), VM подтвердила получение команды, но состояние так и не стабилизировалось.

    Распространенные причины:

    1. pvDriverStatus у VM не running — гостевые инструменты (vmtools / pvdriver), необходимые для корректного завершения работы, не отвечают. Проверьте в портале DCS: откройте страницу подробностей VM и посмотрите поле pvDriverStatus. Если там указано что-либо, кроме running, VM не может принять безопасную остановку.
    2. Шаблон VM старше 4.2.1 — старые шаблоны VM DCS не содержат гостевых инструментов, необходимых для safe stop. Убедитесь, что vmTemplateName в DCSMachine соответствует шаблону 4.2.1+ (метка cpaas.io/dcs-vm-template в ConfigMap cpaas-system/<release>-dcs-vm-template, см. Resolving Placeholder Values).
    3. Зависла гостевая ОС — ядро VM зависло и не обрабатывает завершение ACPI.

    Путь устранения:

    • Для (1) и (3): вручную выполните остановку с force в портале DCS (VM detail → Operations → Stop → Force). Как только VM перейдет в stopped, следующий reconcile у контроллера подхватит новое состояние и продолжит DeleteVm.
    • Для (2): этот провайдер не может безопасно удалить VM на таком шаблоне; снимите нагрузку с ноды, вручную выключите VM, затем используйте cpaas.io/retain-vm для пропуска удаления на стороне контроллера.

    VM застряла в состоянии перехода

    В Message отображается статус, например migrating, starting, paused или hibernated. Контроллер не будет выполнять никаких операций над VM в этих состояниях (DCS отклонит их) и будет бесконечно ожидать перехода VM в running или stopped.

    Статус в сообщенииВероятная причинаРешение
    migratingЗапущенная платформой vMotion / live migrationПодождите. Миграция завершится самостоятельно; контроллер продолжит работу, когда статус станет running или stopped.
    startingПлатформа инициировала запуск VM после сбоя питанияПодождите, пока не будет running, после чего удаление продолжится.
    paused / hibernatedПриостановленная платформой VM (не восстанавливается автоматически)Возобновите VM вручную в портале DCS (Operations → Resume) или используйте cpaas.io/retain-vm, чтобы обойти это состояние и затем очистить VM позже.

    Контроллер не может достичь DCS API

    Если условие VMStopPending отсутствует, но Machine.status.phase остается Deleting в течение длительного времени, возможно, контроллер вообще не может связаться с DCS. Проверьте лог контроллера:

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

    Ищите одно из следующего:

    Ключевое слово в логеПричина
    connection refused / timeoutКонечная точка DCS API недоступна из кластера global
    errorCode: 10100116 "帐户锁定中"Учетная запись администратора DCS заблокирована. См. DCS Account Lockout.
    401 UnauthorizedSecret с учетными данными устарел; выполните ротацию согласно Cloud Credentials.

    Блокировка учетной записи DCS

    errorCode: 10100116 означает, что учетная запись портала DCS, указанная в Secret с учетными данными кластера, находится в окне блокировки из-за brute-force. Политика блокировки портала DCS сбрасывается после каждой неудачной попытки входа, поэтому контроллер, застрявший в цикле повторов, неограниченно продлевает блокировку.

    Чтобы разорвать этот цикл:

    # 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 portal admin повторно в Secret провайдера в production. Настройте отдельную учетную запись DCS (interconnect или domain user, см. Credential User Types) с ослабленной политикой блокировки, чтобы временный сбой контроллера не мог заблокировать доступ к платформе для всех.

    Политика FC site "仅能删除已停止虚拟机" (errorCode 102212808)

    Если рабочий кластер работает на сайте DCS, где на базовой платформе FusionCompute включена политика безопасности "delete-only-when-stopped", DeleteVm будет отклонен, когда VM все еще running. Начиная с cluster-api-provider-dcs v1.0.18, обычный поток удаления провайдера обрабатывает это автоматически, отправляя безопасный StopVm перед DeleteVm, но в редких гонках внешний участник — человек-оператор в портале DCS или другая автоматизация — может перезапустить VM между проверкой остановки контроллером и вызовом DeleteVm. Контроллер отображает эту гонку как:

    Controller log:
      INFO  DeleteVm rejected by FC site policy, requeuing
            vmUrn=urn:sites:<site>:vms:<vm-id>
            errorCode=102212808

    Это не ошибка — контроллер считает errorCode 102212808 восстанавливаемым состоянием и повторно ставит задачу в очередь. При следующем reconcile он снова проверяет статус VM; если она снова running, контроллер повторно отправляет StopVm(safe) и продолжает работу. Нормальное время восстановления — ~30 секунд.

    Если вы видите этот errorCode повторно (более 3 циклов), внешний участник конфликтует с контроллером. Приостановите внешнюю автоматизацию или примените cpaas.io/retain-vm, чтобы полностью взять управление жизненным циклом VM вне контроллера.

    Используйте cpaas.io/retain-vm как аварийный обходной путь

    Когда контроллер по какой-либо причине не может завершить reconcileDelete, и вам нужно освободить finalizer Machine, чтобы рабочий кластер мог продолжить работу (scale-down, upgrade, removal), добавьте аннотацию либо в Machine, либо в DCSMachine:

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

    Эффект:

    • reconcileDelete у контроллера распознает аннотацию, пропускает и ensureVmStopped, и DeleteVm, а также освобождает finalizer DCSMachine.
    • После этого Machine выходит из состояния Deleting, и Cluster API может завершить родительскую операцию.

    Побочный эффект — важно:

    • VM не удаляется из DCS — она остается на платформе DCS и продолжает потреблять вычислительные и дисковые ресурсы, вне управления жизненным циклом Cluster API.
    • Слот IP / hostname в DCSIpHostnamePool тоже не освобождается — запись пула будет показываться как занятая, пока вы не освободите ее вручную.

    После применения retain-vm запланируйте ручное выполнение следующих действий:

    1. Остановите и удалите VM в портале DCS (или через DCS API).
    2. Освободите запись IP / hostname в соответствующем DCSIpHostnamePool.
    3. (Необязательно) Очистите все присоединенные persistent disks.

    Проверка восстановления

    После применения любого из описанных выше способов устранения наблюдайте за 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 полностью исчез и VM больше не отображается в портале DCS, восстановление завершено.

    См. также