База знаний VMmanager
Ваш опыт = наш роадмап!
Расскажите, как мы можем усилить платформы
ISPsystem для вашего бизнеса. Опрос займет 5 минут.
Пройти опрос
Режим фокусировки

Некорректный статус ВМ после миграции

Проблема

Фактически виртуальная машина (ВМ) успешно перенесена на целевой узел кластера, но в платформе отображается на исходном узле. 

При этом наблюдаются следующие симптомы:

  • одно из следующих состояний ВМ:
    • ВМ в статусе Активна, при этом задача по миграции имеет статус Ошибка, зависла или отсутствует;
    • ВМ зависла в статусе Мигрирует, при этом задача по миграции завершена со статусом Успешно;
    • ВМ в статусе Остановлена, при этом задача по миграции имеет статус Выполняется.
  • команда virsh list --all|grep <Имя_ВМ> на исходном узле не отображает целевую ВМ;
  • команда virsh list --all|grep <Имя_ВМ> на целевом узле отображает ВМ в статусе running.

Причина

Платформа не получила подтверждения об успешном завершении миграции из-за сбоя сети или ошибки при обработке запроса. В результате фактическое состояние ВМ расходится с состоянием в БД платформы.

Диагностика

Чтобы подтвердить причину проблемы:

  1. В веб-интерфейсе откройте карточку проблемной ВМ и зафиксируйте имя ВМ и узел кластера.
  2. Подключитесь к серверу с платформой по SSH. Подробнее о подключении по SSH см. в статье Настройка рабочего места.
  3. Определите фактическое местоположение ВМ:
    docker exec vm_back vssh -a 'virsh list --all|grep <имя_ВМ>' 2>/dev/null
    Пример вывода
    [root@VMmanager10 ~]# docker exec vm_back vssh -a 'virsh list --all|grep blue-rubellite' 2>/dev/null
    
    Node 8:
     8    191_blue-rubellite   running
    Пояснения:
    • Node 8 — ID узла кластера;
    • 191_blue-rubellite — внутреннее имя ВМ.

Если ВМ запущена на узле кластера, отличном от указанного в веб-интерфейсе, проблема подтверждена.

Решение

Внимание!
Перед выполнением инструкции создайте резервную копию платформы. Подробнее см. в статье Создание резервных копий вручную.

Чтобы решить проблему:

  1. Определите request_id задачи миграции:
    1. В правом меню нажмите значок Список задач  .
    2. Выберите задачу по миграции для целевой ВМ.
    3. Сохраните значение поля request_id.
  2. Подключитесь к серверу с платформой по SSH. Подробнее о подключении по SSH см. в статье Настройка рабочего места.
  3. Установите утилиту jq:
    Astra Linux, Ubuntu
    apt update && apt install jq -y
    AlmaLinux
    dnf install jq -y
  4. Получите токен авторизации. Для этого отправьте POST-запрос на URL вида https://domain.com/auth/v4/public/token. Подробнее см. в инструкции Авторизация по токену статьи Работа с API.
  5. Получите данные задачи. Для этого выполните запрос к сервису taskmgr:
    curl -s -k -X GET -H "accept: application/json" -H "Content-Type: application/json" "https://<domain>/taskmgr/v4/task?where=request_id%20EQ%20'<request_id>'" -H "x-xsrf-token: <токен>" | jq -r '.list[] | select(.status == "failed") | "=========================================================", (.stdin.metadata.name), "", .name, "", .id, "", (.callback_params | tostring), "========================================================="'

    Пояснения:

    • <domain> — адрес сервера с платформой (IP-адрес или доменное имя);
    • <request_id> —  ID задачи миграции, получен в п. 1;
    • <токен> — токен авторизации, получен в п. 3.
    Пример команды
    curl -s -k -X GET -H "accept: application/json" -H "Content-Type: application/json" "https://10.5.11.10/taskmgr/v4/task?where=request_id%20EQ%20'c53699f24ce3b06f17801c4859238cf1'" -H "x-xsrf-token: 10006262-01dd7b7e-4284-42d7-a458-8d195bf9af28" | jq -r '.list[] | select(.status == "failed") | "=========================================================", (.stdin.metadata.name), "", .name, "", .id, "", (.callback_params | tostring), "========================================================="'

    В ответе вы получите следующие данные:

    Пример вывода
    =========================================================
    blue-rubellite
    
    host_migrate
    
    10942
    
    {"disks":[{"id":355,"storage":1}],"host_id":191,"node_id":6,"is_dummy":false,"is_master":false,"interfaces":[{"id":198,"dhcp":false,"name":"ens3","model":"virtio","queues":1,"is_vxlan":false,"vxlan_id":0,"mac_address":"52:54:00:57:2D:BC","node_interface":14,"cluster_interface":0,"node_interface_name":"vmbr0"}],"dst_node_id":8,"host_is_active":true,"security_log_action":"[1787719398009][account_id 100000] Migration host id 191","linked_clones_cold_migration":true}
    =========================================================
    Внимание!
    Для групповой миграции в выводе будет несколько блоков, разделённых символами ===. Проверьте каждый блок и выполните инструкцию для всех проблемных ВМ.

    Пояснения:

    • blue-rubellite — имя ВМ. Убедитесь, что оно совпадает с целевой ВМ;
      Внимание!
      Если ВМ переименовывалась вручную в платформе, имя в выводе API может не совпадать. В этом случае для проверки используйте ID ВМ: сравните значение host_id внутри callback_params с ID ВМ в веб-интерфейсе — они будут совпадать.
    • host_migrate — имя задачи;
      Внимание!
      В выводе должно быть указано именно значение host_migrate. Если имя задачи отличается, инструкция неприменима. Обратитесь в техподдержку.
    • 10942 — ID задачи;
    • {"disks":[...]} — callback_params — параметры для синхронизации данных.
  6. Выполните API-запрос для завершения задачи миграции:
    docker exec vm_back curl -X POST -H 'Instance-ID:1' -H 'internal-auth:on' -o- -D- http://localhost:1500/vm/v3/task/<id_задачи>/success?name=host_migrate -d '{"output":{"content":"","type":"text"},"params":<callback_params>}'

    Пояснения:

    • <id_задачи> — ID задачи миграции, получено в п. 5 (в примере — 10942);
    • <callback_params> — параметры из п. 5 (в примере — {"disks":[...]}).
    Пример команды
    docker exec vm_back curl -X POST -H 'Instance-ID:1' -H 'internal-auth:on' -o- -D- http://localhost:1500/vm/v3/task/10942/success?name=host_migrate -d '{"output":{"content":"","type":"text"},"params":{"disks":[{"id":355,"storage":1}],"host_id":191,"node_id":6,"is_dummy":false,"is_master":false,"interfaces":[{"id":198,"dhcp":false,"name":"ens3","model":"virtio","queues":1,"is_vxlan":false,"vxlan_id":0,"mac_address":"52:54:00:57:2D:BC","node_interface":14,"cluster_interface":0,"node_interface_name":"vmbr0"}],"dst_node_id":8,"host_is_active":true,"security_log_action":"[1787719398009][account_id 100000] Migration host id 191","linked_clones_cold_migration":true}}'
    Пример успешного ответа
    HTTP/1.1 200 OK
    Content-Type: application/json; charset=utf-8
    Content-Length: 4
    Connection: keep-alive

    Указанная команда передаёт callback_params для корректной синхронизации данных о местоположении ВМ в БД платформы.

  7. Проверьте результат в веб-интерфейсе. Убедитесь, что:
    1. Задача миграции имеет статус Успешно.
    2. ВМ отображается на целевом узле кластера.

Может быть полезно