Skip to content
SP StackPractices
intermediate Por StackPractices

Despliegue Canary — Rollouts Graduales con Controles de Seguridad

Guía práctica sobre despliegues canary: estrategias de división de tráfico, promoción automatizada, disparadores de rollback y despliegue seguro de nuevas versiones a un subconjunto de usuarios.

Nota para desarrolladores hispanohablantes: Esta guía incluye ejemplos y convenciones de nomenclatura adaptadas a equipos que trabajan en español. Cuando existen diferencias significativas en terminología técnica entre el inglés y el español, se indican explícitamente para facilitar la comunicación en equipos multiculturales.

Overview

El despliegue canary libera una nueva versión primero a un pequeño subconjunto de usuarios, luego aumenta gradualmente el tráfico mientras monitorea problemas. Combina la seguridad de la exposición controlada con la velocidad del despliegue continuo, detectando problemas antes de que impacten a todos los usuarios.

Esta guía cubre división de tráfico, métricas de salud, promoción automatizada y estrategias de rollback.

When to Use

  • Quieres reducir riesgo al desplegar nuevas funcionalidades
  • Tu servicio tiene suficiente tráfico para obtener métricas significativas de 1-5% de usuarios
  • Necesitas validar rendimiento bajo carga real antes del rollout completo
  • Quieres hacer A/B testing de comportamiento junto con cambios de infraestructura
  • Prefieres rollback gradual a cambio instantáneo (blue-green)

Core Concepts

ConceptoDescripción
Grupo CanarySubconjunto inicial de usuarios que reciben la nueva versión
Split de TráficoPorcentaje de requests enrutadas a canary vs baseline
PromociónAumentar porcentaje de tráfico canary después de validación
RollbackReducir tráfico canary a cero si se detectan problemas
Bake TimePeríodo mínimo de observación antes del siguiente paso de promoción
Umbral de MétricaCriterios automatizados para promoción o rollback

Traffic Splitting Strategies

EstrategiaCómo FuncionaMejor Para
Porcentaje aleatorioDividir X% de requests aleatoriamenteAPIs stateless
Basado en usuarioEnrutar usuarios/grupos específicos consistentementeApps con sesiones
GeográficaEnrutar por región o data centerDespliegues multi-región
Basada en headersEnrutar por header de request (interno, beta)Testing con clientes específicos
ProgresivaEmpezar en 1%, duplicar cada N minutosServicios de alto tráfico

Step-by-Step Canary Deployment

1. Definir Criterios Canary

Establecer umbrales claros y medibles antes de desplegar:

# Ejemplo: Configuración de análisis canary
canary:
  stages:
    - name: "1% canary"
      traffic_percentage: 1
      bake_time_minutes: 15
      thresholds:
        error_rate: "< 0.1%"
        latency_p95: "< 200ms"
        cpu_utilization: "< 70%"
    - name: "10% canary"
      traffic_percentage: 10
      bake_time_minutes: 30
      thresholds:
        error_rate: "< 0.1%"
        latency_p95: "< 200ms"
    - name: "50% canary"
      traffic_percentage: 50
      bake_time_minutes: 30
      thresholds:
        error_rate: "< 0.1%"
        latency_p95: "< 200ms"
    - name: "100% rollout"
      traffic_percentage: 100

Métricas clave a monitorear:

  • Técnicas: Tasa de error, latencia (p50/p95/p99), throughput, CPU, memoria
  • Negocio: Tasa de conversión, abandono de carrito, éxito de login, finalización de pago
  • Custom: KPIs específicas de funcionalidad relevantes al cambio desplegado

2. Desplegar el Canary

Enrutar un pequeño porcentaje de tráfico a la nueva versión:

# Ejemplo: Istio virtual service para canary
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: myapp-canary
spec:
  hosts:
    - myapp.example.com
  http:
    - match:
        - headers:
            x-canary:
              exact: "true"
      route:
        - destination:
            host: myapp
            subset: canary
          weight: 100
    - route:
        - destination:
            host: myapp
            subset: stable
          weight: 99
        - destination:
            host: myapp
            subset: canary
          weight: 1
# Ejemplo: Upstream ponderado en NGINX
upstream myapp {
    server stable.internal:8080 weight=99;
    server canary.internal:8080 weight=1;
}

# Ejemplo: Kubernetes con Flagger
apiVersion: flagger.app/v1beta1
kind: Canary
metadata:
  name: myapp
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: myapp
  service:
    port: 80
    targetPort: 8080
  analysis:
    interval: 1m
    threshold: 5
    maxWeight: 50
    stepWeight: 10
    metrics:
      - name: request-success-rate
        thresholdRange:
          min: 99
        interval: 1m
      - name: request-duration
        thresholdRange:
          max: 500
        interval: 1m

3. Monitorear y Validar

Observar métricas canary contra baseline:

# Ejemplo: Script de análisis canary automatizado
import requests
import time

def analyze_canary(baseline_version, canary_version, duration_minutes=15):
    end_time = time.time() + (duration_minutes * 60)
    
    while time.time() < end_time:
        # Obtener métricas del sistema de monitoreo
        baseline_errors = get_error_rate(baseline_version)
        canary_errors = get_error_rate(canary_version)
        
        baseline_latency = get_p95_latency(baseline_version)
        canary_latency = get_p95_latency(canary_version)
        
        # Verificar umbrales
        if canary_errors > baseline_errors * 1.5:
            return "ROLLBACK", f"Tasa de error muy alta: {canary_errors}%"
        
        if canary_latency > baseline_latency * 1.2:
            return "ROLLBACK", f"Regresión de latencia: {canary_latency}ms"
        
        time.sleep(60)
    
    return "PROMOTE", "Todos los umbrales pasaron"

