Demo Windows con KubeVirt: 2 NICs (Admin + Servicios), Dashboard e ISO Server
Este README resume qué hemos hecho y cómo lo hemos montado para una demo funcional sobre SUSE + Kubernetes con KubeVirt:
-
Instalación/verificación de KubeVirt + CDI.
-
Despliegue del dashboard (kubevirt-manager) en
kubevirt.c2et.net. -
Despliegue de un ISO Server (HTTP + Samba) en
isoserver.c2et.nety LB192.168.0.105. -
Creación de una VM Windows con dos interfaces:
- Admin (pod network via Flannel) con
masquerade. - Servicios (Multus) asociada a tu NAD
default/br-srv.
- Admin (pod network via Flannel) con
Redes clave
- Admin (Flannel): conectividad básica, DHCP interno del pod network, sin NAD.
- Servicios (Multus):
default/br-srv(bridge + host-local IPAM 192.168.200.0/22). Aquí no hay DHCP: se configura IP estática en la VM.
0) Requisitos comprobados
En todos los nodos:
egrep -o 'vmx|svm' /proc/cpuinfo | wc -l # > 0
sudo modprobe kvm && sudo modprobe kvm_intel # (o kvm_amd)
ls -l /dev/kvm
sudo aa-status | head -n 5
# containerd con SystemdCgroup=true; kubelet con cgroupDriver: systemd
1) KubeVirt + CDI
Se instalaron KubeVirt y CDI (Containerized Data Importer) y se verificó:
kubectl -n kubevirt get kv kubevirt -o jsonpath='{.status.phase}'; echo # Deployed
kubectl -n kubevirt get pods | egrep 'virt-|kubevirt-'
kubectl -n cdi get pods
virtctlinstalado en el jump host para operar VMs:
virtctl version
2) Dashboard (kubevirt-manager) – kubevirt.c2et.net
Arquitectura
Deploymentconkubevirtmanager/kubevirt-manager:1.4.0.ServiceClusterIP (80 → 8001).Ingressclasenginx+ cert-manager (letsencrypt-prod), hostkubevirt.c2et.net.ServiceAccount+ClusterRoleBindingacluster-admin(para acceso al API).
Comandos de comprobación
kubectl -n kubevirt get deploy,svc,ingress | grep kubevirt-manager
kubectl -n kubevirt get endpoints kubevirt-manager
Acceso: https://kubevirt.c2et.net/
3) ISO Server – isoserver.c2et.net (HTTP) + Samba 192.168.0.105
Arquitectura
-
PVCenceph-rbd(RWO)iso-pvc(p. ej. 800Gi). -
Deploymentcon dos contenedores que comparten el mismo PVC:httpd:2.4sirviendo/usr/local/apache2/htdocs(HTTP para CDI).dperson/sambaexportando/share(subida de imágenes desde PC).
-
ServiceClusterIPiso-server-httppara el Ingress. -
ServiceLoadBalanceriso-server-sambaconloadBalancerIP: 192.168.0.105(MetalLB) para\192.168.0.105\isos. -
Ingressclasenginxenisoserver.c2et.net(sin forzar SSL para que CDI pueda usar HTTP si hace falta).
Uso
# Subir imagen por Samba
# Windows: \\192.168.0.105\isos
# Linux:
sudo mount -t cifs //192.168.0.105/isos /mnt/isos -o guest,vers=3.0
cp ./Windows.iso /mnt/isos/
# Ver por HTTP
curl -I http://isoserver.c2et.net/Windows.iso
4) Demo VM Windows – 2 NICs (Admin + Servicios)
Manifests (kustomize):
k8s-vm-windows-demo/
├─ kustomization.yaml
├─ namespace.yaml
├─ data-volume.yaml # DV que descarga la ISO de Windows
└─ virtual-machine.yaml # VM con 2 NICs y 3 discos (ISO, VirtIO, rootdisk)
4.1 DataVolume + PVC del disco
- DataVolume
windows-isodesdehttps://isoserver.c2et.net/Windows.iso(ohttp://si hay problemas de CA). - PVC
winhd(ej. 60Gi) enceph-rbd(RWO).
Check del import:
kubectl -n k8s-vm-windows-demo get dv,pvc
kubectl -n cdi get pods -w # importer hasta Succeeded
4.2 VirtualMachine (puntos clave)
-
runStrategy: Manual → arranque con
virtctl start. -
Discos:
cdromiso(ISO Windows) como CD-ROM (readonly,bootOrder: 1).virtiocontainerdiskcomo CD-ROM con drivers VirtIO.harddrive(PVCwinhd) como disco del sistema (virtio,bootOrder: 2).
-
Red:
- admin →
pod:{}+masquerade:{}+model: e1000e(funciona OOTB en Windows). - servicios →
multus: default/br-srv+bridge:{}+model: virtio(requiere drivers en Windows).
- admin →
Arranque y acceso:
virtctl start -n k8s-vm-windows-demo windows-demo
virtctl vnc -n k8s-vm-windows-demo windows-demo
# (o usar el dashboard)
Instalación:
- Si el instalador no ve el disco: Load driver →
viostor. - Para la NIC de servicios (virtio): driver
NetKVM.
Post-instalación:
-
Retira el CD o ajusta
bootOrderpara que arranque del disco. -
Configura IP estática en la NIC servicios (no hay DHCP con host-local IPAM):
- Ej.:
192.168.200.110/22, gateway192.168.200.1, DNS el que uses.
- Ej.:
Windows 11: si lo necesitas, activa UEFI + TPM y
features.smm.
5) Comandos útiles de validación
# KubeVirt/CDI
kubectl -n kubevirt get kv kubevirt -o jsonpath='{.status.phase}'; echo
kubectl -n kubevirt get deploy,ds,pods | egrep 'virt-|kubevirt-'
kubectl -n cdi get pods
# Dashboard
kubectl -n kubevirt get ingress kubevirt-manager
kubectl -n kubevirt get endpoints kubevirt-manager
# ISO server
kubectl -n kubevirt get svc iso-server-http iso-server-samba -o wide
kubectl -n kubevirt get ingress iso-server
curl -I http://isoserver.c2et.net/
smbclient -L 192.168.0.105 -N
# Demo VM
kubectl -n k8s-vm-windows-demo get dv,pvc,vm,vmi
virtctl console -n k8s-vm-windows-demo windows-demo # si usas consola serial
virtctl vnc -n k8s-vm-windows-demo windows-demo
6) Problemas comunes y soluciones
- CDI falla con HTTPS (CA no confiable) → usa
http://isoserver.c2et.net/...o inyecta tu CA en el DV. - Sin IP en NIC de servicios → esa red usa
host-local: configura IP estática o monta un DHCP enbr-srv. - Samba abierto → añade credenciales en los args del contenedor
dperson/sambao restringe el Ingress/NetworkPolicy. - RBD (ceph-rbd) es RWO → no intentes RWX. Si necesitas RWX, usa una clase tipo CephFS.
- MetalLB asigna otra IP → verifica pools y fija
loadBalancerIPdentro del pool disponible. - Windows 11 pide TPM → habilita
tpm: {}y boot UEFI (firmware.bootloader.efi: {}) +features.smm.
7) Limpieza
# Demo
kubectl delete ns k8s-vm-windows-demo
# (opcional) Elimina DV/PVC que ya no necesites
8) Próximos pasos (ideas)
- Live migration en el CR de KubeVirt (con
blockMigrationsi tu storage no es RWX). - CPU pinning / HugePages para cargas exigentes.
cloudbase-initounattend.xmlpara automatizar instalaciones.- SR-IOV para NICs de alto rendimiento en VMs.