# 🏋️ Arquitectura del clúster K3s Este documento describe la arquitectura actualizada del clúster Kubernetes desplegado con K3s, su distribución de roles, componentes principales, topología de red y almacenamiento. --- ## 🧱 Nodos y roles ### 💻 tartaro (Admin: 192.168.1.11 / Storage: 192.168.3.1 / Internode: 192.168.4.1) - Rol: Control plane principal - Prioridad Keepalived: MASTER - Ejecuta: - K3s (cluster-init) - Ingress Controller - cert-manager - Gitea - Argo CD - App of Apps - Guacamole - KubeVirt Operator - VS Code Server - Servicios principales del clúster --- ### 💻 styx (Admin: 192.168.1.12 / Storage: 192.168.3.2 / Internode: 192.168.4.2) - Rol: Segundo nodo control plane - Prioridad Keepalived: BACKUP - Ejecuta: - K3s (join al control plane) - Ingress Controller (DaemonSet) - Réplicas de servicios distribuidos - Nodo tolerante a caída del master --- ### 💻 niflheim (Admin: 192.168.1.13 / Storage: 192.168.3.3 / Internode: 192.168.4.3) - Rol: Nodo dedicado a almacenamiento y servicios de infraestructura - Taint: `storage=only:NoSchedule` - Ejecuta: - K3s (con taint para evitar pods no relacionados) - ZFS + NFS Server - NFS Client Provisioner - ISO Server para KubeVirt - Volúmenes persistentes para todo el clúster --- ## 📡 Red y VLANs Separación de tráfico mediante bonding de interfaces (`bond0`) y VLANs: | Red | VLAN | Uso | |:----|:-----|:----| | Administración | 1 (untagged) | Acceso de gestión y explotación de servicios | | Almacenamiento | 30 | Tráfico dedicado a NFS y persistencia | | Internodo | 40 | Comunicación interna de Kubernetes (control plane y pods) | Esto permite un mejor aislamiento, rendimiento y facilita la futura expansión multi-sede. --- ## 🔀 Alta disponibilidad - Bonding de red en todos los nodos - IP virtual **192.168.1.10** gestionada por `keepalived` para el control plane - Redirección de puertos 80/443 a la IP flotante - Ingress Controller como DaemonSet desplegado en todos los nodos --- ## 🧱 Almacenamiento - **Backend principal**: Pool ZFS `k8spool/k8s` en Niflheim - **NFS Server**: Exporta `/mnt/storage/k8s` al clúster - **NFS Client Provisioner**: Provisión dinámica de volúmenes persistentes - Elección de NFS por su sencillez y compatibilidad total con Kubernetes - 🛠️ **Plan futuro**: replicar el almacenamiento ZFS entre `niflheim` (Valencia) y `gehena` (Torrevieja) sobre VPN, usando `zfs send/receive` y gestionando una IP flotante de almacenamiento mediante Keepalived --- ## 🔐 TLS e Ingress - **cert-manager**: Automatiza la solicitud y renovación de certificados Let's Encrypt - **Ingress-NGINX**: Gestiona el tráfico HTTP(S) - Configuración automática de TLS para todos los servicios expuestos --- ## 🌀 GitOps - **Gitea**: Servidor Git interno para almacenar todos los manifiestos - **Argo CD**: Sincroniza automáticamente los repositorios Git con el clúster - **App of Apps**: Orquesta todo el clúster desde un solo manifiesto maestro --- ## 💻 Virtualización - **KubeVirt**: Ejecuta máquinas virtuales como recursos nativos de Kubernetes - **CDI (Containerized Data Importer)**: Gestiona la importación de imágenes ISO - **ISO Server**: Servidor de imágenes disponible por HTTP/NFS - **Guacamole**: Acceso remoto vía navegador a VMs mediante VNC, RDP o SSH --- ## 🔧 Herramientas de soporte - **VS Code Server**: Entorno de edición remota accesible vía navegador - **Scripts auxiliares**: Automatizan la publicación, clonación y sincronización de manifiestos en la carpeta `docs/` - **Harbor**: Repositorio de imágenes Docker privado desplegado en el clúster --- ## 🧪 Recomendaciones - Etiquetar nodos adecuadamente (`kubectl label node =`) - Usar taints para separar roles específicos (ej. almacenamiento) - Gestionar el tráfico mediante bonding + VLANs - Automatizar todo con GitOps (Argo CD) - Monitorizar y respaldar los recursos críticos --- > 📅 Documentación relacionada: [Direccionamiento y VLANs](direccionamiento.md)