Некоторое время назад потребовалось решить задачу по переносу виртуальных машин 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
Надеюсь это руководство сможет сэкономить время и нервы инженерам, перед которыми возникнет аналогичная задача.
Замечания
-
В Proxmox VE версии 7.3 появилась штатная возможность миграции виртуальных машин на другой кластер. Команда
qm remote-migrate.
Спасибо за уточнение пользователю@Gunslinger38
Автор:
sokolov-denis