0%
Despliegues avanzados en Kubernetes: estrategias y buenas prácticas

Despliegues avanzados en Kubernetes: estrategias y buenas prácticas

Explora las estrategias de despliegue avanzadas en Kubernetes, las actualizaciones progresivas y los rollbacks, así como las mejores prácticas para lograr despliegues robustos.

I

InSkillCoach

· min

Estrategias de despliegue en Kubernetes

Los Deployments de Kubernetes ofrecen diferentes estrategias para actualizar tus aplicaciones. Elegir la estrategia adecuada es crucial para minimizar las interrupciones del servicio y garantizar una transición fluida.

Estrategia de reemplazo (Recreate)

La estrategia de reemplazo detiene todas las instancias de la versión anterior antes de iniciar las nuevas.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-deployment
spec:
  replicas: 3
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:1.0

Ventajas:

  • Sencilla de entender y de depurar
  • Garantiza que solo una versión se ejecute a la vez

Inconvenientes:

  • Tiempo de inactividad durante el despliegue
  • Sin rollback automático en caso de fallo

Casos de uso:

  • Aplicaciones que no admiten varias versiones simultáneas
  • Entornos de desarrollo o de pruebas
  • Aplicaciones con dependencias críticas de base de datos

Estrategia de Rolling Update (RollingUpdate)

La estrategia de actualización progresiva sustituye gradualmente las instancias antiguas por otras nuevas, manteniendo un número mínimo de instancias disponibles. Es la estrategia por defecto.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-deployment
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1        # Número máximo de pods adicionales permitidos
      maxUnavailable: 0  # Número máximo de pods no disponibles durante la actualización
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:1.0

Ventajas:

  • Sin tiempo de inactividad
  • Rollback automático en caso de fallo
  • Control preciso sobre el proceso de actualización

Inconvenientes:

  • Más compleja de configurar
  • Puede requerir más recursos durante la actualización

Casos de uso:

  • Aplicaciones en producción
  • Servicios que requieren alta disponibilidad
  • Aplicaciones que admiten varias versiones simultáneas

Estrategia de Blue/Green Deployment

Aunque Kubernetes no ofrece de forma nativa el despliegue blue/green, puedes implementarlo utilizando servicios y Deployments.

# Déploiement "Blue" (version actuelle)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-blue
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
      version: blue
  template:
    metadata:
      labels:
        app: myapp
        version: blue
    spec:
      containers:
      - name: myapp
        image: myapp:1.0
---
# Déploiement "Green" (nouvelle version)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-green
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
      version: green
  template:
    metadata:
      labels:
        app: myapp
        version: green
    spec:
      containers:
      - name: myapp
        image: myapp:1.1
---
# Service qui pointe vers la version active
apiVersion: v1
kind: Service
metadata:
  name: app-service
spec:
  selector:
    app: myapp
    version: blue  # Changez pour "green" pour basculer vers la nouvelle version
  ports:
  - port: 80
    targetPort: 8080

Ventajas:

  • Cambio instantáneo entre versiones
  • Sin degradación del servicio durante la actualización
  • Rollback sencillo cambiando el selector del servicio

Inconvenientes:

  • Requiere el doble de recursos durante el despliegue
  • Configuración más compleja
  • Requiere una gestión manual o un script para el cambio de versión

Casos de uso:

  • Aplicaciones críticas con ventanas de mantenimiento estrictas
  • Servicios que requieren un cambio rápido en caso de problema
  • Aplicaciones con dependencias complejas entre versiones

Estrategia de Canary Deployment

Un despliegue canary expone una pequeña parte del tráfico a la nueva versión antes de desplegarla por completo.

# Déploiement principal (version actuelle)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-main
spec:
  replicas: 9
  selector:
    matchLabels:
      app: myapp
      version: main
  template:
    metadata:
      labels:
        app: myapp
        version: main
    spec:
      containers:
      - name: myapp
        image: myapp:1.0
---
# Déploiement canary (nouvelle version)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-canary
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
      version: canary
  template:
    metadata:
      labels:
        app: myapp
        version: canary
    spec:
      containers:
      - name: myapp
        image: myapp:1.1
---
# Service qui distribue le trafic
apiVersion: v1
kind: Service
metadata:
  name: app-service
spec:
  selector:
    app: myapp
  ports:
  - port: 80
    targetPort: 8080

