Gestión de Clústeres Kubernetes con KubeVirt y Virtualización
La convergencia entre contenedores y máquinas virtuales ya no es una promesa de futuro, sino una realidad operativa. En el ecosistema SysAdmin 2025, la gestión de cargas de trabajo tradicionales (VM) junto a aplicaciones nativas de nube (contenedores) dentro de un mismo plano de control se ha convertido en una necesidad estratégica. KubeVirt emerge como la pieza clave que permite orquestar máquinas virtuales directamente sobre Kubernetes, transformando los clústeres en entornos híbridos unificados.
Este artículo desglosa las arquitecturas, prácticas y herramientas necesarias para dominar la virtualización en Kubernetes con KubeVirt, abordando desde la instalación hasta la gestión de clústeres híbridos en producción.
El Contexto: ¿Por qué KubeVirt y por qué ahora?
Tradicionalmente, las organizaciones mantenían dos infraestructuras paralelas: un clúster de virtualización (VMware, Proxmox, KVM) y un clúster de contenedores (Kubernetes). Esto generaba silos operativos, complejidad en redes y almacenamiento, y duplicación de esfuerzos en backup, monitorización y actualizaciones.
KubeVirt resuelve este dilema al extender la API de Kubernetes con recursos personalizados (CRDs) como VirtualMachine y VirtualMachineInstance. Esto permite gestionar VM con los mismos comandos kubectl, las mismas políticas de red (CNI) y el mismo almacenamiento (CSI) que los Pods.
[INFO] KubeVirt no reemplaza a KVM/Libvirt, sino que los envuelve. Cada VM se ejecuta como un Pod especial que lanza un proceso QEMU/KVM dentro de un contenedor. El hipervisor es el propio kernel de Linux del nodo.
Beneficios clave para el SysAdmin 2025
- Unificación del plano de control: Un solo clúster Kubernetes para todo.
- Migración progresiva: Puedes ejecutar VM legacy junto a microservicios modernos.
- Aprovechamiento de hardware: Mejor utilización de recursos al no tener nodos dedicados a VM.
- Operaciones declarativas: Escalado, actualizaciones y rollbacks de VM mediante YAML.
Arquitectura de KubeVirt: Componentes Esenciales
Para entender cómo funciona la Kubernetes virtualización con KubeVirt, es crucial conocer sus componentes:
Componentes del Plano de Control
- Virt-Controller: Similar al controller-manager de K8s. Gestiona el ciclo de vida de las VM: creación, migración, parada.
- Virt-API: Un webhook que valida y muta los recursos
VirtualMachineyVirtualMachineInstance. - Virt-Handler: DaemonSet que se ejecuta en cada nodo worker. Configura los dispositivos KVM, las interfaces de red y los discos. Actúa como un agente local.
Componentes de Datos
- virt-launcher: El Pod que realmente ejecuta la VM. Contiene el proceso
qemu-kvmy los volúmenes necesarios. - CDI (Containerized Data Importer): Herramienta para importar, subir y clonar imágenes de disco (ISO, QCOW2, RAW) directamente a PersistentVolumeClaims (PVC).
Instalación y Configuración Inicial de KubeVirt
La instalación de KubeVirt es sorprendentemente sencilla gracias a su operador. A continuación, se muestra el proceso estándar en un clúster Kubernetes 1.28+.
1. Requisitos previos
- Clúster Kubernetes con al menos 2 nodos worker.
- Kernel de Linux con módulos KVM habilitados (
kvm_intelokvm_amd). kubectlconfigurado.- StorageClass disponible (por ejemplo,
local-path,rook-ceph,longhorn).
2. Instalación mediante el operador KubeVirt
# Desplegar el operador
export KUBEVIRT_VERSION=$(curl -s https://api.github.com/repos/kubevirt/kubevirt/releases/latest | grep tag_name | cut -d '"' -f 4)
kubectl create -f https://github.com/kubevirt/kubevirt/releases/download/${KUBEVIRT_VERSION}/kubevirt-operator.yaml
# Desplegar los CRDs y el controlador
kubectl create -f https://github.com/kubevirt/kubevirt/releases/download/${KUBEVIRT_VERSION}/kubevirt-cr.yaml
# Verificar que todos los pods estén running
kubectl get pods -n kubevirt
[TIP] Si tu clúster no tiene soporte de hardware KVM (por ejemplo, en entornos cloud sin anidación), puedes habilitar el emulador software con
kubectl patch kubevirt kubevirt -n kubevirt --type merge -p '{"spec":{"configuration":{"developerConfiguration":{"useEmulation":true}}}}'. Esto degrada el rendimiento, pero permite pruebas.
3. Instalar CDI (Containerized Data Importer)
CDI es casi obligatorio para gestionar discos de VM.
export CDI_VERSION=$(curl -s https://api.github.com/repos/kubevirt/containerized-data-importer/releases/latest | grep tag_name | cut -d '"' -f 4)
kubectl create -f https://github.com/kubevirt/containerized-data-importer/releases/download/${CDI_VERSION}/cdi-operator.yaml
kubectl create -f https://github.com/kubevirt/containerized-data-importer/releases/download/${CDI_VERSION}/cdi-cr.yaml
Gestión de Máquinas Virtuales en K8s: Ciclo de Vida
Una vez instalado, gestionar VM en K8s es cuestión de crear manifiestos YAML. Veamos un ejemplo completo de una VM Linux simple.
Manifiesto básico de VirtualMachine
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
name: ubuntu-vm
spec:
running: true
template:
spec:
domain:
cpu:
cores: 2
memory:
guest: 4Gi
devices:
disks:
- name: rootdisk
disk:
bus: virtio
interfaces:
- name: default
bridge: {}
networks:
- name: default
pod: {} # Usa la red del Pod (CNI)
volumes:
- name: rootdisk
containerDisk:
image: quay.io/kubevirt/cirros-container-disk-demo:latest
Aplicar con:
kubectl apply -f ubuntu-vm.yaml
Comandos esenciales para el SysAdmin
# Listar todas las VM
kubectl get vm
# Ver el estado detallado de una VM
kubectl describe vm ubuntu-vm
# Acceder a la consola VNC (necesita virtctl)
virtctl console ubuntu-vm
# Apagar una VM
kubectl patch vm ubuntu-vm --type merge -p '{"spec":{"running":false}}'
# Migración en vivo (Live Migration)
kubectl patch vm ubuntu-vm --type merge -p '{"spec":{"template":{"spec":{"evictionStrategy":"LiveMigrate"}}}}'
[WARNING] La migración en vivo solo funciona si las VM utilizan almacenamiento compartido (NFS, Ceph, GlusterFS) y la CPU de los nodos es compatible (misma familia Intel/AMD). No funciona con discos locales.
Clústeres Híbridos: Integrando VM y Contenedores
El verdadero poder de KubeVirt radica en la creación de clústeres híbridos donde VM y Pods conviven y se comunican de forma nativa.
Redes avanzadas para VM
Las VM pueden conectarse a las mismas redes que los Pods usando distintos tipos de interfaces:
bridge(predeterminado): La VM obtiene una IP del rango del Pod (overlay de la CNI, como Flannel, Calico o Cilium). Ideal para comunicación directa con microservicios.masquerade: Similar a NAT. La VM usa una IP privada interna y el tráfico se enmascara. Más aislada.sriov: Asigna una VF (Virtual Function) directamente a la VM. Alto rendimiento, usado en NFV o telecomunicaciones.
Ejemplo de VM conectada a una red definida por el usuario (Multus):
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
name: vm-multus
spec:
template:
spec:
networks:
- name: default
pod: {}
- name: vlan-red
multus:
networkName: vlan-red-ns/vlan-red-attachdef
domain:
devices:
interfaces:
- name: default
bridge: {}
- name: vlan-red
bridge: {}
Almacenamiento compartido y persistencia
El almacenamiento es el punto más crítico. KubeVirt se integra con CSI (Container Storage Interface). Las opciones recomendadas para producción son:
- Rook/Ceph: Bloque y sistema de archivos. Soporta snapshots y clonación.
- Longhorn: Almacenamiento distribuido para Kubernetes. Excelente para entornos pequeños.
- NFS/CIFS: Sencillo pero con menor rendimiento.
Para importar una imagen ISO existente a un PVC:
apiVersion: cdi.kubevirt.io/v1beta1
kind: DataVolume
metadata:
name: ubuntu-server-dv
spec:
source:
http:
url: "http://releases.ubuntu.com/22.04/ubuntu-22.04.3-live-server-amd64.iso"
pvc:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
Herramientas de Gestión y Monitorización para SysAdmin 2025
Gestionar Kubernetes virtualización a escala requiere herramientas específicas.
Virtctl: La navaja suiza
virtctl es el CLI complementario para operaciones que no son puramente declarativas.
# Subir un archivo a la VM
virtctl scp ubuntu-vm ./script.sh:/tmp/
# Tomar un snapshot
virtctl vmexport create my-export --vm=ubuntu-vm --format=qcow2
# Conectar un CD-ROM virtual
virtctl addvolume ubuntu-vm --volume-name=extra-iso --serial=CDROM
Monitorización con Prometheus y Grafana
KubeVirt expone métricas estándar de Prometheus en el endpoint /metrics de los componentes virt-handler y virt-controller. Las métricas clave son:
kubevirt_vmi_cpu_usage_seconds_totalkubevirt_vmi_memory_available_byteskubevirt_vmi_network_receive_bytes_totalkubevirt_vmi_storage_iops_total
Puedes utilizar el dashboard oficial de KubeVirt para Grafana (ID 14005 en Grafana.com) para visualizar el estado de todas las VM.
Backup y Disaster Recovery
El backup de VM en K8s es complejo porque implica tanto el estado del objeto VirtualMachine como el contenido del PVC. Herramientas recomendadas:
- Velero: Backup de objetos K8s + snapshots de PVC (con plugin CSI).
- KubeVirt's VM Export: Exporta la VM completa a un formato portable (QCOW2/RAW).
- Longhorn Backup: Si usas Longhorn, puedes hacer backup a S3 directamente de los volúmenes.
Casos de Uso Reales y Consideraciones de Producción
Migración de VMware a KubeVirt
Muchas empresas están migrando desde VMware vSphere a KubeVirt para reducir costes de licencias y simplificar la pila tecnológica. El proceso típico:
- Exportar VM desde VMware en formato OVF/OVA.
- Convertir a QCOW2 usando
qemu-img convert -f vmdk -O qcow2. - Subir la imagen a un PVC mediante CDI.
- Crear el manifiesto VirtualMachine ajustando recursos y redes.
[WARNING] La migración en caliente (sin downtime) desde VMware no es directa. Se requiere una ventana de mantenimiento o usar herramientas de replicación a nivel de bloque (como DRBD o sanoid).
Alta disponibilidad de VM
KubeVirt soporta Live Migration nativa, pero para entornos críticos se recomienda:
- Usar
evictionStrategy: LiveMigratepara que las VM se muevan automáticamente durante el mantenimiento de nodos. - Configurar
runStrategy: Alwayspara que el controlador reinicie la VM si falla. - Combinar con Pod Disruption Budgets (PDB) para evitar migraciones masivas.
Rendimiento y tuning
- CPU Pinning: Para cargas de trabajo sensibles a la latencia, puedes asignar CPUs dedicadas a la VM mediante
dedicatedCpuPlacement: true. - HugePages: Mejora el rendimiento de memoria. Configurar en la VM:
memory.hugepages.pageSize: "2Mi". - NUMA: Para servidores con múltiples sockets, KubeVirt puede alinear la VM con el nodo NUMA correcto.
El Futuro: SysAdmin 2025 y la Virtualización Nativa
A medida que Kubernetes se convierte en el sistema operativo del centro de datos, herramientas como KubeVirt están redefiniendo el rol del SysAdmin. En 2025, ya no se pregunta "¿contenedor o VM?", sino "¿cómo orquesto ambas de forma unificada?".
KubeVirt ha madurado hasta el punto de ser considerado estable para cargas de trabajo de producción, con empresas como Red Hat, NVIDIA y SAP integrándolo en sus plataformas. La capacidad de gestionar clústeres híbridos desde una sola API reduce la fricción operativa y acelera la modernización de aplicaciones legacy.
[TIP] Para empezar, no intentes migrar todo de golpe. Identifica un puñado de VM no críticas (servidores de desarrollo, bases de datos pequeñas) y pruébalas en KubeVirt durante un mes. Mide el rendimiento, la estabilidad y la facilidad de backup. Luego escala.
La virtualización en Kubernetes no es una moda pasajera; es la evolución lógica hacia una infraestructura donde el hardware se abstrae por completo y el software define el centro de datos. KubeVirt te da las herramientas para liderar ese cambio.
