DevOps · ArgoCD|11 min de lectura|

Patrones de Despliegue Avanzados en Kubernetes con ArgoCD

ArgoCD va mucho más allá de sincronizar manifiestos de Kubernetes. Los equipos que usan ArgoCD solo como 'kubectl apply automático' no están aprovechando las capacidades que lo convierten en el orquestador de despliegues más poderoso del ecosistema Kubernetes. Esta guía cubre los patrones avanzados: sync waves para ordenar despliegues complejos, resource hooks para operaciones de pre y post-sync, ApplicationSets para gestionar decenas de clusters desde un solo repositorio.

Sync Waves: ordenar despliegues complejos

Un despliegue de aplicación complejo puede tener dependencias: la base de datos debe estar disponible antes de que inicie la API, la API debe estar disponible antes de que inicie el worker, las migraciones deben completarse antes de que el nuevo código empiece a servir tráfico. Sync Waves permiten definir el orden de creación de recursos dentro de una Application de ArgoCD.

yaml
# Wave 0: CRDs y namespaces — siempre primero
apiVersion: v1
kind: Namespace
metadata:
  name: production
  annotations:
    argocd.argoproj.io/sync-wave: "0"
---
# Wave 1: ConfigMaps y Secrets — antes que los Deployments
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
  annotations:
    argocd.argoproj.io/sync-wave: "1"
---
# Wave 2: Deployments y StatefulSets
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api
  annotations:
    argocd.argoproj.io/sync-wave: "2"
---
# Wave 3: Ingress — después de que los servicios estén listos
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: api-ingress
  annotations:
    argocd.argoproj.io/sync-wave: "3"

ArgoCD respeta el orden de las waves: no pasa a la wave N+1 hasta que todos los recursos de la wave N estén Healthy. Esto garantiza que el Ingress nunca se crea antes de que el Deployment esté listo, y que las migraciones se completan antes de que el tráfico llegue al nuevo código.

Resource Hooks: operaciones de pre y post-sync

Los hooks permiten ejecutar Jobs de Kubernetes en momentos específicos del ciclo de sync de ArgoCD. Los hooks más útiles en producción:

yaml
# PreSync hook — ejecutar migraciones antes del deploy
apiVersion: batch/v1
kind: Job
metadata:
  name: db-migration
  annotations:
    argocd.argoproj.io/hook: PreSync
    argocd.argoproj.io/hook-delete-policy: HookSucceeded
spec:
  template:
    spec:
      restartPolicy: Never
      containers:
      - name: migrate
        image: empresa/api:latest
        command: ["npm", "run", "db:migrate"]
        env:
        - name: DATABASE_URL
          valueFrom:
            secretKeyRef:
              name: db-credentials
              key: url
yaml
# PostSync hook — smoke test después del deploy
apiVersion: batch/v1
kind: Job
metadata:
  name: smoke-test
  annotations:
    argocd.argoproj.io/hook: PostSync
    argocd.argoproj.io/hook-delete-policy: HookSucceeded
spec:
  template:
    spec:
      restartPolicy: Never
      containers:
      - name: test
        image: curlimages/curl:latest
        command:
        - /bin/sh
        - -c
        - |
          for i in $(seq 1 5); do
            curl -sf http://api.production.svc.cluster.local/health && exit 0
            sleep 5
          done
          exit 1
hook-delete-policy: HookSucceeded borra el Job automáticamente cuando termina con éxito. Esto mantiene el namespace limpio sin acumular Jobs completados. Para debugging, usa BeforeHookCreation para ver el output del hook antes de que se borre.

ApplicationSets: gestión de múltiples clusters y environments

ApplicationSet es el generador de Applications de ArgoCD. En lugar de crear manualmente una Application por cada cluster × environment × servicio, defines una plantilla y el generador crea todas las Applications automáticamente.

yaml
# ApplicationSet — deploy del mismo servicio en múltiples clusters
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: api-all-clusters
  namespace: argocd
spec:
  generators:
  - matrix:
      generators:
      - clusters:
          selector:
            matchLabels:
              region: latam
      - list:
          elements:
          - env: staging
          - env: production
  template:
    metadata:
      name: 'api-{{name}}-{{env}}'
    spec:
      project: default
      source:
        repoURL: https://github.com/empresa/infra.git
        path: 'apps/api/{{env}}'
        targetRevision: main
      destination:
        server: '{{server}}'
        namespace: '{{env}}'
      syncPolicy:
        automated:
          prune: true
          selfHeal: '{{eq env "staging"}}'  # solo auto-sync en staging

