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: