# Demo Windows con KubeVirt: 2 NICs (Admin + Servicios), Dashboard e ISO Server Este README resume 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.net` y LB `192.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`. > **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: ```bash 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ó: ```bash 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 ``` > `virtctl` instalado en el jump host para operar VMs: ```bash virtctl version ``` --- ## 2) Dashboard (kubevirt-manager) – `kubevirt.c2et.net` **Arquitectura** * `Deployment` con `kubevirtmanager/kubevirt-manager:1.4.0`. * `Service` **ClusterIP** (`80 → 8001`). * `Ingress` clase `nginx` + **cert-manager** (`letsencrypt-prod`), host `kubevirt.c2et.net`. * `ServiceAccount` + `ClusterRoleBinding` a `cluster-admin` (para acceso al API). **Comandos de comprobación** ```bash 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** * `PVC` en **`ceph-rbd`** (**RWO**) `iso-pvc` (p. ej. 800Gi). * `Deployment` con dos contenedores que **comparten el mismo PVC**: * `httpd:2.4` sirviendo `/usr/local/apache2/htdocs` (HTTP para CDI). * `dperson/samba` exportando `/share` (subida de imágenes desde PC). * `Service` **ClusterIP** `iso-server-http` para el Ingress. * `Service` **LoadBalancer** `iso-server-samba` con `loadBalancerIP: 192.168.0.105` (MetalLB) para `\192.168.0.105\isos`. * `Ingress` clase `nginx` en `isoserver.c2et.net` (sin forzar SSL para que CDI pueda usar HTTP si hace falta). **Uso** ```bash # 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-iso` desde `https://isoserver.c2et.net/Windows.iso` * **PVC** `winhd` (ej. 60Gi) en `ceph-rbd` (RWO). Check del import: ```bash 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`). * `virtiocontainerdisk` como **CD-ROM** con drivers VirtIO. * `harddrive` (PVC `winhd`) 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). Arranque y acceso: ```bash 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 `bootOrder` para 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`, gateway `192.168.200.1`, DNS el que uses. > **Windows 11**: si lo necesitas, activa **UEFI + TPM** y `features.smm`. --- ## 5) Comandos útiles de validación ```bash # 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** en `br-srv`. * **Samba abierto** → añade credenciales en los args del contenedor `dperson/samba` o 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 `loadBalancerIP` dentro del pool disponible. * **Windows 11 pide TPM** → habilita `tpm: {}` y boot UEFI (`firmware.bootloader.efi: {}`) + `features.smm`. --- ## 7) Limpieza ```bash # 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 `blockMigration` si tu storage no es RWX). * CPU pinning / HugePages para cargas exigentes. * `cloudbase-init` o `unattend.xml` para automatizar instalaciones. * SR-IOV para NICs de alto rendimiento en VMs. ---