Introducción

En prácticas DevOps, lograr actualizar aplicaciones sin tiempo de inactividad (zero-downtime) y mantener una alta disponibilidad son dos de los grandes desafíos en la infraestructura. Una de las formas de resolver esto es mediante la estrategia Blue/Green.

Tradicionalmente, este tipo de despliegue se aplica dentro de un mismo clúster. Sin embargo, en este laboratorio llevaremos el concepto al siguiente nivel: implementaremos un Multi-Cluster Blue/Green. Utilizando dos máquinas virtuales independientes en un entorno virtualizado, levantaremos un clúster de Kubernetes (kind) en cada una, simulando dos centros de datos o zonas de disponibilidad separadas.

En lugar de depender de balanceadores locales como Haproxy que requieran abrir puertos hacia internet, utilizaremos Cloudflare Tunnels (Zero Trust) como nuestro proxy inverso global. Cloudflare gestiona automáticamente el certificado SSL/TLS y, mediante su enrutamiento nativo, balanceará el tráfico entre nuestros clústeres. Si un nodo se cae, la red va a redirigir automáticamente las peticiones al nodo de respaldo lo que lo hace transparente para los usuarios finales.

En la siguiente publicación, veremos paso a paso cómo implementar la infraestructura como código con Terraform, configurar los nodos de forma automatizada con scripts en Bash y desplegar nuestros servicios web sin que sufran inactividad.

Prerrequisitos

Para seguir este laboratorio paso a paso y levantar la arquitectura en tu propio entorno, necesitarás:

  1. Servidor Proxmox VE: Dos VMs con Ubuntu 24.04 (al menos 2 vCPU y 4GB de RAM por VM). En mi caso utilicé una plantilla de Ubuntu (ej. 24.04 con Cloud-Init).
  2. Terraform: Instalado en tu máquina local para desplegar la infraestructura mediante código.
  3. Cuenta de Cloudflare: Con acceso a Cloudflare Zero Trust y un dominio configurado para gestionar los túneles y el DNS.
  4. Tokens de API: Necesitarás crear tokens de acceso tanto para Proxmox como para Cloudflare.

Diagrama del laboratorio

Repositorio del Proyecto

He compartido el repositorio donde trabajé (archivos de Terraform, scripts de instalación y manifiestos de Kubernetes) estructurado y listo para usar.

Puedes clonar el repositorio o utilizar los archivos de ejemplo como base para tu propio entorno:

K8s-blue-green-repo

Dentro del repositorio encontrarás un archivo terraform.tfvars.example. Asegúrate de copiarlo, renombrarlo a terraform.tfvars y completar tus valores de variables reales que por cierto nunca deben subirse al repo!


Fase 1: Infraestructura como Código (Proxmox + Terraform)

En laboratorios anteriores he utilizado el provider Telmate por una cuestión de que fue el primero que se me ocurrió aprender, pero buscando en Internet me encontré con BPG (bpg/proxmox) que es el provider que se recomienda para aprovisionar IaC sobre Proxmox y al parecer tiene una comunidad activa que le da mantenimiento.

Una vez iniciado el directorio de trabajo con terraform y ejecutado el plan y el apply, tendremos nuestra infraestructura desplegada.

Se generó un archivo output.tf para traer información necesaria de nuestra infraestructura una vez generada:

  • Las IPs de las dos VMs
  • El token de Cloudflare tunnel que nos va a servir para levantar el servicio cloudflared en cada VM(debemos copiarlo por que lo vamos a necesitar para pegarlo en el script de instalación).
terraform output vm_ips
terraform output -raw cloudflare_tunnel_token

Fase 2: Correr el script de instalación en cada VM.

Llegó el momento de correr el script que instala las aplicaciones necesarias para correr los deployments en el cluster.

  • Instala Docker que es necesario para el funcionamiento Kind
  • Kubectl que lo vamos a utilizar para comunicarnos con el cluster a través de su API
  • Instala Kind y crea el cluster.
  • Instala Nginx Ingress (Próximo a deprecar en K8s, se podría migrar a Nginx Fabric Gateway pero como prueba de laboratorio nos sirve.)
  • Instala cloudflared y conecta el túnel de Cloudflare con nuestra VM. (En este punto es necesario copiar el token que nos provee terraform con la creación de la infra).
chmod +x install-kind.sh
./install-kind.sh

Fase 3: Los Deployments (Blue/Green)

Para probar el funcionamiento del balanceo se utilizó una imagen simple (hashicorp/http-echo ) que en el caso del cluster blue larga un mensaje con un fondo azul y para el green lo mismo con fondo verde.

- "-text=<body style='background-color:#007BFF;color:white;text-align:center;padding:50px;font-family:sans-serif'><h1>¡Laboratorio HA!</h1><h2>Estás viendo la versión BLUE (VM1)</h2></body>"

La comunicación con el mundo exterior la realiza el ingress, debemos agregarle un subdominio por que sin esto Nginx no sabe que hacer cuando Cloudflare le tira tráfico.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-ingress
spec:
  ingressClassName: nginx
  rules:
  - host: demo.chicho.com.ar # ¡Reemplaza por el subdominio que definiste en Terraform!
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web-service
            port:
               number: 80

Fase 4: Enrutando el tráfico en la nube

Ya en la parte final le tenemos que decir a nuestro subdominio que se comunique con el tunnel de Cloudflare y este se redirija a los cluster blue/green. Para esto vamos a ir a Networking –> Tunnels, seleccionamos el tunnel que nos creó Terraform (en este ejemplo k8s-bluegreen-tf), nos vamos a la solapa Routes, hacemos click en el botón add route y seleccionamos Published Application

Agregamos el subdominio y la magia está en el campo Service URL en donde vamos a apuntar a nuestras VMS que tienen instalado el tunnel de Cloudflare, al cargar http://localhost:80 cada vez que pidamos una request va a ir al cluster blue o al green dependiendo de quien agarre más rápido la petición.

Screen Cloudflare tunnel

Como podemos corroborar si la estrategia blue/green funcionó? Nos vamos a una de las VMs creadas y stopeamos el servicio de cloudflared, cuando el servicio se detenga la petición va a ir si o si por el servicio tunnel activo.

sudo systemctl stop cloudflared

Próximos pasos

Puede que en otra publicación hablemos sobre la instalación de dos cluster pero con K3s que es una versión de Kubernetes ligera e implementar el stack LGTM para monitoreo y observabilidad, o quizá el despliegue con estrategia blue/green pero enfocada a deployments en k8s (Blue/green deployment).