From bf2e26a8bf9a226d39ade993deb0099b6fef704b Mon Sep 17 00:00:00 2001 From: Xavor Date: Sun, 31 Aug 2025 13:44:21 +0200 Subject: [PATCH] =?UTF-8?q?a=C3=B1adiendo=20maquinas=20virtuales?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kubevirt/deployments/isoserver.yaml | 14 +- readme.md | 2 +- vm-windows-demo/kustomization.yaml | 2 + vm-windows-demo/nad-br-admin.yaml | 17 +++ vm-windows-demo/nad-br-srv.yaml | 17 +++ vm-windows-demo/namespace.yaml | 2 +- vm-windows-demo/readme.md.save | 216 --------------------------- vm-windows-demo/virtual-machine.yaml | 20 +-- 8 files changed, 57 insertions(+), 233 deletions(-) create mode 100644 vm-windows-demo/nad-br-admin.yaml create mode 100644 vm-windows-demo/nad-br-srv.yaml delete mode 100644 vm-windows-demo/readme.md.save diff --git a/kubevirt/deployments/isoserver.yaml b/kubevirt/deployments/isoserver.yaml index c4f5f89..d1940fe 100644 --- a/kubevirt/deployments/isoserver.yaml +++ b/kubevirt/deployments/isoserver.yaml @@ -13,6 +13,17 @@ spec: labels: app: iso-server spec: + initContainers: + - name: init-dirs + image: alpine:latest + command: ["sh","-lc"] + args: + - | + mkdir -p /share/isos + chmod 755 /share/isos + volumeMounts: + - name: iso-storage + mountPath: /share containers: - name: httpd image: httpd:2.4 @@ -21,6 +32,7 @@ spec: volumeMounts: - name: iso-storage mountPath: /usr/local/apache2/htdocs + subPath: isos readinessProbe: httpGet: path: / @@ -36,7 +48,7 @@ spec: - name: samba image: dperson/samba - args: ["-p", "-s", "isos;/share;yes;no"] + args: ["-p", "-s", "isos;/share/isos;yes;no"] ports: - containerPort: 445 securityContext: diff --git a/readme.md b/readme.md index 83f9c33..ed245ea 100644 --- a/readme.md +++ b/readme.md @@ -164,7 +164,7 @@ Este repositorio contiene los **manifiestos, scripts y documentación** para des | `Harbor` | ✅ Completado | Funcionando | [https://harbor.c2et.net](https://harbor.c2et.net) | | | `Guacamole` | ✅ Completado | Funcionando | [https://heimdall.c2et.net](https://heimdall.c2et.net) | guacadmin / guacadmin | | `VSCode` | ✅ Completado | Funcionando | [https://vscode.c2et.net](https://vscode.c2et.net) | Pozuelo12345 | -| `Tileserver-GL` | | Funcionando | [https://mapas.c2et.net](https://mapas.c2et.net) | | +| `Tileserver-GL` | ✅ Completado | Funcionando | [https://mapas.c2et.net](https://mapas.c2et.net) | | | `External` | ✅ Completado | Funcionando | [https://admin.firewall.c2et.net](https://admin.firewall.c2et.net)
[https://admin.powervault1.c2et.net](https://admin.powervault1.c2et.net)
[https://admin.powervault2.c2et.net](https://admin.powervault2.c2et.net) | | | `Argos Core` | ✅ Completado | Funcionando | [https://argos.panel.c2et.net/](https://argos.panel.c2et.net) | | | `Velero` | ✅ Completado | Funcionando | | | diff --git a/vm-windows-demo/kustomization.yaml b/vm-windows-demo/kustomization.yaml index 59ceac6..4795d04 100644 --- a/vm-windows-demo/kustomization.yaml +++ b/vm-windows-demo/kustomization.yaml @@ -4,3 +4,5 @@ resources: - namespace.yaml - data-volume.yaml - virtual-machine.yaml + - nad-br-admin.yaml + - nad-br-srv.yaml \ No newline at end of file diff --git a/vm-windows-demo/nad-br-admin.yaml b/vm-windows-demo/nad-br-admin.yaml new file mode 100644 index 0000000..8331b1e --- /dev/null +++ b/vm-windows-demo/nad-br-admin.yaml @@ -0,0 +1,17 @@ +apiVersion: "k8s.cni.cncf.io/v1" +kind: NetworkAttachmentDefinition +metadata: + name: br-admin + namespace: windows-demo +spec: + config: '{ + "cniVersion": "0.3.1", + "type": "bridge", + "bridge": "br-admin", + "ipam": { + "type": "host-local", + "subnet": "192.168.200.0/22", + "rangeStart": "192.168.0.200", + "rangeEnd": "192.168.0.210" + } + }' diff --git a/vm-windows-demo/nad-br-srv.yaml b/vm-windows-demo/nad-br-srv.yaml new file mode 100644 index 0000000..1355a9e --- /dev/null +++ b/vm-windows-demo/nad-br-srv.yaml @@ -0,0 +1,17 @@ +apiVersion: "k8s.cni.cncf.io/v1" +kind: NetworkAttachmentDefinition +metadata: + name: br-srv + namespace: windows-demo +spec: + config: '{ + "cniVersion": "0.3.1", + "type": "bridge", + "bridge": "br-srv", + "ipam": { + "type": "host-local", + "subnet": "192.168.200.0/22", + "rangeStart": "192.168.200.100", + "rangeEnd": "192.168.200.200" + } + }' diff --git a/vm-windows-demo/namespace.yaml b/vm-windows-demo/namespace.yaml index 4bb4509..cb36368 100644 --- a/vm-windows-demo/namespace.yaml +++ b/vm-windows-demo/namespace.yaml @@ -1,4 +1,4 @@ apiVersion: v1 kind: Namespace metadata: - name: k8s-vm-windows-demo + name: windows-demo diff --git a/vm-windows-demo/readme.md.save b/vm-windows-demo/readme.md.save deleted file mode 100644 index 2def3db..0000000 --- a/vm-windows-demo/readme.md.save +++ /dev/null @@ -1,216 +0,0 @@ -# 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 index 8db4c27..3b11935 100644 --- a/vm-windows-demo/virtual-machine.yaml +++ b/vm-windows-demo/virtual-machine.yaml @@ -2,24 +2,21 @@ apiVersion: kubevirt.io/v1 kind: VirtualMachine metadata: name: windows-demo - namespace: k8s-vm-windows-demo + namespace: windows-demo spec: - runStrategy: Manual # la arrancas tú con "virtctl start windows-demo" + runStrategy: Manual 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: {} + multus: + networkName: default/br-admin - name: servicios multus: networkName: default/br-srv - domain: machine: type: q35 @@ -29,14 +26,11 @@ spec: requests: memory: 4Gi devices: - # Interfaces de red + autoattachPodInterface: false 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) + model: virtio - name: servicios bridge: {} model: virtio @@ -70,8 +64,6 @@ spec: 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: