Clúster Kubernetes de Alta Disponibilidad
Contexto y motivación
En el trabajo llevo producción yo solo, y la regla que me impongo es simple: cualquier cosa que opere tiene que sobrevivir a que yo la rompa. Este laboratorio lleva esa regla a Kubernetes. Son tres nodos servidor con etcd, quórum de verdad, porque con un solo máster no puedes matar al máster y contar la historia.
Todo nace de un `terraform apply` y de un repositorio. ArgoCD compara el clúster con lo que dice Git y lo que no está en Git no existe, así que el rollback es un revert. Encima corren una aplicación con autoescalado y una PostgreSQL con réplica y failover automático, con certificados reales de Let's Encrypt resueltos por DNS y sin nada expuesto a internet.
Los cuatro simulacros recrean los incidentes que cualquier plataforma acaba viendo: un nodo muere de madrugada, un despliegue roto sale un viernes, el tráfico se multiplica, se pierde todo. Cada uno es un script con cronómetro, y cada cifra de abajo salió de ejecutarlo, no de estimarlo. El proyecto además me dio su propio incidente: sobre máquinas virtuales anidadas, etcd tardaba hasta un segundo por escritura y el clúster se comía a sí mismo en elecciones de líder, así que medí, descarté disco y memoria, y migré los nodos a contenedores LXC. La carga del hipervisor cayó de 8 a 3,5 y el clúster se estabilizó.
Tecnologías
Características principales
- Tres nodos server con etcd embebido, creados por Terraform como contenedores LXC sobre Proxmox
- GitOps con ArgoCD en app of apps: el estado del clúster es lo que diga el repositorio
- Simulacro 1, muere el nodo del primario de PostgreSQL: 1 petición perdida de 4.315, la réplica se promociona sola
- Simulacro 2, despliegue roto en viernes: 0,0 s de corte en 3.437 sondeos, y la vuelta atrás es un `git revert`
- Simulacro 3, pico de 3.081 peticiones por segundo: de 3 a 6 réplicas en 40 s con la p95 en 22 ms
- Simulacro 4, pérdida total: `terraform destroy` de los tres nodos y reconstrucción completa, datos incluidos, en 9 min 37 s
- Certificados de Let's Encrypt por reto DNS y monitorización con Prometheus y Grafana, con panel propio del laboratorio
Galería
Conclusión
Es un laboratorio y lo digo en el repositorio. Corre sobre virtualización anidada en un equipo doméstico, y MetalLB anuncia la IP en modo L2 desde un solo nodo, así que el resultado del simulacro 1 depende de qué nodo mates. El único secreto, el token DNS de Cloudflare, se crea a mano y está documentado.
Cada simulacro lo pasé dos veces, la primera descubre y la segunda mide. La primera pasada de la pérdida total encontró dos fallos que no estaban en el clúster: SSH se negaba a hablar con los nodos recién creados porque su clave de host había cambiado, y la instalación de ArgoCD moría porque uno de sus CRD supera lo que admite una anotación de Kubernetes. Los dos quedaron arreglados en el script, y los números publicados son de la segunda pasada.