result, reason = analyze_canary("v1.2.3", "v1.3.0")
print(f"Decision: {result} - {reason}")

Checklist de monitoreo:

  • Comparar métricas canary con baseline, no solo valores absolutos
  • Buscar picos de tasa de error, regresiones de latencia y agotamiento de recursos
  • Monitorear métricas de negocio (revenue, conversión) junto con métricas técnicas
  • Configurar alertas para problemas específicos de canary

4. Promover o Hacer Rollback

Basado en el análisis, aumentar tráfico o revertir:

# Ejemplo: Script de promoción automatizada
#!/bin/bash
CANARY_WEIGHT=$1

if [ "$CANARY_WEIGHT" -eq 100 ]; then
  echo "Canary completamente promovido. Removiendo versión vieja."
  kubectl scale deployment myapp-stable --replicas=0
  exit 0
fi

# Actualizar split de tráfico
kubectl patch virtualservice myapp -p \
  '{"spec":{"http":[{"route":[{"destination":{"host":"myapp","subset":"stable"},"weight":'$((100 - CANARY_WEIGHT))'},
  {"destination":{"host":"myapp","subset":"canary"},"weight":'$CANARY_WEIGHT'}]}]}'

echo "Tráfico actualizado: $CANARY_WEIGHT% canary"
# Ejemplo: Rollback instantáneo
#!/bin/bash
echo "Haciendo rollback de canary..."

# Establecer peso canary a 0
kubectl patch virtualservice myapp -p \
  '{"spec":{"http":[{"route":[{"destination":{"host":"myapp","subset":"stable"},"weight":100},
  {"destination":{"host":"myapp","subset":"canary"},"weight":0}]}]}'

# Escala canary a cero
kubectl scale deployment myapp-canary --replicas=0

echo "Rollback completo. Todo el tráfico en estable."

Mejores prácticas de promoción:

  • Nunca saltear bake time — incluso si las métricas se ven bien
  • Duplicar tráfico por etapas (1% → 5% → 10% → 25% → 50% → 100%)
  • Requerir aprobación manual para etapas sobre 50%
  • Mantener versión vieja escalada hasta 100% de promoción

Automated Canary Analysis Tools

HerramientaPlataformaCaracterísticas Clave
FlaggerKubernetesCanary automatizado, A/B testing, progressive delivery
SpinnakerMulti-cloudCanary driven por pipelines con análisis de métricas
Argo RolloutsKubernetesBlue-green, canary y templates de análisis
AWS App MeshAWSTraffic shifting con métricas de CloudWatch
Google Cloud Traffic DirectorGCPDivisión de tráfico basada en porcentaje

Best Practices

  • Empieza pequeño. 1% de canary detecta la mayoría de problemas sin impacto significativo de usuarios.
  • Usa métricas significativas. Las métricas de negocio a menudo detectan problemas que las métricas técnicas no ven.
  • Mantén sesiones persistentes. Enruta el mismo usuario a la misma versión para evitar inconsistencia.
  • Ten un rollback instantáneo. El canary debe revertir en segundos, no minutos.
  • Practica el rollback. Prueba tu procedimiento de rollback antes de necesitarlo.
  • Documenta cada canary. Nota qué cambió, qué se observó y la decisión final.

Common Mistakes

  • Acelerar la promoción. Saltear bake time porque “se ve bien” lleva a incidentes.
  • Monitorear solo métricas técnicas. Un bug de funcionalidad puede no mostrarse en tasas de error pero afectará conversiones.
  • Enrutamiento inconsistente. Usuarios rebotando entre versiones crean confusión y bugs.
  • Olvidar compatibilidad de base de datos. Ambas versiones deben funcionar con el schema actual.
  • No escalar canary apropiadamente. Canaries sub-provisionados fallan bajo carga, causando rollbacks falsos.

Variants

  • Shadow canary: Enviar tráfico duplicado a canary sin impactar al usuario (sin riesgo, pero duplica carga)
  • Dark launch: Desplegar a producción pero ocultar detrás de feature flags
  • Canary geográfico: Rollout región por región (US-East primero, luego Europa, luego Asia)
  • Canary basado en tiempo: Enrutar usuarios internos durante horas hábiles, luego externos después de validación

FAQ

Q: ¿Con qué porcentaje debería empezar un canary? Empieza con 1% para servicios de alto tráfico, 5-10% para menor tráfico. El objetivo es suficiente tráfico para métricas estadísticamente significativas.

Q: ¿Cuánto debería durar cada etapa de canary? Mínimo 10-15 minutos por etapa para servicios de alto tráfico. Para bajo tráfico, extiende a 30-60 minutos para reunir suficientes datos.

Q: ¿Cuál es la diferencia entre canary y A/B testing? Canary prueba salud de infraestructura y regresión. A/B testing prueba comportamiento de usuario y efectividad de funcionalidad. Se pueden combinar.

Q: ¿Debería usar canary para cada despliegue? Para servicios críticos, sí. Para herramientas internas o cambios de bajo riesgo, el despliegue directo puede ser aceptable.

Conclusion

El despliegue canary es la forma más segura de liberar software a escala. Al exponer cambios a una audiencia pequeña y controlada primero, detectas problemas temprano, minimizas el radio de explosión y construyes confianza en cada release. Combina análisis automatizado de métricas con promoción gradual para un proceso de despliegue de clase mundial.