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

217 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.
---