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

k3sTerraformArgoCDCloudNativePGPrometheusGrafanak6

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.

Enlaces

Ver código en GitHub