Este proyecto consiste en el diseño e implementación de una infraestructura virtualizada on-premise para el despliegue de servicios contenerizados. Se simula un entorno de producción real garantizando Alta Disponibilidad (HA), escalabilidad y gestión centralizada mediante un clúster de Kubernetes robusto.
Important
Puedes consultar más detalles en el:
- Host: Servidor dedicado con Proxmox VE.
- Gestión: Acceso remoto seguro vía Web/SSH.
| Icono | Rol | SO | Función | IP Estática |
|---|---|---|---|---|
| 🛡️ | K8s Control Plane | Ubuntu Server | Gestión del clúster (API, Etcd, Scheduler) | 192.168.1.110 |
| 👷 | K8s Worker 1 | Ubuntu Server | Ejecución de cargas de trabajo | 192.168.1.111 |
| 👷 | K8s Worker 2 | Ubuntu Server | Redundancia y HA | 192.168.1.112 |
| 🤖 | Servidor Ansible | Ubuntu Server | Automatización y aprovisionamiento (IaC) | 192.168.1.115 |
| 💾 | Servidor NFS | Ubuntu Server | Almacenamiento persistente (PV/PVC) | 192.168.1.116 |
| 💻 | Cliente | Linux Desktop | Pruebas de usuario final y validación de red | DHCP |
Se han elaborado manuales técnicos detallados para replicar la infraestructura paso a paso:
- Fase 1: 🚀 Instalación de Proxmox VE - Preparación del host físico y configuración de BIOS.
- Fase 2: 🖥️ Configuración de Proxmox e Instalación de Ubuntu Server - Gestión de repositorios, red y creación de plantillas (Templates).
- Fase 3: ☸️ Inicialización del Clúster Kubernetes - Despliegue de nodos, CNI Flannel y resolución de errores.
- Fase 4: ⚖️ Instalación y Configuración de MetalLB - Implementación de balanceo de carga en Capa 2 y gestión de IPs externas.
- Fase 5: 🌐 Instalación de Ingress Controller (Nginx) - Gestión de tráfico HTTP/HTTPS mediante reglas de enrutamiento por dominio.
- Fase 6: 💾 Servidor NFS y Almacenamiento Persistente - Configuración de almacenamiento externo dinámico para persistencia de datos.
- Fase 7: 🤖 Automatización con Ansible - Gestión de configuración como código (IaC) y escalado automático de nodos.
- Fase 8: 🚀 Despliegue de Aplicación Real y Dockerfile - Creación de imágenes personalizadas y servicios con base de datos persistente.
- Fase 9: 🛡️ Alta Disponibilidad y Pruebas de Carga - Simulación de fallos y validación de la resiliencia del entorno.
- Fase 10 (Opcional): 📊 Monitorización con Prometheus y Grafana - Visualización de métricas de rendimiento del clúster y contenedores.
Tip
Se recomienda seguir las guías en orden secuencial para garantizar la correcta visibilidad de red entre los componentes del clúster.
- Orquestación:
Kubernetes v1.30☸️ - Runtime:
containerd📦 - Red (CNI):
Flannel🕸️ - Red y Balanceo:
- MetalLB: Load Balancer Bare-Metal (Capa 2).
- Ingress Controller: Nginx (Gestión de tráfico HTTP/S).
- Almacenamiento:
NFS(Persistent Volumes) 💾 - Automatización:
Ansible🤖 - Control de Versiones:
Git+GitHub🐙
- 📐 Definición de arquitectura y análisis de viabilidad.
- 📁 Estructura del repositorio y documentación base.
- 🌐 Instalación y optimización de Proxmox VE.
- 🖥️ Despliegue de VMs y configuración de red estática.
- 🛡️ Inicialización del Clúster Kubernetes (Control Plane).
- 👷 Unión de nodos Worker y configuración de CNI (Flannel).
- ⚖️ Implementación de MetalLB e Ingress Controller (Nginx).
- 💾 Configuración de Servidor NFS y Aprovisionamiento Dinámico.
- 🤖 Automatización completa con Ansible (IaC).
- 🚀 Despliegue de App con persistencia.
- 🛡️ Pruebas de Alta Disponibilidad (Fallo de Nodos).
- 📊 Monitorización con Prometheus y Grafana (Opcional).
Durante el despliegue se resolvieron retos técnicos críticos documentados para futuras referencias:
Caution
Gestión de Red: Desactivación obligatoria de IPv6 a nivel de kernel para evitar conflictos en el Control Plane.
- Configuración del Runtime: Ajuste del driver de Cgroup a
systemdencontainerdpara asegurar la estabilidad del procesokubelet. - Vinculación de IP: Uso estricto de la flag
--node-ipen la configuración dekubeletpara forzar la interfaz IPv4 correcta sobre el hardware virtualizado. - Conectividad Externa (Netplan): Se detectó que los nodos perdían conectividad con internet al configurar IPs estáticas. Se corrigió definiendo explícitamente la ruta por defecto (
routes: to: default via 192.168.1.1) en lugar del parámetro obsoletogateway4. - Identidad de Nodo (Kubelet): Para evitar que el clúster usara interfaces erróneas, se forzó la vinculación de IP mediante la creación del archivo
/etc/default/kubeletcon el parámetroKUBELET_EXTRA_ARGS="--node-ip=<IP_ESTATICA>". - Módulos del Kernel (Networking): El plugin de red Flannel entraba en
CrashLoopBackOffpor la ausencia del módulobr_netfilter. Se solucionó cargando el módulo manualmente y asegurando su persistencia en/etc/modules-load.d/k8s.conf. - Persistencia de Red (CNI): Resolución de errores
NetworkPluginNotReadymediante la limpieza manual de interfaces residuales (cni0,flannel.1) y el reinicio decontainerd. - Balanceo de Carga (MetalLB): Modificación del
ConfigMapdekube-proxypara activarstrictARP: true, requisito indispensable para el correcto enrutamiento en Capa 2. - Liberación de IPs (MetalLB/Ingress): Precaución al eliminar despliegues de prueba (
LoadBalancer) para asegurar que MetalLB devuelva la IP externa (192.168.1.200) al pool, dejándola disponible para el controlador Ingress.
Proyecto Integrado de Grado Superior ASIR
© 2026 - jobopaK