añadida maquina virtua de ejemplo

This commit is contained in:
2025-08-14 18:07:03 +02:00
parent e045d2a64f
commit b49a844b27
5 changed files with 335 additions and 0 deletions

View File

@@ -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

View File

@@ -0,0 +1,6 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- namespace.yaml
- data-volume.yaml
- virtual-machine.yaml

View File

@@ -0,0 +1,4 @@
apiVersion: v1
kind: Namespace
metadata:
name: k8s-vm-windows-demo

216
vm-windows-demo/readme.md Normal file
View File

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

View File

@@ -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