14.11. Миграция виртуальной машины
Миграция — это процесс перемещения виртуальной машины с одного узла гипервизора на другой. Необходимость в таком перемещении возникает в следующих случаях:
Когда узлы гипервизора загружены неравномерно и нужно перераспределить нагрузку.
Когда один из узлов гипервизора необходимо остановить для проведения обслуживания.
14.11.1. Типы миграции
Гипервизором в операционной системе МСВСфера поддерживаются следующие типы миграции:
Миграция без остановки виртуальной машины («живая» миграция) — используется для миграции виртуальных машин, для которых установлено минимальное время простоя. В процессе такой миграции виртуальная машина продолжает работать на исходном узле гипервизора, в то время как KVM передает страницы памяти исходной машины на целевой хост. Когда миграция почти завершена, KVM приостанавливает исходную виртуальную машину и возобновляет её запуск на целевом узле гипервизора. Виртуальные машины, которые изменяют страницы памяти быстрее, чем KVM может их передать, например, такие, как виртуальные машины с большой нагрузкой ввода-вывода, не могут быть перенесены в этом режиме. Для таких виртуальных машин необходимо использовать миграцию с остановкой виртуальной машины.
Миграция с остановкой виртуальной машины. В процессе миграции виртуальная машина останавливается, на целевой узел гипервизора копируется её конфигурация и оперативная память, после чего работа виртуальной машины возобновляется. Рекомендуется для виртуальных машин, которые активно используют оперативную память. Данный тип миграции более надёжен, чем «живая» миграция, но при этом возникает время простоя.
Автономная миграция — применяется когда виртуальная машина остановлена. При этом на целевой гипервизор копируется конфигурация виртуальной машины и, при необходимости, образ виртуального диска.
Для первых двух типов миграции необходимо, чтобы образ диска виртуальной машины
находился на общем сетевом хранилище (например, сервере NFS). Процедура
настройки NFS-сервера описана в конце этого раздела. Для третьего типа
миграции необходимости в общем хранилище нет, файлы конфигурации виртуальной
машины и образа диска можно перенести любыми доступными средствами, включая
утилиты scp
, rsync
и др..
14.11.2. Предварительные условия
Виртуальная машина не должна использовать переадресацию (проброс) физических USB, PCI, vGPU и других устройств, иначе миграция будет невозможна.
Чтобы виртуальная машина не утратила доступ к сети, оба узла гипервизора должны иметь одинаковое имя сетевого моста (network bridge), который обеспечивает подключение виртуальных машин к сети.
Для «живой» миграции оба узла гипервизора должны иметь центральные процессоры одинаковой архитектуры и производителя: либо только Intel, либо только AMD. Хотя процессоры от Intel и AMD поддерживают одинаковый набор команд, «живая» миграция между ними невозможна.
14.11.3. Развёртывание хранилища NFS
Самым простым способом реализовать общее сетевое хранилище между несколькими узлами гипервизора является развёртывание сервера NFS на отдельном физическом или виртуальном сервере.
14.11.3.1. Настройка сервера NFS
Установите пакет nfs-utils
:
$ sudo dnf install nfs-utils
Откройте необходимые порты в брандмауэре:
$ sudo firewall-cmd --permanent --add-service=nfs
$ sudo firewall-cmd --permanent --add-service=mountd
$ sudo firewall-cmd --permanent --add-service=rpc-bind
$ sudo firewall-cmd --permanent --add-port=2049/tcp
$ sudo firewall-cmd --permanent --add-port=2049/udp
$ sudo firewall-cmd --reload
Запустите службу NFS:
$ sudo systemctl enable --now nfs-server
Для настройки на сервере NFS общего ресурса, в котором будут храниться образы дисков виртуальных машин, необходимо создать каталог:
$ sudo mkdir –p /var/lib/libvirt/images
После чего отредактировать файл /etc/exports
, создав в нём следующую строку:
/var/lib/libvirt/shared hv1.domain.local(rw,no_root_squash) hv2.domain.local(rw,no_root_squash)
Где hv1.domain.local
и hv2.domain.local
— доменные адреса узлов гипервизора.
Вместо доменных адресов можно указывать IP-адреса. После этого нужно
перезапустить службу NFS командой:
$ sudo systemctl reload nfs-server
Для проверки правильности настройки сервера нужно выполнить команду и проверить её вывод:
$ sudo exportfs
/var/lib/libvirt/shared
192.168.10.251
/var/lib/libvirt/shared
192.168.10.252
Где 192.168.10.251
и 192.168.10.252
— это IP-адреса узлов hv1.domain.local
и hv2.domain.local
.
14.11.3.2. Настройка клиентов NFS
Для подключения общего ресурса к узлам гипервизора на каждом из них необходимо выполнить команду:
$ sudo mount nfs.domain.local:/var/lib/libvirt/shared /var/lib/libvirt/images
Замените nfs.domain.local
на реальное доменное имя или IP-адрес сервера NFS.
Подразумевается, что изначально никаких образов в каталоге
/var/lib/libvirt/images
нет.
Чтобы подключение общего ресурса автоматически восстанавливалось после
перезагрузки компьютера, необходимо добавить соответствующую строку в файл
/etc/fstab
:
nfs.domain.local:/var/lib/libvirt/shared /var/lib/libvirt/images nfs defaults 0 0
Также на узлах гипервизора необходимо снять ограничение SELinux на
использование подсистемой виртуализации libvirt хранилища NFS. Для этого
необходимо установить значение переменной SELinux virt_use_nfs
равным 1
,
выполнив команду:
$ sudo setsebool virt_use_nfs 1
Настройка узлов гипервизора
В брандмауэре узлов гипервизора необходимо разрешить диапазон портов, которые используются службой libvirtd для передачи оперативной памяти виртуальных машин:
$ sudo firewall-cmd --add-port=49152-49215/tcp --permanent
$ sudo firewall-cmd --reload
Миграция виртуальной машины с помощью командной строки
Для миграции виртуальных машин из командной строки служит команда
virsh migrate
. В данном разделе представлено несколько примеров её
использования.
14.11.3.3. Миграция запущенной виртуальной машины
Пример «живой» миграции запущенной виртуальной машины:
$ virsh migrate --persistent --live msvsphere9 qemu+ssh://hv2.domain.local/system
где msvsphere9
— название виртуальной машины, а
qemu+ssh://hv2.domain.local/system
— URL узла гипервизора, на который
необходимо осуществить миграцию.
Если для утилиты virsh не указана опция --verbose
, на консоль не выводится
ничего кроме ошибок. Если процесс миграции уже запущен, для отображения
статистики можно использовать команду virsh domjobinfo
. Чтобы убедиться, что
виртуальная машина была успешно перенесена, нужно снова выполнить команду
virsh list
на обоих узлах гипервизора. В случае успешной миграции она покажет,
что виртуальная машина выполняется на узле hv2.domain.local
.
14.11.3.4. Миграция приостановленной виртуальной машины
Миграция приостановленной виртуальной машины msvsphere9
с узла
hv1.domain.local
на узел hv2.domain.local
с переносом её конфигурации:
$ virsh migrate msvsphere9 qemu+ssh://hv1.domain.local/system \
qemu+ssh://hv2.domain.local/system
14.11.3.5. Миграция остановленной виртуальной машины
Миграция остановленной виртуальной машины msvsphere9
с узла hv1.domain.local
на узел hv2.domain.local
:
$ virsh migrate --offline --persistent --undefinesource msvsphere9 \
qemu+ssh://hv1.domain.local/system qemu+ssh://hv2.domain.local/system