Как мигрировать виртуальные машины между хостами: миграция работающих ВМ в KVM

Миграция виртуальных машин между хостами – критически важная операция для обеспечения высокой доступности, балансировки нагрузки и обслуживания инфраструктуры. В этой статье мы подробно рассмотрим миграцию работающих виртуальных машин (live migration) в среде KVM (Kernel-based Step-by-Step Guide" class="internal-post-link">Virtual Machine). Мы изучим необходимые условия, инструменты и пошаговые инструкции, чтобы вы могли безопасно и эффективно переносить виртуальные машины между вашими хостами без прерывания их работы. Вы узнаете, как настроить сеть, проверить совместимость и выполнить миграцию с помощью командной строки и графических инструментов.

Содержание:

Подготовка к миграции

Как мигрировать виртуальные машины между хостами? - Steps for preparing for live migration, including shared storage setup and user permissions.

Прежде чем приступить к миграции виртуальной машины, необходимо выполнить ряд подготовительных шагов, чтобы обеспечить успешное и бесперебойное перемещение. Ключевые аспекты подготовки включают проверку ресурсов, настройку общего хранилища (если необходимо) и настройку прав доступа. Правильная подготовка минимизирует риск возникновения проблем во время миграции и обеспечивает минимальное время простоя для вашей виртуальной машины.

VPS Hosting

Virtual servers with guaranteed resources

Choose VPS

Проверка доступности ресурсов

Убедитесь, что целевой хост имеет достаточно ресурсов (CPU, RAM, дисковое пространство) для размещения виртуальной машины. Недостаток ресурсов может привести к проблемам с производительностью или даже к сбою миграции. Проверьте загрузку CPU, использование памяти и свободное место на диске на обоих хостах.

Пример: Проверка использования ресурсов с помощью команды top
top -b -n 1 | head -n 5

Эта команда отображает первые 5 строк вывода top, показывая общую загрузку CPU, использование памяти и другие важные показатели. Параметр `-b` запускает top в пакетном режиме, а `-n 1` указывает, что нужно выполнить только одну итерацию. Это удобно для автоматизации и скриптов.

Пример: Проверка свободного места на диске с помощью команды df
df -h /var/lib/libvirt/images

Эта команда показывает использование дискового пространства для каталога `/var/lib/libvirt/images`, где обычно хранятся образы виртуальных машин. Опция `-h` делает вывод более читабельным, показывая размеры в человеко-понятном формате (например, GB, MB). Убедитесь, что на целевом хосте достаточно свободного места для хранения дисков виртуальной машины.

Настройка общего хранилища (если необходимо)

Если вы используете общее хранилище (например, NFS, iSCSI), убедитесь, что оно доступно и правильно настроено на обоих хостах. Общее хранилище упрощает миграцию, так как виртуальная машина продолжает использовать одни и те же диски, независимо от того, на каком хосте она запущена.

Пример: Монтирование NFS-шары
mount -t nfs 192.168.1.10:/exports/vm_images /var/lib/libvirt/images

Эта команда монтирует NFS-шару с IP-адресом 192.168.1.10 и путем `/exports/vm_images` в каталог `/var/lib/libvirt/images` на локальном хосте. Чтобы сделать монтирование постоянным, добавьте соответствующую запись в файл `/etc/fstab`.

Пример: Добавление записи в /etc/fstab
echo "192.168.1.10:/exports/vm_images /var/lib/libvirt/images nfs defaults 0 0" >> /etc/fstab

Эта команда добавляет строку в файл `/etc/fstab`, которая указывает, как монтировать NFS-шару при загрузке системы. Опция `defaults` использует стандартные параметры монтирования, а `0 0` отключает резервное копирование и проверку файловой системы.

Настройка прав доступа

Убедитесь, что пользователь, от имени которого выполняется миграция, имеет необходимые права доступа на обоих хостах. Обычно это пользователь root или пользователь, входящий в группу libvirt. Недостаточные права доступа могут привести к ошибкам при попытке подключения к хосту или управлении виртуальными машинами.

Пример: Добавление пользователя в группу libvirt
usermod -a -G libvirt your_username

Эта команда добавляет пользователя `your_username` в группу `libvirt`. После выполнения команды необходимо выйти из системы и снова войти, чтобы изменения вступили в силу.

Пример: Проверка членства в группе
groups your_username

Эта команда показывает список групп, в которых состоит пользователь `your_username`. Убедитесь, что в списке присутствует группа `libvirt`.

Настройка сети для миграции

Как мигрировать виртуальные машины между хостами? - Diagram showing network configuration for live migration, including a dedicated migration network.

Правильная настройка сети является критически важной для успешной миграции. Рекомендуется использовать выделенную сеть для трафика миграции, чтобы избежать перегрузки основной сети и обеспечить стабильную и быструю передачу данных. В этом разделе мы рассмотрим настройку выделенной сети, настройку DNS и брандмауэра.

Настройка выделенной сети

Создайте отдельную виртуальную сеть (например, VLAN) или физическую сеть, предназначенную исключительно для трафика миграции. Назначьте каждому хосту IP-адреса в этой сети и убедитесь, что они могут связываться друг с другом. Использование выделенной сети повышает безопасность и производительность миграции.

Пример: Настройка IP-адресов на интерфейсах
# Хост 1
ip addr add 192.168.10.1/24 dev eth1
ip link set eth1 up

# Хост 2
ip addr add 192.168.10.2/24 dev eth1
ip link set eth1 up

Эти команды назначают IP-адреса 192.168.10.1 и 192.168.10.2 интерфейсу eth1 на хостах 1 и 2 соответственно. Убедитесь, что интерфейс eth1 подключен к выделенной сети миграции. Команда `ip link set eth1 up` активирует интерфейс.

Пример: Проверка связи между хостами
ping 192.168.10.2

Эта команда проверяет связь между хостом 1 и хостом 2 по выделенной сети. Убедитесь, что пинги проходят успешно.

Настройка DNS

Убедитесь, что имена хостов правильно разрешаются в IP-адреса выделенной сети. Это можно сделать, добавив записи в файл `/etc/hosts` на обоих хостах или настроив DNS-сервер. Правильное разрешение имен упрощает процесс миграции и делает его более надежным.

Пример: Добавление записей в /etc/hosts
# Хост 1 и Хост 2
echo "192.168.10.1 host1.example.com host1" >> /etc/hosts
echo "192.168.10.2 host2.example.com host2" >> /etc/hosts

Эти команды добавляют записи в файл `/etc/hosts`, связывая IP-адреса выделенной сети с именами хостов. Замените `host1.example.com` и `host2.example.com` на полные доменные имена ваших хостов, а `host1` и `host2` на короткие имена хостов.

Пример: Проверка разрешения имен
ping host2

Эта команда проверяет, правильно ли разрешается имя хоста `host2` в IP-адрес 192.168.10.2. Убедитесь, что пинги проходят успешно.

Настройка брандмауэра

Настройте брандмауэр на обоих хостах, чтобы разрешить трафик, необходимый для миграции. Обычно это порты, используемые libvirt (например, TCP 16509). Неправильно настроенный брандмауэр может блокировать трафик миграции и приводить к сбоям.

Пример: Разрешение трафика libvirt с помощью firewalld
# Хост 1 и Хост 2
firewall-cmd --permanent --add-port=16509/tcp
firewall-cmd --reload

Эти команды добавляют правило в firewalld, разрешающее трафик TCP на порту 16509. Опция `—permanent` делает правило постоянным, а `—reload` перезагружает брандмауэр, чтобы применить изменения.

Пример: Проверка правил брандмауэра
firewall-cmd --list-all

Эта команда показывает список всех правил, настроенных в firewalld. Убедитесь, что в списке присутствует правило, разрешающее трафик TCP на порту 16509.

Проверка совместимости хостов

Для успешной миграции крайне важно, чтобы исходный и целевой хосты были совместимы. Это включает в себя проверку совместимости CPU, версий libvirt и QEMU. Несовместимость может привести к сбоям миграции или к нестабильной работе виртуальной машины после миграции. В этом разделе мы рассмотрим, как проверить совместимость с помощью virsh и других инструментов.

Проверка совместимости CPU

Разные модели CPU могут иметь разные наборы инструкций, что может привести к проблемам при миграции. Используйте virsh capabilities для сравнения возможностей CPU исходного и целевого хостов. Если CPU несовместимы, можно использовать опцию --cpu-model при миграции, чтобы указать общую модель CPU, поддерживаемую обоими хостами.

Пример: Получение информации о CPU с помощью virsh capabilities
virsh capabilities | grep -A 20 'cpu>'

Эта команда отображает информацию о CPU с помощью команды `virsh capabilities` и фильтрует вывод, чтобы показать только секцию, начинающуюся с тега ``. Параметр `-A 20` указывает, что нужно отобразить 20 строк после найденной строки.

Пример: Миграция с указанием модели CPU
virsh migrate --live vm1 qemu+ssh://host2.example.com/system --cpu-model core2duo

Эта команда выполняет живую миграцию виртуальной машины `vm1` на хост `host2.example.com` и указывает, что нужно использовать модель CPU `core2duo`. Эта опция может быть необходима, если CPU исходного и целевого хостов не полностью совместимы. Замените `core2duo` на модель CPU, поддерживаемую обоими хостами.

Проверка версий libvirt и QEMU

Убедитесь, что версии libvirt и QEMU на исходном и целевом хостах совместимы. Использование разных версий может привести к проблемам с управлением виртуальными машинами и сбоям миграции. Рекомендуется использовать одинаковые или близкие версии libvirt и QEMU на всех хостах.

Пример: Проверка версии libvirt
virsh version

Эта команда отображает информацию о версии libvirt и используемом гипервизоре (например, QEMU). Проверьте версию libvirt на обоих хостах и убедитесь, что они совместимы.

Пример: Проверка версии QEMU
qemu-system-x86_64 --version

Эта команда отображает информацию о версии QEMU. Проверьте версию QEMU на обоих хостах и убедитесь, что они совместимы.

Проверка конфигурации виртуальной машины

Проверьте конфигурацию виртуальной машины (например, количество vCPU, объем памяти, сетевые интерфейсы), чтобы убедиться, что целевой хост поддерживает ее. Несовместимость в конфигурации может привести к проблемам с запуском виртуальной машины после миграции.

Пример: Получение информации о виртуальной машине с помощью virsh
virsh dominfo vm1

Эта команда отображает информацию о виртуальной машине `vm1`, включая ID, имя, состояние, количество vCPU, объем памяти и другие параметры. Сравните эту информацию с ресурсами целевого хоста.

Пример: Получение XML-конфигурации виртуальной машины
virsh dumpxml vm1

Эта команда отображает XML-конфигурацию виртуальной машины `vm1`. Вы можете использовать эту информацию для более детального анализа конфигурации и проверки совместимости с целевым хостом.

Выполнение миграции с помощью virsh

virsh – это мощный инструмент командной строки для управления виртуальными машинами в среде KVM. Он предоставляет широкие возможности для миграции, включая живую миграцию, которая позволяет перемещать виртуальные машины между хостами без прерывания их работы. В этом разделе мы подробно рассмотрим, как выполнить миграцию с помощью virsh, а также рассмотрим различные опции и примеры.

Основные команды для миграции

Основная команда для миграции виртуальных машин с помощью virsh – это virsh migrate. Она принимает различные опции, которые позволяют настроить процесс миграции в соответствии с вашими потребностями. Ниже приведены основные опции:

  • --live: Выполняет живую миграцию, то есть перемещает виртуальную машину без прерывания ее работы.
  • --copy-storage: Копирует хранилище виртуальной машины на целевой хост.
  • --persistent: Делает конфигурацию виртуальной машины постоянной на целевом хосте.
  • --auto-converge: Включает автоматическую конвергенцию, чтобы уменьшить время простоя.
  • --cpu-model: Указывает модель CPU для использования на целевом хосте (см. предыдущий раздел).
Пример: Живая миграция с минимальными опциями
virsh migrate --live vm1 qemu+ssh://host2.example.com/system

Эта команда выполняет живую миграцию виртуальной машины `vm1` на хост `host2.example.com`. Она использует протокол SSH для подключения к целевому хосту. Убедитесь, что у пользователя, выполняющего команду, есть права доступа на целевом хосте.

Миграция с общим хранилищем

Если виртуальная машина использует общее хранилище, миграция становится проще, так как не требуется копировать диски виртуальной машины. В этом случае, команда миграции может быть упрощена.

Пример: Живая миграция с общим хранилищем
virsh migrate --live vm1 qemu+ssh://host2.example.com/system

Эта команда выполняет живую миграцию виртуальной машины `vm1` на хост `host2.example.com`. Так как используется общее хранилище, опция `—copy-storage` не требуется.

Миграция без общего хранилища

Если виртуальная машина не использует общее хранилище, необходимо скопировать диски виртуальной машины на целевой хост. Это можно сделать с помощью опции `—copy-storage` или с помощью других методов, таких как rsync.

Пример: Живая миграция с копированием хранилища
virsh migrate --live --copy-storage vm1 qemu+ssh://host2.example.com/system

Эта команда выполняет живую миграцию виртуальной машины `vm1` на хост `host2.example.com` и копирует хранилище виртуальной машины на целевой хост. Этот процесс может занять некоторое время, в зависимости от размера дисков виртуальной машины.

Пример: Миграция с использованием rsync (альтернативный метод)
# На исходном хосте
rsync -avz /var/lib/libvirt/images/vm1.img host2.example.com:/var/lib/libvirt/images/

# После завершения rsync, выполнить миграцию
virsh migrate --live vm1 qemu+ssh://host2.example.com/system

Этот пример показывает, как скопировать диск виртуальной машины `vm1.img` на целевой хост с помощью rsync перед выполнением миграции. Опция `-avz` обеспечивает архивирование, рекурсивное копирование и сжатие данных. После завершения копирования, выполните команду virsh migrate без опции `—copy-storage`.

Диагностика и устранение проблем

Миграция виртуальных машин, особенно живая миграция, может столкнуться с различными проблемами. Важно уметь диагностировать и устранять эти проблемы, чтобы обеспечить успешное перемещение виртуальных машин и избежать простоя. В этом разделе мы рассмотрим наиболее распространенные проблемы и методы их решения.

Проблемы с подключением

Одной из самых распространенных проблем является невозможность установить соединение между исходным и целевым хостами. Это может быть связано с проблемами с сетью, брандмауэром или настройками DNS.

Пример: Проверка связи с помощью ping
ping host2.example.com

Убедитесь, что хосты могут связываться друг с другом по сети. Если пинги не проходят, проверьте настройки сети, брандмауэр и DNS.

Пример: Проверка правил брандмауэра
firewall-cmd --list-all

Убедитесь, что брандмауэр не блокирует трафик, необходимый для миграции (например, порт 16509 для libvirt). Добавьте необходимые правила и перезагрузите брандмауэр.

Проблемы с ресурсами

Недостаток ресурсов на целевом хосте может привести к сбою миграции. Убедитесь, что на целевом хосте достаточно CPU, памяти и дискового пространства для размещения виртуальной машины.

Пример: Проверка использования ресурсов с помощью top
top

Проверьте загрузку CPU и использование памяти на целевом хосте. Если ресурсы сильно загружены, освободите их или перенесите часть нагрузки на другой хост.

Пример: Проверка свободного места на диске с помощью df
df -h

Убедитесь, что на целевом хосте достаточно свободного места для хранения дисков виртуальной машины. Если места недостаточно, увеличьте размер раздела или перенесите диски на другое хранилище.

Проблемы с совместимостью CPU

Несовместимость CPU между исходным и целевым хостами может привести к сбою миграции или к нестабильной работе виртуальной машины после миграции. Используйте опцию --cpu-model при миграции, чтобы указать общую модель CPU, поддерживаемую обоими хостами.

Пример: Миграция с указанием модели CPU
virsh migrate --live vm1 qemu+ssh://host2.example.com/system --cpu-model core2duo

Укажите модель CPU, поддерживаемую обоими хостами. Если вы не знаете, какую модель использовать, попробуйте host или kvm64.

Просмотр логов

Если миграция завершилась неудачей, просмотрите логи libvirt и QEMU для получения дополнительной информации об ошибке. Логи могут содержать подсказки о причине проблемы и помочь в ее устранении.

Пример: Просмотр логов libvirt
tail -f /var/log/libvirt/libvirtd.log

Эта команда отображает последние строки файла логов libvirt в режиме реального времени. Ищите сообщения об ошибках или предупреждениях, связанные с миграцией.

Пример: Просмотр логов QEMU
tail -f /var/log/libvirt/qemu/vm1.log

Эта команда отображает последние строки файла логов QEMU для виртуальной машины `vm1` в режиме реального времени. Ищите сообщения об ошибках или предупреждениях, связанные с запуском или миграцией виртуальной машины.