añadiendo maquinas virtuales
This commit is contained in:
@@ -13,6 +13,17 @@ spec:
|
|||||||
labels:
|
labels:
|
||||||
app: iso-server
|
app: iso-server
|
||||||
spec:
|
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:
|
containers:
|
||||||
- name: httpd
|
- name: httpd
|
||||||
image: httpd:2.4
|
image: httpd:2.4
|
||||||
@@ -21,6 +32,7 @@ spec:
|
|||||||
volumeMounts:
|
volumeMounts:
|
||||||
- name: iso-storage
|
- name: iso-storage
|
||||||
mountPath: /usr/local/apache2/htdocs
|
mountPath: /usr/local/apache2/htdocs
|
||||||
|
subPath: isos
|
||||||
readinessProbe:
|
readinessProbe:
|
||||||
httpGet:
|
httpGet:
|
||||||
path: /
|
path: /
|
||||||
@@ -36,7 +48,7 @@ spec:
|
|||||||
|
|
||||||
- name: samba
|
- name: samba
|
||||||
image: dperson/samba
|
image: dperson/samba
|
||||||
args: ["-p", "-s", "isos;/share;yes;no"]
|
args: ["-p", "-s", "isos;/share/isos;yes;no"]
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 445
|
- containerPort: 445
|
||||||
securityContext:
|
securityContext:
|
||||||
|
|||||||
@@ -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) | |
|
| `Harbor` | ✅ Completado | Funcionando | [https://harbor.c2et.net](https://harbor.c2et.net) | |
|
||||||
| `Guacamole` | ✅ Completado | Funcionando | [https://heimdall.c2et.net](https://heimdall.c2et.net) | guacadmin / guacadmin |
|
| `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 |
|
| `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) <br>[https://admin.powervault1.c2et.net](https://admin.powervault1.c2et.net)<br> [https://admin.powervault2.c2et.net](https://admin.powervault2.c2et.net) | |
|
| `External` | ✅ Completado | Funcionando | [https://admin.firewall.c2et.net](https://admin.firewall.c2et.net) <br>[https://admin.powervault1.c2et.net](https://admin.powervault1.c2et.net)<br> [https://admin.powervault2.c2et.net](https://admin.powervault2.c2et.net) | |
|
||||||
| `Argos Core` | ✅ Completado | Funcionando | [https://argos.panel.c2et.net/](https://argos.panel.c2et.net) | |
|
| `Argos Core` | ✅ Completado | Funcionando | [https://argos.panel.c2et.net/](https://argos.panel.c2et.net) | |
|
||||||
| `Velero` | ✅ Completado | Funcionando | | |
|
| `Velero` | ✅ Completado | Funcionando | | |
|
||||||
|
|||||||
@@ -4,3 +4,5 @@ resources:
|
|||||||
- namespace.yaml
|
- namespace.yaml
|
||||||
- data-volume.yaml
|
- data-volume.yaml
|
||||||
- virtual-machine.yaml
|
- virtual-machine.yaml
|
||||||
|
- nad-br-admin.yaml
|
||||||
|
- nad-br-srv.yaml
|
||||||
17
vm-windows-demo/nad-br-admin.yaml
Normal file
17
vm-windows-demo/nad-br-admin.yaml
Normal file
@@ -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"
|
||||||
|
}
|
||||||
|
}'
|
||||||
17
vm-windows-demo/nad-br-srv.yaml
Normal file
17
vm-windows-demo/nad-br-srv.yaml
Normal file
@@ -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"
|
||||||
|
}
|
||||||
|
}'
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
apiVersion: v1
|
apiVersion: v1
|
||||||
kind: Namespace
|
kind: Namespace
|
||||||
metadata:
|
metadata:
|
||||||
name: k8s-vm-windows-demo
|
name: windows-demo
|
||||||
|
|||||||
@@ -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.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
@@ -2,24 +2,21 @@ apiVersion: kubevirt.io/v1
|
|||||||
kind: VirtualMachine
|
kind: VirtualMachine
|
||||||
metadata:
|
metadata:
|
||||||
name: windows-demo
|
name: windows-demo
|
||||||
namespace: k8s-vm-windows-demo
|
namespace: windows-demo
|
||||||
spec:
|
spec:
|
||||||
runStrategy: Manual # la arrancas tú con "virtctl start windows-demo"
|
runStrategy: Manual
|
||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
labels:
|
labels:
|
||||||
kubevirt.io/domain: windows-demo
|
kubevirt.io/domain: windows-demo
|
||||||
spec:
|
spec:
|
||||||
# --- REDES ---
|
|
||||||
# NIC #1 (admin): pod network (Flannel) con NAT (masquerade). No necesita NAD.
|
|
||||||
# NIC #2 (servicios): tu NAD Multus "default/br-srv"
|
|
||||||
networks:
|
networks:
|
||||||
- name: admin
|
- name: admin
|
||||||
pod: {}
|
multus:
|
||||||
|
networkName: default/br-admin
|
||||||
- name: servicios
|
- name: servicios
|
||||||
multus:
|
multus:
|
||||||
networkName: default/br-srv
|
networkName: default/br-srv
|
||||||
|
|
||||||
domain:
|
domain:
|
||||||
machine:
|
machine:
|
||||||
type: q35
|
type: q35
|
||||||
@@ -29,14 +26,11 @@ spec:
|
|||||||
requests:
|
requests:
|
||||||
memory: 4Gi
|
memory: 4Gi
|
||||||
devices:
|
devices:
|
||||||
# Interfaces de red
|
autoattachPodInterface: false
|
||||||
interfaces:
|
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
|
- name: admin
|
||||||
masquerade: {}
|
masquerade: {}
|
||||||
model: e1000e
|
model: virtio
|
||||||
# En servicios dejamos virtio (requerirá instalar los drivers VirtIO)
|
|
||||||
- name: servicios
|
- name: servicios
|
||||||
bridge: {}
|
bridge: {}
|
||||||
model: virtio
|
model: virtio
|
||||||
@@ -70,8 +64,6 @@ spec:
|
|||||||
persistentVolumeClaim:
|
persistentVolumeClaim:
|
||||||
claimName: winhd
|
claimName: winhd
|
||||||
- name: virtiocontainerdisk
|
- name: virtiocontainerdisk
|
||||||
# ISO de drivers VirtIO empaquetada como containerDisk
|
|
||||||
# (si lo prefieres, puedes servir un virtio-win.iso tuyo desde el isoserver)
|
|
||||||
containerDisk:
|
containerDisk:
|
||||||
image: kubevirt/virtio-container-disk
|
image: kubevirt/virtio-container-disk
|
||||||
# alternativa habitual:
|
# alternativa habitual:
|
||||||
|
|||||||
Reference in New Issue
Block a user