Миграция с минимальным простоем виртуальных машин KVM между отдельными кластерами Proxmox VE

Материал из support.qbpro.ru

Некоторое время назад потребовалось решить задачу по переносу виртуальных машин KVM с одного кластера Proxmox VE на другой с минимальным временем простоя. В PVE «из коробки» такой возможности нет, но, как оказалось, онлайн‑миграцию виртуальных машин между кластерами можно выполнить средствами KVM. Процедуру переноса я подробно опишу в этом руководстве.

Важные замечания Процедура протестирована для Proxmox VE 6.x

На серверы кластера между которыми производится миграция должен быть настроен вход по SSH без пароля

Условные обозначения pve-01 - сервер с которого будем выполнять миграцию

pve-02 - сервер на который будем выполнять миграции

100 - исходный ID виртуальной машины

120 - ID виртуальной машины после миграции

pc-i440fx-2.11 - чипсет виртуальной машины, в вашем случае может отличаться, ниже я покажу как определить

192.168.0.3 - IP-адрес сервера на который будем мигрировать виртуальную машину

Процедура Зайдём по SSH на оба сервера

На сервере pve-01 найдём чипсет который эмулируется для нашей виртуальной машины. В нашем случае это будет pc-i440fx-2.11

cat << EOF | socat STDIO UNIX:/run/qemu-server/$SRCID.qmp | grep --color current
{ "execute": "qmp_capabilities" }
{ "execute": "query-commands" }
{ "execute": "query-machines" }
EOF

Для удобства установим переменные окружения на обоих серверах

SRCID=100
DSTID=120
CHIPSET=pc-i440fx-2.11
DSTIP=192.168.0.3
DSTPORT=60000

Получим на сервере pve-01 команду запуска виртуальной машины

ps ax | grep $SRCID

Скопируем с pve-01 на pve-02 файл конфигурации виртуальной машины. После выполнения этого шага, в веб-интерфейсе PVE появится конфигурация виртуальной машины с ID $DSTID

scp /etc/pve/local/qemu-server/$SRCID.conf $DSTIP:/etc/pve/local/qemu-server/$DSTID.conf

В интерфейсе PVE сервера pve-02 из конфигурации виртуальной машины $DSTID удалим все диски (Hard Disk) и добавим заново такое же количество дисков такого же размера.

В консоли сервера pve-02 запустим виртуальную машину $DSTID в режиме ожидания миграции. Для этого модифицируем строку запуска полученную на шаге 4:

$SRCID заменить на $DSTID

Удалить из строки ,x509 если есть

Убедиться, что в строке запуска указан -machine type=$CHIPSET полученный на шаге 2

Добавить -incoming tcp:$DSTIP:$DSTPORT -S

/usr/bin/kvm -id $DSTID <остальные параметры> -incoming tcp:$DSTIP:$DSTPORT -S

Запустим миграцию

qm monitor $SRCID
# Опционально можно ограничить скорость передачи данных
qm> migrate_set_speed 100M
qm> migrate -b tcp:$DSTIP:$DSTPORT
  1. Прогресс можно наблюдать командой
qm> info migrate

Запустим qm monitor на сервере pve-02, чтобы отслеживать прогресс. Когда копирование данных завершится, исходная VM перейдёт в состояние VM status: paused (postmigrate)

qm monitor $DSTID
qm> info status
VM status: paused (postmigrate)

В qm monitor на сервере pve-02 запустим перенесённую виртуальную машину

qm> c

На сервере pve-01 остановим исходную виртуальную машину

qm stop $SRCID

Проверяем, что после миграции всё работает как ожидалось и удаляем исходную виртуальную машину

qm destroy $SRCID

Надеюсь это руководство сможет сэкономить время и нервы инженерам, перед которыми возникнет аналогичная задача.

Замечания В Proxmox VE версии 7.3 появилась штатная возможность миграции виртуальных машин на другой кластер. Команда qm remote-migrate. Спасибо за уточнение пользователю @Gunslinger38