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