Миграция с минимальным простоем виртуальных машин KVM между отдельными кластерами Proxmox VE
Некоторое время назад потребовалось решить задачу по переносу виртуальных машин 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 # Прогресс можно наблюдать командой 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
Надеюсь это руководство сможет сэкономить время и нервы инженерам, перед которыми возникнет аналогичная задача.