Cómo migrar máquinas virtuales entre hosts: migración de VMs en ejecución en KVM

La migración de máquinas virtuales entre hosts es una operación crítica para garantizar la alta disponibilidad, el balanceo de carga y el mantenimiento de la infraestructura. En este artículo, exploraremos en detalle la migración en vivo (live migration) en un entorno KVM (Kernel-based Step-by-Step Guide" class="internal-post-link">Virtual Machine). Estudiaremos los requisitos previos, las herramientas y las instrucciones paso a paso para que pueda transferir máquinas virtuales de forma segura y eficiente entre sus hosts sin interrumpir su funcionamiento. Aprenderá a configurar la red, verificar la compatibilidad y realizar la migración mediante la línea de comandos y las herramientas gráficas.

Contenido:

Preparación para la migración

Cómo migrar máquinas virtuales entre hosts? - Steps for preparing for live migration, including shared storage setup and user permissions.

Antes de comenzar a migrar una máquina virtual, es necesario realizar una serie de pasos preparatorios para garantizar una transferencia exitosa e ininterrumpida. Los aspectos clave de la preparación incluyen la verificación de los recursos, la configuración del almacenamiento compartido (si es necesario) y la configuración de los permisos de acceso. Una preparación adecuada minimiza el riesgo de problemas durante la migración y garantiza un tiempo de inactividad mínimo para su máquina virtual.

VPS Hosting

Virtual servers with guaranteed resources

Choose VPS

Verificación de la disponibilidad de recursos

Asegúrese de que el host de destino tenga suficientes recursos (CPU, RAM, espacio en disco) para alojar la máquina virtual. La falta de recursos puede provocar problemas de rendimiento o incluso fallas en la migración. Compruebe la carga de la CPU, el uso de la memoria y el espacio libre en disco en ambos hosts.

Ejemplo: Verificación del uso de recursos con el comando top
top -b -n 1 | head -n 5

Este comando muestra las primeras 5 líneas de la salida de top, mostrando la carga total de la CPU, el uso de la memoria y otras métricas importantes. El parámetro `-b` ejecuta top en modo batch, y `-n 1` especifica que solo se debe ejecutar una iteración. Esto es útil para la automatización y los scripts.

Ejemplo: Verificación del espacio libre en disco con el comando df
df -h /var/lib/libvirt/images

Este comando muestra el uso del espacio en disco para el directorio `/var/lib/libvirt/images`, donde normalmente se almacenan las imágenes de las máquinas virtuales. La opción `-h` hace que la salida sea más legible, mostrando los tamaños en un formato legible por humanos (por ejemplo, GB, MB). Asegúrese de que el host de destino tenga suficiente espacio libre para almacenar los discos de la máquina virtual.

Configuración del almacenamiento compartido (si es necesario)

Si utiliza almacenamiento compartido (por ejemplo, NFS, iSCSI), asegúrese de que esté disponible y configurado correctamente en ambos hosts. El almacenamiento compartido simplifica la migración, ya que la máquina virtual continúa utilizando los mismos discos, independientemente del host en el que se esté ejecutando.

Ejemplo: Montaje de un recurso compartido NFS
mount -t nfs 192.168.1.10:/exports/vm_images /var/lib/libvirt/images

Este comando monta un recurso compartido NFS con la dirección IP 192.168.1.10 y la ruta `/exports/vm_images` en el directorio `/var/lib/libvirt/images` en el host local. Para que el montaje sea permanente, añada la entrada correspondiente al archivo `/etc/fstab`.

Ejemplo: Adición de una entrada a /etc/fstab
echo "192.168.1.10:/exports/vm_images /var/lib/libvirt/images nfs defaults 0 0" >> /etc/fstab

Este comando añade una línea al archivo `/etc/fstab`, que indica cómo montar el recurso compartido NFS al arrancar el sistema. La opción `defaults` utiliza los parámetros de montaje estándar, y `0 0` desactiva la copia de seguridad y la comprobación del sistema de archivos.

Configuración de los permisos de acceso

Asegúrese de que el usuario que realiza la migración tenga los permisos de acceso necesarios en ambos hosts. Normalmente, este es el usuario root o un usuario que pertenece al grupo libvirt. Los permisos de acceso insuficientes pueden provocar errores al intentar conectarse al host o administrar las máquinas virtuales.

Ejemplo: Adición de un usuario al grupo libvirt
usermod -a -G libvirt your_username

Este comando añade el usuario `your_username` al grupo `libvirt`. Después de ejecutar el comando, debe cerrar la sesión y volver a iniciarla para que los cambios surtan efecto.

Ejemplo: Verificación de la pertenencia al grupo
groups your_username

Este comando muestra la lista de grupos a los que pertenece el usuario `your_username`. Asegúrese de que el grupo `libvirt` esté presente en la lista.

Configuración de la red para la migración

Cómo migrar máquinas virtuales entre hosts? - Diagram showing network configuration for live migration, including a dedicated migration network.

La configuración correcta de la red es fundamental para una migración exitosa. Se recomienda utilizar una red dedicada para el tráfico de migración para evitar la sobrecarga de la red principal y garantizar una transferencia de datos estable y rápida. En esta sección, analizaremos la configuración de una red dedicada, la configuración de DNS y el firewall.

Configuración de una red dedicada

Cree una red virtual separada (por ejemplo, VLAN) o una red física diseñada exclusivamente para el tráfico de migración. Asigne a cada host direcciones IP en esta red y asegúrese de que puedan comunicarse entre sí. El uso de una red dedicada mejora la seguridad y el rendimiento de la migración.

Ejemplo: Configuración de direcciones IP en las interfaces
# Host 1
ip addr add 192.168.10.1/24 dev eth1
ip link set eth1 up

# Host 2
ip addr add 192.168.10.2/24 dev eth1
ip link set eth1 up

Estos comandos asignan las direcciones IP 192.168.10.1 y 192.168.10.2 a la interfaz eth1 en los hosts 1 y 2 respectivamente. Asegúrese de que la interfaz eth1 esté conectada a la red de migración dedicada. El comando `ip link set eth1 up` activa la interfaz.

Ejemplo: Verificación de la comunicación entre los hosts
ping 192.168.10.2

Este comando comprueba la comunicación entre el host 1 y el host 2 a través de la red dedicada. Asegúrese de que los pings se realicen correctamente.

Configuración de DNS

Asegúrese de que los nombres de los hosts se resuelvan correctamente en las direcciones IP de la red dedicada. Esto se puede hacer añadiendo entradas al archivo `/etc/hosts` en ambos hosts o configurando un servidor DNS. La resolución de nombres correcta simplifica el proceso de migración y lo hace más fiable.

Ejemplo: Adición de entradas a /etc/hosts
# Host 1 y Host 2
echo "192.168.10.1 host1.example.com host1" >> /etc/hosts
echo "192.168.10.2 host2.example.com host2" >> /etc/hosts

Estos comandos añaden entradas al archivo `/etc/hosts`, asociando las direcciones IP de la red dedicada con los nombres de los hosts. Reemplace `host1.example.com` y `host2.example.com` con los nombres de dominio completos de sus hosts, y `host1` y `host2` con los nombres cortos de los hosts.

Ejemplo: Verificación de la resolución de nombres
ping host2

Este comando comprueba si el nombre de host `host2` se resuelve correctamente en la dirección IP 192.168.10.2. Asegúrese de que los pings se realicen correctamente.

Configuración del firewall

Configure el firewall en ambos hosts para permitir el tráfico necesario para la migración. Normalmente, estos son los puertos utilizados por libvirt (por ejemplo, TCP 16509). Un firewall mal configurado puede bloquear el tráfico de migración y provocar fallos.

Ejemplo: Permitir el tráfico de libvirt con firewalld
# Host 1 y Host 2
firewall-cmd --permanent --add-port=16509/tcp
firewall-cmd --reload

Estos comandos añaden una regla a firewalld, permitiendo el tráfico TCP en el puerto 16509. La opción `—permanent` hace que la regla sea permanente, y `—reload` recarga el firewall para aplicar los cambios.

Ejemplo: Verificación de las reglas del firewall
firewall-cmd --list-all

Este comando muestra una lista de todas las reglas configuradas en firewalld. Asegúrese de que la regla que permite el tráfico TCP en el puerto 16509 esté presente en la lista.

Verificación de la compatibilidad de los hosts

Para una migración exitosa, es fundamental que los hosts de origen y de destino sean compatibles. Esto incluye la verificación de la compatibilidad de la CPU, las versiones de libvirt y QEMU. La incompatibilidad puede provocar fallos en la migración o un funcionamiento inestable de la máquina virtual después de la migración. En esta sección, veremos cómo verificar la compatibilidad con virsh y otras herramientas.

Verificación de la compatibilidad de la CPU

Los diferentes modelos de CPU pueden tener diferentes conjuntos de instrucciones, lo que puede provocar problemas durante la migración. Utilice virsh capabilities para comparar las capacidades de la CPU de los hosts de origen y de destino. Si las CPU son incompatibles, puede utilizar la opción --cpu-model durante la migración para especificar un modelo de CPU común compatible con ambos hosts.

Ejemplo: Obtención de información de la CPU con virsh capabilities
virsh capabilities | grep -A 20 'cpu>'

Este comando muestra información sobre la CPU utilizando el comando `virsh capabilities` y filtra la salida para mostrar solo la sección que comienza con la etiqueta ``. El parámetro `-A 20` especifica que se deben mostrar 20 líneas después de la línea encontrada.

Ejemplo: Migración con especificación del modelo de CPU
virsh migrate --live vm1 qemu+ssh://host2.example.com/system --cpu-model core2duo

Este comando realiza una migración en vivo de la máquina virtual `vm1` al host `host2.example.com` y especifica que se debe utilizar el modelo de CPU `core2duo`. Esta opción puede ser necesaria si las CPU de los hosts de origen y de destino no son completamente compatibles. Reemplace `core2duo` con un modelo de CPU compatible con ambos hosts.

Verificación de las versiones de libvirt y QEMU

Asegúrese de que las versiones de libvirt y QEMU en los hosts de origen y de destino sean compatibles. El uso de diferentes versiones puede provocar problemas con la administración de las máquinas virtuales y fallos en la migración. Se recomienda utilizar versiones iguales o cercanas de libvirt y QEMU en todos los hosts.

Ejemplo: Verificación de la versión de libvirt
virsh version

Este comando muestra información sobre la versión de libvirt y el hipervisor utilizado (por ejemplo, QEMU). Compruebe la versión de libvirt en ambos hosts y asegúrese de que sean compatibles.

Ejemplo: Verificación de la versión de QEMU
qemu-system-x86_64 --version

Este comando muestra información sobre la versión de QEMU. Compruebe la versión de QEMU en ambos hosts y asegúrese de que sean compatibles.

Verificación de la configuración de la máquina virtual

Compruebe la configuración de la máquina virtual (por ejemplo, el número de vCPU, la cantidad de memoria, las interfaces de red) para asegurarse de que el host de destino la admita. La incompatibilidad en la configuración puede provocar problemas al iniciar la máquina virtual después de la migración.

Ejemplo: Obtención de información sobre la máquina virtual con virsh
virsh dominfo vm1

Este comando muestra información sobre la máquina virtual `vm1`, incluido el ID, el nombre, el estado, el número de vCPU, la cantidad de memoria y otros parámetros. Compare esta información con los recursos del host de destino.

Ejemplo: Obtención de la configuración XML de la máquina virtual
virsh dumpxml vm1

Este comando muestra la configuración XML de la máquina virtual `vm1`. Puede utilizar esta información para un análisis más detallado de la configuración y la verificación de la compatibilidad con el host de destino.

Realización de la migración con virsh

virsh es una potente herramienta de línea de comandos para administrar máquinas virtuales en un entorno KVM. Proporciona amplias capacidades para la migración, incluida la migración en vivo, que permite mover máquinas virtuales entre hosts sin interrumpir su funcionamiento. En esta sección, veremos en detalle cómo realizar la migración con virsh, y también veremos varias opciones y ejemplos.

Comandos básicos para la migración

El comando principal para migrar máquinas virtuales con virsh es virsh migrate. Acepta varias opciones que le permiten configurar el proceso de migración de acuerdo con sus necesidades. A continuación se muestran las opciones principales:

  • --live: Realiza la migración en vivo, es decir, mueve la máquina virtual sin interrumpir su funcionamiento.
  • --copy-storage: Copia el almacenamiento de la máquina virtual al host de destino.
  • --persistent: Hace que la configuración de la máquina virtual sea permanente en el host de destino.
  • --auto-converge: Activa la convergencia automática para reducir el tiempo de inactividad.
  • --cpu-model: Especifica el modelo de CPU para usar en el host de destino (consulte la sección anterior).
Ejemplo: Migración en vivo con opciones mínimas
virsh migrate --live vm1 qemu+ssh://host2.example.com/system

Este comando realiza una migración en vivo de la máquina virtual `vm1` al host `host2.example.com`. Utiliza el protocolo SSH para conectarse al host de destino. Asegúrese de que el usuario que ejecuta el comando tenga permisos de acceso en el host de destino.

Migración con almacenamiento compartido

Si la máquina virtual utiliza almacenamiento compartido, la migración se vuelve más sencilla, ya que no es necesario copiar los discos de la máquina virtual. En este caso, el comando de migración se puede simplificar.

Ejemplo: Migración en vivo con almacenamiento compartido
virsh migrate --live vm1 qemu+ssh://host2.example.com/system

Este comando realiza una migración en vivo de la máquina virtual `vm1` al host `host2.example.com`. Dado que se utiliza almacenamiento compartido, no se requiere la opción `—copy-storage`.

Migración sin almacenamiento compartido

Si la máquina virtual no utiliza almacenamiento compartido, debe copiar los discos de la máquina virtual al host de destino. Esto se puede hacer con la opción `—copy-storage` o con otros métodos, como rsync.

Ejemplo: Migración en vivo con copia del almacenamiento
virsh migrate --live --copy-storage vm1 qemu+ssh://host2.example.com/system

Este comando realiza una migración en vivo de la máquina virtual `vm1` al host `host2.example.com` y copia el almacenamiento de la máquina virtual al host de destino. Este proceso puede tardar algún tiempo, dependiendo del tamaño de los discos de la máquina virtual.

Ejemplo: Migración con el uso de rsync (método alternativo)
# En el host de origen
rsync -avz /var/lib/libvirt/images/vm1.img host2.example.com:/var/lib/libvirt/images/

# Después de completar rsync, realizar la migración
virsh migrate --live vm1 qemu+ssh://host2.example.com/system

Este ejemplo muestra cómo copiar el disco de la máquina virtual `vm1.img` al host de destino utilizando rsync antes de realizar la migración. La opción `-avz` garantiza el archivado, la copia recursiva y la compresión de los datos. Una vez finalizada la copia, ejecute el comando virsh migrate sin la opción `—copy-storage`.

Diagnóstico y solución de problemas

La migración de máquinas virtuales, especialmente la migración en vivo, puede enfrentar varios problemas. Es importante saber cómo diagnosticar y solucionar estos problemas para garantizar una transferencia exitosa de las máquinas virtuales y evitar el tiempo de inactividad. En esta sección, analizaremos los problemas más comunes y los métodos para resolverlos.

Problemas de conexión

Uno de los problemas más comunes es la imposibilidad de establecer una conexión entre los hosts de origen y de destino. Esto puede deberse a problemas con la red, el firewall o la configuración de DNS.

Ejemplo: Verificación de la conexión con ping
ping host2.example.com

Asegúrese de que los hosts puedan comunicarse entre sí a través de la red. Si los pings no se realizan correctamente, compruebe la configuración de la red, el firewall y el DNS.

Ejemplo: Verificación de las reglas del firewall
firewall-cmd --list-all

Asegúrese de que el firewall no esté bloqueando el tráfico necesario para la migración (por ejemplo, el puerto 16509 para libvirt). Añada las reglas necesarias y reinicie el firewall.

Problemas de recursos

La falta de recursos en el host de destino puede provocar un fallo en la migración. Asegúrese de que el host de destino tenga suficiente CPU, memoria y espacio en disco para alojar la máquina virtual.

Ejemplo: Verificación del uso de recursos con top
top

Compruebe la carga de la CPU y el uso de la memoria en el host de destino. Si los recursos están muy cargados, libérelos o transfiera parte de la carga a otro host.

Ejemplo: Verificación del espacio libre en disco con df
df -h

Asegúrese de que el host de destino tenga suficiente espacio libre para almacenar los discos de la máquina virtual. Si no hay suficiente espacio, aumente el tamaño de la partición o transfiera los discos a otro almacenamiento.

Problemas de compatibilidad de la CPU

La incompatibilidad de la CPU entre los hosts de origen y de destino puede provocar un fallo en la migración o un funcionamiento inestable de la máquina virtual después de la migración. Utilice la opción --cpu-model durante la migración para especificar un modelo de CPU común compatible con ambos hosts.

Ejemplo: Migración con especificación del modelo de CPU
virsh migrate --live vm1 qemu+ssh://host2.example.com/system --cpu-model core2duo

Especifique un modelo de CPU compatible con ambos hosts. Si no sabe qué modelo usar, pruebe host o kvm64.

Visualización de registros

Si la migración falla, consulte los registros de libvirt y QEMU para obtener más información sobre el error. Los registros pueden contener pistas sobre la causa del problema y ayudar a resolverlo.

Ejemplo: Visualización de registros de libvirt
tail -f /var/log/libvirt/libvirtd.log

Este comando muestra las últimas líneas del archivo de registro de libvirt en tiempo real. Busque mensajes de error o advertencias relacionados con la migración.

Ejemplo: Visualización de registros de QEMU
tail -f /var/log/libvirt/qemu/vm1.log

Este comando muestra las últimas líneas del archivo de registro de QEMU para la máquina virtual `vm1` en tiempo real. Busque mensajes de error o advertencias relacionados con el inicio o la migración de la máquina virtual.