From b49a844b275d18d11fb09476565acf40e8d0a026 Mon Sep 17 00:00:00 2001 From: xguefer Date: Thu, 14 Aug 2025 18:07:03 +0200 Subject: [PATCH] =?UTF-8?q?a=C3=B1adida=20maquina=20virtua=20de=20ejemplo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vm-windows-demo/data-volume.yaml | 31 ++++ vm-windows-demo/kustomization.yaml | 6 + vm-windows-demo/namespace.yaml | 4 + vm-windows-demo/readme.md | 216 +++++++++++++++++++++++++++ vm-windows-demo/virtual-machine.yaml | 78 ++++++++++ 5 files changed, 335 insertions(+) create mode 100644 vm-windows-demo/data-volume.yaml create mode 100644 vm-windows-demo/kustomization.yaml create mode 100644 vm-windows-demo/namespace.yaml create mode 100644 vm-windows-demo/readme.md create mode 100644 vm-windows-demo/virtual-machine.yaml diff --git a/vm-windows-demo/data-volume.yaml b/vm-windows-demo/data-volume.yaml new file mode 100644 index 0000000..a8ae4c4 --- /dev/null +++ b/vm-windows-demo/data-volume.yaml @@ -0,0 +1,31 @@ +# 1) DataVolume para la ISO de Windows (se descarga desde tu isoserver) +apiVersion: cdi.kubevirt.io/v1beta1 +kind: DataVolume +metadata: + name: windows-iso + namespace: k8s-vm-windows-demo +spec: + source: + http: + # Puedes usar https://... (si tu LE está OK); si CDI se queja de CA, cambia a http:// + url: "https://isoserver.c2et.net/Windows.iso" + pvc: + accessModes: ["ReadWriteOnce"] + resources: + requests: + storage: 6Gi + storageClassName: ceph-rbd + +--- +# 2) PVC para el disco de sistema de Windows (ajusta tamaño si quieres) +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: winhd + namespace: k8s-vm-windows-demo +spec: + accessModes: ["ReadWriteOnce"] # ceph-rbd -> RWO + resources: + requests: + storage: 60Gi + storageClassName: ceph-rbd diff --git a/vm-windows-demo/kustomization.yaml b/vm-windows-demo/kustomization.yaml new file mode 100644 index 0000000..59ceac6 --- /dev/null +++ b/vm-windows-demo/kustomization.yaml @@ -0,0 +1,6 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: + - namespace.yaml + - data-volume.yaml + - virtual-machine.yaml diff --git a/vm-windows-demo/namespace.yaml b/vm-windows-demo/namespace.yaml new file mode 100644 index 0000000..4bb4509 --- /dev/null +++ b/vm-windows-demo/namespace.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: k8s-vm-windows-demo diff --git a/vm-windows-demo/readme.md b/vm-windows-demo/readme.md new file mode 100644 index 0000000..2def3db --- /dev/null +++ b/vm-windows-demo/readme.md @@ -0,0 +1,216 @@ +# 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.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` (o `http://` si hay problemas de CA). +* **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. + +--- + diff --git a/vm-windows-demo/virtual-machine.yaml b/vm-windows-demo/virtual-machine.yaml new file mode 100644 index 0000000..8db4c27 --- /dev/null +++ b/vm-windows-demo/virtual-machine.yaml @@ -0,0 +1,78 @@ +apiVersion: kubevirt.io/v1 +kind: VirtualMachine +metadata: + name: windows-demo + namespace: k8s-vm-windows-demo +spec: + runStrategy: Manual # la arrancas tú con "virtctl start windows-demo" + template: + metadata: + labels: + kubevirt.io/domain: windows-demo + spec: + # --- REDES --- + # NIC #1 (admin): pod network (Flannel) con NAT (masquerade). No necesita NAD. + # NIC #2 (servicios): tu NAD Multus "default/br-srv" + networks: + - name: admin + pod: {} + - name: servicios + multus: + networkName: default/br-srv + + domain: + machine: + type: q35 + cpu: + cores: 2 + resources: + requests: + memory: 4Gi + devices: + # Interfaces de red + interfaces: + # Para que Windows tenga red "out of the box" en la NIC de admin, + # ponemos e1000e. (Luego puedes cambiar a virtio para rendimiento) + - name: admin + masquerade: {} + model: e1000e + # En servicios dejamos virtio (requerirá instalar los drivers VirtIO) + - name: servicios + bridge: {} + model: virtio + + # Discos + disks: + # 1) ISO de Windows como CD-ROM y primer boot + - name: cdromiso + cdrom: + bus: sata + readonly: true + bootOrder: 1 + + # 2) Drivers VirtIO para Windows como CD-ROM + - name: virtiocontainerdisk + cdrom: + bus: sata + readonly: true + + # 3) Disco del sistema (virtio) como segundo boot + - name: harddrive + disk: + bus: virtio + bootOrder: 2 + + volumes: + - name: cdromiso + dataVolume: + name: windows-iso + - name: harddrive + persistentVolumeClaim: + claimName: winhd + - name: virtiocontainerdisk + # ISO de drivers VirtIO empaquetada como containerDisk + # (si lo prefieres, puedes servir un virtio-win.iso tuyo desde el isoserver) + containerDisk: + image: kubevirt/virtio-container-disk + # alternativa habitual: + # image: quay.io/kubevirt/virtio-container-disk