External Secrets Operator: el patrón correcto para secretos

External Secrets Operator (ESO) sincroniza secretos desde AWS Secrets Manager, GCP Secret Manager, Azure Key Vault o HashiCorp Vault directamente a Kubernetes Secrets. La ventaja sobre Sealed Secrets: los secretos se rotan en el vault y se propagan automáticamente al cluster sin redeploy.

yaml
# ExternalSecret — sincronizar desde AWS Secrets Manager
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: db-credentials
  namespace: production
spec:
  refreshInterval: 1h
  secretStoreRef:
    name: aws-secrets-manager
    kind: ClusterSecretStore
  target:
    name: db-credentials
    creationPolicy: Owner
  data:
  - secretKey: DATABASE_URL
    remoteRef:
      key: prod/api/database
      property: url
  - secretKey: DATABASE_PASSWORD
    remoteRef:
      key: prod/api/database
      property: password

Diff personalizado: ignorar campos que cambian en runtime

ArgoCD puede marcar una Application como OutOfSync por campos que cambian en runtime sin ser cambios de código (replicas manejadas por HPA, timestamps de last-applied-configuration, annotations de monitoring). La configuración ignoreDifferences previene false positives de drift.

yaml
spec:
  ignoreDifferences:
  - group: apps
    kind: Deployment
    jsonPointers:
    - /spec/replicas           # ignorar réplicas gestionadas por HPA
  - group: ""
    kind: ConfigMap
    name: kube-root-ca.crt
    jsonPointers:
    - /data                    # ignorar ConfigMap de CA gestionado por Kubernetes

Preguntas frecuentes

¿Cuántas Applications puede gestionar ArgoCD antes de degradar el rendimiento?
ArgoCD escala bien hasta 1,000-2,000 Applications en un servidor estándar. Para más de eso, la arquitectura recomendada es ArgoCD con múltiples Application Controllers (sharding) o una instancia de ArgoCD por cluster gestionado. En la práctica, las empresas que tienen problemas de performance no superan las 500 Applications — el problema suele ser la frecuencia de sync, no el número de Applications.
¿Cómo gestiono el RBAC de ArgoCD para que cada equipo solo vea sus aplicaciones?
Combinando AppProjects y RBAC. Cada equipo tiene su AppProject que restringe repos, clusters y namespaces permitidos. El RBAC de ArgoCD (configmap argocd-rbac-cm) asigna roles a los equipos: p, role:team-payments, applications, *, payments-*/*, allow. Esto permite que el equipo de pagos gestione sus Applications pero no vea las del equipo de usuarios.
¿Qué pasa con las aplicaciones stateful (bases de datos) en ArgoCD?
ArgoCD gestiona StatefulSets correctamente, pero la strategy de update para bases de datos requiere más cuidado que para aplicaciones stateless. Para bases de datos en Kubernetes (PostgreSQL con CloudNativePG, Redis con operadores), es común usar resource hooks para controlar el proceso de actualización del operador y verificar la salud del cluster antes de proceder.
¿Cómo implemento rollback automático si el PostSync hook falla?
ArgoCD no hace rollback automático cuando un hook falla — marca la Application como Degraded y detiene el sync. Para rollback automático real, necesitas Argo Rollouts integrado con ArgoCD. Argo Rollouts puede hacer rollback automático basado en métricas de Prometheus (error rate, latencia) sin intervención manual, mucho más sofisticado que un simple rollback por fallo de hook.
¿Es necesario ArgoCD Image Updater o es mejor actualizar imágenes desde el pipeline CI?
Desde el pipeline CI es el enfoque más predecible y auditabe — cada actualización de imagen tiene un commit en Git con autor identificado. ArgoCD Image Updater (que detecta nuevas imágenes en el registry y actualiza automáticamente) es útil para entornos de desarrollo donde quieres deploy automático de cada push, pero en producción la visibilidad del pipeline CI es preferible.

¿Tu equipo quiere implementar patrones avanzados de despliegue con ArgoCD en producción? Tenemos experiencia operando ArgoCD en clusters empresariales.

Habla con el equipo

Artículos relacionados

IQS

Equipo de Ingeniería — IQS

Ingenieros de software, cloud y DevOps con experiencia en proyectos empresariales.