(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Cómo crear un Blue/Green Deploy en Kubernetes con GitHub Actions

João Barros 05 de August de 2026 4 min de lectura

Este tutorial explica cómo crear un Blue/Green deploy en Kubernetes con GitHub Actions — una estrategia útil para reducir tiempo de indisponibilidad, validar nuevas versiones en producción y permitir rollback rápido. Verás por qué el patrón Blue/Green es práctico y un ejemplo sencillo para implementar con manifests y un workflow CI/CD.

Pre-requisitos

  • Cuenta GitHub con repositorio y GitHub Actions activado
  • Cluster Kubernetes accesible (minikube, kind o AKS) y kubectl configurado
  • Imagen Docker pública o registrada (p. ej.: myrepo/myapp:latest)
  • Familiaridad básica con Kubernetes Deployments y Services

Paso 1: Entender el patrón Blue/Green

Blue/Green significa tener dos versiones concurrentes de la aplicación: "blue" (actual) y "green" (nueva). El tráfico se conmuta cambiando el selector del Service o modificando un ingress. Esto permite probar la versión green en producción sin eliminar la blue y volver atrás rápidamente.

Paso 2: Estructurar los manifests Kubernetes

Vamos a crear dos Deployments (app-blue y app-green) y un Service que apunta a una label común (app: myapp) pero cuyo selector decide qué versión recibe el tráfico. En el ejemplo el Service usa la label track: blue o track: green.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-blue
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
      track: blue
  template:
    metadata:
      labels:
        app: myapp
        track: blue
    spec:
      containers:
      - name: app
        image: myrepo/myapp:stable
        ports:
        - containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-green
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp
      track: green
  template:
    metadata:
      labels:
        app: myapp
        track: green
    spec:
      containers:
      - name: app
        image: myrepo/myapp:canary
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  type: ClusterIP
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: myapp
    track: blue

Paso 3: Probar localmente en el cluster

Aplica los manifests y confirma que el Service apunta al deployment blue. Valida mediante kubectl y, si usas minikube, accede al servicio para ver la página de la aplicación.

# aplicar manifests
kubectl apply -f k8s/blue-green.yaml
# ver pods y service
kubectl get deployments,pods,svc -l app=myapp
# probar endpoint (ejemplo minikube)
minikube service myapp-service --url

Paso 4: Crear workflow GitHub Actions para deploy controlado

El workflow realiza el build de la imagen, hace push y actualiza el Deployment green. Después ejecuta un paso para conmutar el Service de blue a green. Separar pasos permite validar la versión antes del cutover.

name: CI CD BlueGreen
on:
  push:
    branches: [ main ]

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout
      uses: actions/checkout@v4

    - name: Build and push image
      run: |
        IMAGE=myrepo/myapp:${{ github.sha }}
        docker build -t $IMAGE .
        echo "$IMAGE"
        docker push $IMAGE
      env:
        DOCKER_HUB_USERNAME: ${{ secrets.DOCKER_HUB_USERNAME }}
        DOCKER_HUB_PASSWORD: ${{ secrets.DOCKER_HUB_PASSWORD }}

    - name: Update green Deployment image
      run: |
        kubectl set image deployment/app-green app=$IMAGE --record
      env:
        KUBECONFIG: ${{ secrets.KUBECONFIG }}

    - name: Smoke tests on green
      run: |
        # Ejemplo sencillo: verificar pods listos
        kubectl rollout status deployment/app-green --timeout=60s
        kubectl get pods -l track=green
      env:
        KUBECONFIG: ${{ secrets.KUBECONFIG }}

    - name: Switch Service to green (cutover)
      if: success()
      run: |
        kubectl patch service myapp-service -p '{"spec":{"selector":{"app":"myapp","track":"green"}}}'
      env:
        KUBECONFIG: ${{ secrets.KUBECONFIG }}

Paso 5: Estrategias de rollback y limpieza

Si algo va mal después del cutover, vuelve a apuntar el Service a track: blue. Puedes automatizar el rollback si los smoke tests fallan o usar monitorización para detectar errores. Tras estar estable, puedes reducir la escala del deployment blue o eliminarlo.

# rollback manual (apuntar de vuelta a blue)
kubectl patch service myapp-service -p '{"spec":{"selector":{"app":"myapp","track":"blue"}}}'
# eliminar la versión antigua cuando esté confirmada
kubectl delete deployment app-blue

Verificar el resultado

Confirma que el Service sirve la nueva versión: realiza una petición al endpoint y valida headers, versión o contenido. Usa kubectl get svc y kubectl get pods -l track=green para verificar que el tráfico está en la green. Monitoriza logs para errores y valida métricas.

Conclusión

Implementar Blue/Green deploy en Kubernetes con GitHub Actions reduce riesgo y facilita rollback. Próximos pasos: añadir health checks, automatizar la verificación de rendimiento e integrar monitorización (Prometheus/Alertmanager). Consejo: comienza con minikube o kind para experimentar antes de aplicar en producción — ¿cuál es el próximo servicio que quieres lanzar con Blue/Green?