Files
kubernetes/vm-windows-demo/readme.md
2025-08-14 18:12:32 +02:00

6.5 KiB
Raw Blame History

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:

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

virtctl instalado en el jump host para operar VMs:

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

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

# 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:

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:

    • adminpod:{} + masquerade:{} + model: e1000e (funciona OOTB en Windows).
    • serviciosmultus: default/br-srv + bridge:{} + model: virtio (requiere drivers en Windows).

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 driverviostor.
  • 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

# 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

# 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.