Ventajas:

  • Pruebas en producción con un riesgo mínimo
  • Detección temprana de problemas
  • Posibilidad de recopilar métricas antes del despliegue completo

Inconvenientes:

  • Configuración más compleja
  • Requiere una supervisión atenta durante la fase canary
  • Puede requerir herramientas adicionales para el enrutamiento del tráfico

Casos de uso:

  • Aplicaciones con un gran número de usuarios
  • Servicios que requieren validación en producción
  • Despliegues de alto riesgo

Gestión de rollbacks

Los rollbacks son esenciales para mantener la disponibilidad de tu aplicación en caso de problemas con una nueva versión.

Rollback automático con health checks

Configura sondas de salud (liveness y readiness) para que Kubernetes pueda detectar automáticamente los problemas y efectuar un rollback.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-deployment
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:1.0
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /ready
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5

Rollback manual con kubectl

Puedes efectuar un rollback manual a una versión anterior utilizando el comando kubectl rollout undo:

# Rollback vers la version précédente
kubectl rollout undo deployment/app-deployment

# Rollback vers une version spécifique
kubectl rollout undo deployment/app-deployment --to-revision=2

Buenas prácticas para los despliegues

1. Utiliza tags de imagen específicos

Evita usar latest como tag de imagen, ya que dificulta el seguimiento de las versiones y puede provocar despliegues no reproducibles.

# À éviter
image: myapp:latest

# Recommandé
image: myapp:1.0.2

2. Define límites de recursos

Especifica los límites de recursos para evitar que un pod consuma demasiados recursos y afecte a los demás pods.

spec:
  containers:
  - name: myapp
    image: myapp:1.0
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

3. Utiliza reglas de anti-afinidad

Despliega los pods en distintos nodos para mejorar la disponibilidad.

spec:
  affinity:
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: app
              operator: In
              values:
              - myapp
          topologyKey: kubernetes.io/hostname

4. Implementa estrategias de escalado

Configura el autoescalado horizontal (HPA) para ajustar automáticamente el número de réplicas en función de la carga.

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: app-deployment
  minReplicas: 3
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

5. Utiliza ConfigMaps y Secrets

Separa la configuración de la aplicación del código para facilitar las modificaciones sin tener que reconstruir la imagen.

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  APP_ENV: production
  LOG_LEVEL: info
---
apiVersion: v1
kind: Secret
metadata:
  name: app-secrets
type: Opaque
data:
  DB_PASSWORD: base64encodedpassword
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-deployment
spec:
  template:
    spec:
      containers:
      - name: myapp
        image: myapp:1.0
        envFrom:
        - configMapRef:
            name: app-config
        - secretRef:
            name: app-secrets

Ejemplo de despliegue completo

Este es un ejemplo completo de un Deployment de Kubernetes con las mejores prácticas:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-deployment
  labels:
    app: myapp
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:1.0.2
        ports:
        - containerPort: 8080
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /ready
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5
        envFrom:
        - configMapRef:
            name: app-config
        - secretRef:
            name: app-secrets
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - myapp
              topologyKey: kubernetes.io/hostname
---
apiVersion: v1
kind: Service
metadata:
  name: app-service
spec:
  selector:
    app: myapp
  ports:
  - port: 80
    targetPort: 8080
  type: LoadBalancer

Conclusión

Los despliegues avanzados en Kubernetes ofrecen una gran flexibilidad para gestionar las actualizaciones de tus aplicaciones. Al elegir la estrategia de despliegue adecuada y seguir las mejores prácticas, puedes garantizar una transición fluida entre versiones manteniendo la disponibilidad de tu servicio.

En el próximo artículo exploraremos la gestión de secretos y configuraciones en Kubernetes, un aspecto crucial para proteger tus aplicaciones.

InSkillCoach

Acerca de InSkillCoach

Experto en formación y tecnologías

Coach especializado en tecnologías avanzadas e IA, impulsado por GNeurone Inc.

Certificaciones:

  • AWS Certified Solutions Architect – Professional
  • Certificaciones de Google Cloud
  • Microsoft Certified: DevOps Engineer Expert
  • Certified Kubernetes Administrator (CKA)
  • CompTIA Security+
1.1k
136

Comentarios

Los comentarios funcionan con GitHub Discussions

Inicia sesión con GitHub para participar en la discusión

¡Enlace copiado!