INFRA

GitOps con Argo CD y Flux: CD Declarativo para Kubernetes

Guía práctica 2026 de GitOps en Kubernetes — CD pull vs push, arquitecturas de Argo CD y Flux, Applications y ApplicationSets, el patrón app-of-apps, sync waves y hooks, Helm y Kustomize, secretos (Sealed Secrets, External Secrets, SOPS), progressive delivery con Argo Rollouts y Flagger, y flotas multi-cluster.

Por Jose Nobile | Actualizado 2026-07-26 | 24 min de lectura

Principios de GitOps: CD Pull vs Push

GitOps es un modelo operativo para Kubernetes donde Git es la única fuente de verdad del estado tanto de las aplicaciones como de la infraestructura. Describes el estado deseado de un clúster de forma declarativa — Deployments, Services, ConfigMaps, CRDs — y lo confirmas en un repositorio. Un agente dentro del clúster reconcilia continuamente el estado real hacia lo que dice Git. Cada cambio es un pull request, cada rollback es un git revert, y tu historial de commits es el registro de auditoría.

La distinción clave es CD pull vs push. En un modelo push (CI/CD clásico como GitLab CI/CD o GitHub Actions ejecutando kubectl apply), el pipeline necesita credenciales del clúster y empuja los cambios hacia adentro. En el modelo pull, un operador que corre dentro del clúster observa Git y aplica los cambios por sí mismo. Ningún sistema externo guarda credenciales de kube-admin, el drift se corrige automáticamente y el clúster puede vivir en una red privada sin acceso entrante.

Los cuatro principios de GitOps (del proyecto OpenGitOps) son: el sistema es declarativo; el estado deseado está versionado y es inmutable en Git; los cambios aprobados se traen automáticamente; y los agentes de software reconcilian continuamente y alertan ante divergencias. Argo CD y Flux son las dos herramientas graduadas por la CNCF que implementan este modelo — esta guía cubre ambas en profundidad.

# GitOps repo layout — desired state lives in Git
my-gitops-repo/
  apps/
    base/ # Kustomize/Helm base manifests
    overlays/
      staging/
      production/
  clusters/
    prod/ # Flux: per-cluster sync config
    staging/
  argocd/ # Argo CD Applications (app-of-apps)

# The core loop (pull-based):
# Git (desired) --> in-cluster agent reconciles --> live state
# drift? --> agent re-applies. CI never runs kubectl apply.

Arquitectura de Argo CD

Argo CD es un controlador GitOps declarativo con una interfaz web de primera clase, CLI y API. Su núcleo es el application-controller, que reconcilia recursos Application comparando los manifiestos deseados (renderizados desde Git) contra el estado real del clúster y reportando un estado de sync (Synced/OutOfSync) y un estado de salud. El repo-server clona Git y renderiza charts de Helm, overlays de Kustomize o YAML plano en manifiestos. El API server respalda la UI, la CLI y el RBAC/SSO.

Desde la línea 3.x, ApplicationSet y Notifications vienen incluidos en la distribución central — sin instalaciones aparte. Argo CD 3.0 integró el applicationset-controller y el controlador de notificaciones en los manifiestos por defecto, cambió el RBAC granular para que las políticas ya no se propaguen a los sub-recursos, e hizo que los selectores anidados de ApplicationSet siempre apliquen. El proyecto publica una versión menor cada trimestre aproximadamente y soporta las tres menores más recientes.

La instalación es un único manifiesto en el namespace argocd. Argo CD guarda su estado en Kubernetes (las Applications son CRDs; las credenciales de clúster y repositorio son Secrets) más Redis para caché — no hay base de datos externa. Para producción, pon el API server detrás de tu proveedor de identidad vía OIDC/SSO, habilita RBAC y corre Argo CD en su propio clúster de gestión o junto a las cargas de trabajo. La línea 3.5 refuerza aún más la seguridad de la cadena de suministro con mTLS interno entre componentes y verificación de firmas de commits de Git.

# Install Argo CD core components into the cluster
kubectl create namespace argocd
kubectl apply -n argocd \
  -f https://raw.githubusercontent.com/argoproj/argo-cd/v3.4.5/manifests/install.yaml

# Components created:
# argocd-application-controller reconciles Applications
# argocd-repo-server renders Helm/Kustomize
# argocd-server API + Web UI + gRPC
# argocd-applicationset-controller generators (in core since 3.0)
# argocd-notifications-controller alerts (in core since 3.0)
# redis cache

argocd login argocd.example.com --sso

Arquitectura de Flux

Flux (Flux CD) es un conjunto de controladores del GitOps Toolkit componibles, no un monolito. El source-controller obtiene artefactos de fuentes GitRepository, OCIRepository o HelmRepository; el kustomize-controller construye y aplica overlays de Kustomize vía server-side apply; el helm-controller gestiona objetos HelmRelease; y el notification-controller maneja webhooks entrantes y alertas salientes. Cada controlador es un reconciliador pequeño e independiente que adoptas a la carta.

No trae UI incluida — Flux se maneja por CLI y API, lo que lo hace liviano y una opción natural para equipos de plataforma y automatización de flotas. Arrancas Flux con flux bootstrap, que instala los controladores y confirma sus propios manifiestos en tu repositorio, de modo que el propio Flux se gestiona por GitOps. Los CRDs Kustomization y HelmRelease luego declaran qué sincronizar, desde qué fuente, con qué frecuencia y si hacer prune.

Flux 2.x es estable y está graduado por la CNCF. Flux 2.8 agregó soporte para Helm v4 con server-side apply y chequeos de salud más ricos; Flux 2.9 (2026) introdujo un sistema de plugins para la CLI, reglas de ignorar campos en server-side apply para control fino del drift, autenticación a AWS CodeCommit vía Workload Identity, y descubrimiento de directorios por patrones de ruta en el ArtifactGenerator para monorepos. Los controladores de automatización de imágenes permiten a Flux escribir nuevos tags de imagen de vuelta a Git.

# Bootstrap Flux and wire it to Git (Flux manages itself)
flux bootstrap github \
  --owner=my-org --repository=fleet-infra \
  --branch=main --path=clusters/prod --personal
---
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
  name: app-repo
  namespace: flux-system
spec:
  interval: 1m
  url: https://github.com/my-org/app-config
  ref: { branch: main }
---
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: apps
  namespace: flux-system
spec:
  interval: 10m
  sourceRef: { kind: GitRepository, name: app-repo }
  path: ./apps/production
  prune: true
  wait: true

Argo CD vs Flux: Cómo Elegir tu Motor de CD

Ambas herramientas están graduadas por la CNCF, son pull-based y están probadas en producción — la elección es sobre ergonomía y alcance. Argo CD te da una UI multi-tenant pulida, SSO/RBAC integrados y un modelo mental centrado en aplicaciones; brilla cuando muchos equipos o personas no expertas necesitan visibilidad de qué está desplegado y por qué está OutOfSync. Flux es un toolkit minimalista con un controlador por preocupación que compone limpiamente, tiene una huella diminuta y trata todo (incluido a sí mismo) como CRDs reconciliables — ideal para equipos de plataforma que automatizan flotas grandes.

Diferencias prácticas: Argo CD centraliza la visibilidad (una UI para todos los clústeres) y suele correrse desde un clúster de gestión que alcanza a los clústeres de carga; Flux corre una copia por clúster y se maneja enteramente por CLI/GitOps, combinándose bien con Terraform y Cluster API para el aprovisionamiento de flotas. Para progressive delivery, Argo CD se combina con Argo Rollouts, mientras que Flux se combina con Flagger. Ambas integran SOPS; ambas soportan Helm y Kustomize; ambas soportan artefactos OCI como alternativa a Git.

No tienes que elegir solo una. Un patrón común es Flux para los add-ons del clúster y componentes de plataforma (arrancados y autogestionados) con Argo CD para los equipos de aplicación que quieren una UI. Elige Argo CD cuando la experiencia de desarrollo y la visibilidad multi-tenant importen más; elige Flux cuando quieras un motor componible y de bajo overhead y gestionar todo como código. Ambas son apuestas seguras a largo plazo en 2026.

# Argo CD — rich UI, imperative-style inspection
argocd app list
argocd app get guestbook
argocd app diff guestbook
argocd app sync guestbook

# Flux — CLI over CRDs, no bundled UI
flux get kustomizations -A
flux diff kustomization apps --path=./apps/production
flux reconcile kustomization apps --with-source
flux suspend kustomization apps # pause reconciliation
flux resume kustomization apps

Applications y ApplicationSets

El CRD Application es la unidad atómica de Argo CD: apunta a una fuente (URL del repo, revisión, ruta) y a un destino (clúster + namespace), con un syncPolicy que puede ser manual o automated. La sincronización automática con prune: true elimina los recursos quitados de Git, y selfHeal: true revierte los cambios manuales en el clúster. Este único recurso es el bloque de construcción de todo lo demás.

ApplicationSet genera muchas Applications a partir de un generador, eliminando el copiar-pegar. Los generadores incluyen list (valores estáticos), git (una app por directorio o por archivo en un repo), cluster (una app por clúster registrado), matrix y merge (combinan generadores), y generadores de pull request para entornos de vista previa efímeros. Habilita goTemplate: true para expresiones completas de plantillas Go en el template de la app.

Un uso típico: un generador de directorios git que crea una Application por cada carpeta bajo tenants/*, de modo que incorporar un nuevo tenant es solo agregar un directorio y abrir un PR. Combinado con el generador cluster, un ApplicationSet puede desplegar el mismo add-on a cada clúster de tu flota automáticamente, con valores por clúster inyectados desde las etiquetas del clúster.

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: guestbook
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/my-org/app-config
    targetRevision: main
    path: apps/guestbook/overlays/prod
  destination:
    server: https://kubernetes.default.svc
    namespace: guestbook
  syncPolicy:
    automated: { prune: true, selfHeal: true }
---
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: tenants
  namespace: argocd
spec:
  goTemplate: true
  generators:
    - git:
        repoURL: https://github.com/my-org/app-config
        revision: main
        directories:
          - path: tenants/*
  template:
    metadata:
      name: '{{.path.basename}}'
    spec:
      project: default
      source:
        repoURL: https://github.com/my-org/app-config
        targetRevision: main
        path: '{{.path.path}}'
      destination:
        server: https://kubernetes.default.svc
        namespace: '{{.path.basename}}'
      syncPolicy:
        automated: { prune: true, selfHeal: true }

El Patrón App-of-Apps

El patrón app-of-apps usa una única Application raíz cuya fuente es un directorio lleno de otros manifiestos de Application. Sincronizar la raíz crea y gestiona todas las Applications hijas, dándote un solo lugar para arrancar todas las cargas de trabajo de un clúster. Es la forma clásica de declarar 'todo lo que corre este clúster' en una ruta de Git y dejar que Argo CD lo despliegue en abanico.

App-of-apps es ideal para el bootstrap: apunta una app raíz a argocd/apps/, confirma ahí los YAMLs de Application hijos, y cada archivo nuevo se convierte en una aplicación gestionada en la próxima sincronización. Mantiene el orden simple y hace que el inventario completo del clúster sea revisable en un solo PR. Muchos equipos lo combinan con sync waves para que los componentes de plataforma (CNI, ingress, cert-manager) suban antes que las cargas de aplicación.

Para conjuntos dinámicos, ApplicationSet suele ser la mejor opción moderna — genera hijas de forma programática en vez de requerir un archivo YAML por app. Un híbrido común es una raíz app-of-apps que incluye uno o más ApplicationSets: la raíz te da un único punto de arranque, y los ApplicationSets manejan el abanico repetitivo (por tenant, por clúster). Usa app-of-apps para la estructura y ApplicationSet para la escala.

# Root "app of apps": one Application that points at a
# directory full of child Application manifests.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: root
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/my-org/gitops
    targetRevision: main
    path: argocd/apps # dir of Application YAMLs
  destination:
    server: https://kubernetes.default.svc
    namespace: argocd
  syncPolicy:
    automated: { prune: true, selfHeal: true }
    syncOptions: [CreateNamespace=true]

Sync Waves y Resource Hooks

Argo CD aplica todos los recursos de una sincronización juntos por defecto, pero los despliegues reales necesitan orden. Los sync waves lo imponen: anota los recursos con argocd.argoproj.io/sync-wave: "N" y Argo CD aplica primero los números menores, esperando a que los recursos de cada wave estén sanos antes de empezar el siguiente. Usa waves negativas para prerrequisitos (namespaces, CRDs) y waves más altas para cargas dependientes.

Los resource hooks corren en fases de una sincronización: PreSync (por ejemplo, un Job de migración de base de datos antes de que la app se despliegue), Sync, PostSync (pruebas de humo después) y SyncFail (limpieza ante fallos). Anota un recurso con argocd.argoproj.io/hook y controla la limpieza con hook-delete-policy (por ejemplo, HookSucceeded para borrar un Job una vez que pasa). Los hooks son la forma de tejer pasos imperativos dentro de una sincronización declarativa.

Flux expresa la misma intención de otra manera: el orden viene de dependsOn entre objetos Kustomization o HelmRelease, y el gating por salud usa wait: true con healthChecks para que un dependiente no reconcilie hasta que su prerrequisito esté Ready. Los hooks de Helm siguen funcionando en ambas herramientas para pasos de ciclo de vida a nivel de chart. Elige sync waves/hooks en Argo CD y dependsOn en Flux para modelar el orden de despliegue.

# Ordering with sync waves (lower numbers apply first)
apiVersion: v1
kind: Namespace
metadata:
  name: app
  annotations:
    argocd.argoproj.io/sync-wave: "-1"
---
# PreSync hook: run a DB migration before the app rolls out
apiVersion: batch/v1
kind: Job
metadata:
  name: db-migrate
  annotations:
    argocd.argoproj.io/hook: PreSync
    argocd.argoproj.io/hook-delete-policy: HookSucceeded
spec:
  template:
    spec:
      restartPolicy: Never
      containers:
        - name: migrate
          image: my-org/migrator:1.4.2
          command: ["/app/migrate", "up"]

Integración con Helm y Kustomize

Ambas herramientas renderizan manifiestos con las mismas herramientas del ecosistema en vez de reinventar el templating. En Argo CD, la source de una Application puede apuntar a un chart de Helm (con helm.values, valueFiles y releaseName) o a un directorio de Kustomize — el repo-server ejecuta helm template o kustomize build y aplica el resultado. Ten en cuenta que Argo CD instala charts renderizándolos, así que los hooks de Helm se mapean a los hooks de Argo CD.

Flux mantiene Helm verdaderamente nativo vía el helm-controller y el CRD HelmRelease, ejecutando releases reales de Helm (con historial y rollback) y, desde Flux 2.8, Helm v4 con server-side apply. Kustomize lo maneja el kustomize-controller aplicando overlays del lado del servidor. Las fuentes — Git, un registro OCI o un repositorio Helm — están desacopladas del release, así que puedes fijar una versión de chart y reconciliar en un intervalo.

Una buena práctica con cualquiera de las dos es base + overlays: una base de Kustomize con overlays por entorno (staging/producción) o un chart con values-*.yaml por entorno. Mantén las diferencias entre entornos en los values y patches, no en manifiestos bifurcados. Fija las versiones de chart e imagen de forma explícita para que una reconciliación sea reproducible, y deja que GitOps — no un helm upgrade desde un portátil — sea la única vía a producción.

# Argo CD Application driving a Helm chart with values
spec:
  source:
    repoURL: https://github.com/my-org/charts
    targetRevision: main
    path: charts/api
    helm:
      releaseName: api
      valueFiles: [values-prod.yaml]
      values: |
        replicaCount: 4
        image:
          tag: 1.9.0
---
# Flux HelmRelease (Helm v4, server-side apply)
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
  name: api
  namespace: apps
spec:
  interval: 5m
  chart:
    spec:
      chart: api
      version: "1.9.x"
      sourceRef: { kind: HelmRepository, name: my-charts }
  values:
    replicaCount: 4

Prefiere artefactos OCI sobre repos de Helm basados en ramas para la integridad de la cadena de suministro: publica charts y manifiestos en un registro OCI, referéncialos por digest inmutable, y tanto Argo CD como Flux pueden verificar firmas (cosign) antes de aplicar. Esto convierte 'qué está desplegado' en un hecho verificable criptográficamente en vez de 'lo que apunte HEAD en este momento'.

Secretos: Sealed Secrets, ESO, SOPS

Los Secrets planos de Kubernetes solo están codificados en base64, así que confirmarlos en Git es inseguro. GitOps tiene tres respuestas principales. Sealed Secrets (Bitnami) cifra un Secret con una clave pública cuya mitad privada nunca sale del clúster; el SealedSecret resultante es seguro para confirmar, y el controlador dentro del clúster lo descifra en un Secret real. No necesita ningún sistema externo — ideal para clústeres autocontenidos.

El External Secrets Operator (ESO) mantiene los secretos en un vault real (AWS Secrets Manager, GCP Secret Manager, Azure Key Vault, HashiCorp Vault y más de 40 proveedores) y los sincroniza a Kubernetes vía un ExternalSecret que referencia un SecretStore. Git solo guarda punteros, nunca texto cifrado; la rotación ocurre en el vault y ESO refresca en un intervalo. Las APIs v1 de ESO son GA, y es la opción por defecto cuando ya corres un gestor de secretos en la nube.

SOPS (con age o KMS) cifra los valores de los secretos en el lugar para que el YAML siga siendo amigable a los diffs y revisable. Flux descifra SOPS de forma nativa — configura decryption.provider: sops en una Kustomization con un Secret de clave age — y Argo CD lo soporta vía el ecosistema KSOPS / argocd-vault-plugin. Regla práctica: Sealed Secrets para necesidades simples locales al clúster, ESO cuando un vault es la fuente de verdad, SOPS para cifrado a nivel de archivo que vive en Git.

# 1) Sealed Secrets — encrypt for THIS cluster, commit safely
kubectl create secret generic db --dry-run=client \
  --from-literal=password=s3cr3t -o yaml \
  | kubeseal --format yaml > sealedsecret.yaml # commit this
---
# 2) External Secrets Operator — pull from a cloud vault
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata: { name: db }
spec:
  refreshInterval: 1h
  secretStoreRef: { name: aws-sm, kind: ClusterSecretStore }
  target: { name: db }
  data:
    - secretKey: password
      remoteRef: { key: prod/db, property: password }
---
# 3) SOPS + age — Flux decrypts on apply
# sops --encrypt --age $AGE_PUB secret.yaml > secret.enc.yaml
# On the Kustomization:
spec:
  decryption:
    provider: sops
    secretRef: { name: sops-age }

Progressive Delivery: Argo Rollouts y Flagger

El progressive delivery reemplaza los despliegues de golpe con lanzamientos canary y blue-green automatizados y controlados por métricas. En el ecosistema Argo, Argo Rollouts introduce un CRD Rollout que reemplaza a un Deployment y define pasos explícitos — poner 20% de peso, pausar, ejecutar un AnalysisTemplate contra Prometheus, y luego avanzar o hacer auto-rollback. Te da control preciso y ordenado y se integra con la UI de Argo CD.

Flagger toma el enfoque opuesto: mantienes un Deployment estándar, y un recurso Canary describe el análisis (peso por paso, intervalo, umbrales de métricas). Flagger sube el tráfico automáticamente según stepWeight en cada intervalo mientras las métricas pasen, y hace rollback ante una violación — sin lista manual de pasos. Nació en el mundo del service mesh y dirige el tráfico vía Istio, Linkerd, App Mesh, Gateway API o controladores de ingress soportados.

Cómo elegir entre ellos: Argo Rollouts requiere migrar los Deployments al CRD Rollout pero da control explícito paso a paso y una gran UI — un compañero natural de Argo CD. Flagger no necesita cambios de manifiesto en tus cargas y automatiza la progresión declarativamente — un compañero natural de Flux. Ambos soportan canary, blue-green y análisis de métricas vía Prometheus/Datadog/etc.; ambos son de grado producción en 2026. Empareja la herramienta con tu motor de CD y con cuánto control manual quieras.

# Argo Rollouts — explicit, ordered canary steps
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata: { name: api }
spec:
  replicas: 5
  strategy:
    canary:
      steps:
        - setWeight: 20
        - pause: { duration: 2m }
        - analysis:
            templates: [{ templateName: success-rate }]
        - setWeight: 60
        - pause: { duration: 5m }
      trafficRouting:
        istio:
          virtualService: { name: api }
---
# Flagger — automated canary driven by metrics (no step list)
apiVersion: flagger.app/v1beta1
kind: Canary
metadata: { name: api }
spec:
  targetRef: { apiVersion: apps/v1, kind: Deployment, name: api }
  analysis:
    interval: 1m
    threshold: 5
    stepWeight: 10
    maxWeight: 50
    metrics:
      - name: request-success-rate
        thresholdRange: { min: 99 }
        interval: 1m

GitOps Multi-Cluster

GitOps brilla en las flotas. Argo CD soporta multi-cluster desde un plano de control central: registra clústeres externos con argocd cluster add (guarda un Secret por clúster con el endpoint de la API y credenciales), y luego apúntalos desde el destination.server de una Application. Un solo Argo CD puede gestionar decenas de clústeres, con la UI dando un único panel de control sobre todos ellos.

Para escalar esto sin escribir a mano una Application por clúster, usa un ApplicationSet con el generador de cluster: emite una Application por clúster registrado, inyectando el nombre del clúster, la URL del servidor y las etiquetas en el template. Así es como los equipos despliegan add-ons de plataforma (ingress, cert-manager, monitoreo) a una flota entera desde un solo manifiesto, con overrides por clúster impulsados por etiquetas en el Secret del clúster.

El modelo de Flux es un Flux por clúster, cada uno arrancado en su propia ruta dentro de un repo 'fleet' compartido — una estructura que combina naturalmente con Cluster API y Terraform para el aprovisionamiento. No hay UI central, pero la autonomía por clúster mejora el aislamiento del radio de impacto. Ambos enfoques funcionan a escala; elige control central (Argo CD) para visibilidad unificada, o reconciliadores descentralizados (Flux) para aislamiento y gestión de flotas como infraestructura-como-código.

# Register external clusters with the central Argo CD
argocd cluster add prod-eu --name prod-eu
argocd cluster add prod-us --name prod-us
---
# Fan one app out to every registered cluster
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata: { name: addons, namespace: argocd }
spec:
  goTemplate: true
  generators:
    - clusters: {} # every cluster secret in argocd ns
  template:
    metadata: { name: 'addons-{{.name}}' }
    spec:
      project: default
      source:
        repoURL: https://github.com/my-org/addons
        targetRevision: main
        path: base
      destination:
        server: '{{.server}}'
        namespace: kube-system
      syncPolicy:
        automated: { prune: true, selfHeal: true }

Detección de Drift, Self-Heal y Sync Policies

El bucle de reconciliación es lo que hace que GitOps sea más que 'CI que ejecuta kubectl'. El syncPolicy.automated de Argo CD con selfHeal: true significa que cualquier kubectl edit manual que se desvíe de Git se detecta y revierte; prune: true elimina los recursos que quitaste de Git. Sin automatización, Argo CD igual detecta el drift y muestra OutOfSync, dejando la sincronización a una persona — útil para producción con control de cambios.

Ajusta el comportamiento con syncOptions: ServerSideApply=true para aplicaciones conscientes del field-manager, CreateNamespace=true, PrunePropagationPolicy=foreground, y un backoff de retry para sincronizaciones inestables. Usa ignoreDifferences para dejar de pelear con otros controladores — por ejemplo, ignora /spec/replicas en un Deployment gestionado por un HPA, o ignora campos que inyecta un webhook mutante, para que Argo CD no reporte un drift perpetuo.

Flux reconcilia en un interval y hace cumplir el estado deseado con server-side apply; prune: true en una Kustomization recolecta los recursos eliminados, y las reglas de ignorar campos de Flux 2.9 te dejan eximir rutas específicas de la corrección de drift. En ambas herramientas, el bucle de reconciliación más las alertas (Argo CD Notifications, o el notification-controller de Flux hacia Slack/webhooks) es lo que convierte a Git en una fuente de verdad forzada y observable.

spec:
  syncPolicy:
    automated:
      prune: true # delete resources removed from Git
      selfHeal: true # revert manual kubectl drift
      allowEmpty: false
    syncOptions:
      - CreateNamespace=true
      - ServerSideApply=true
      - PrunePropagationPolicy=foreground
    retry:
      limit: 5
      backoff: { duration: 5s, factor: 2, maxDuration: 3m }
  # Stop fighting other controllers (e.g. an HPA owns replicas)
  ignoreDifferences:
    - group: apps
      kind: Deployment
      jsonPointers: [/spec/replicas]

Integración CI/CD y Automatización de Imágenes

GitOps separa deliberadamente CI de CD. Tu pipeline de GitLab CI/CD o GitHub Actions compila y prueba el código, publica una imagen inmutable y fijada por digest en un registro, y luego actualiza el estado deseado en el repo de configuración — nunca ejecuta kubectl apply contra el clúster. El agente en el clúster (Argo CD o Flux) toma el commit y reconcilia. Esto mantiene las credenciales del clúster completamente fuera de CI.

Ese paso de 'actualizar el repo de configuración' lo automatiza la automatización de imágenes. El image-reflector-controller y el image-automation-controller de Flux escanean un registro (ImageRepository), seleccionan un tag mediante un ImagePolicy (semver, numérico o regex), y confirman el nuevo tag de vuelta a Git vía ImageUpdateAutomation — cerrando el ciclo con cero acceso del pipeline al clúster. Argo CD ofrece el equivalente vía Argo CD Image Updater.

Mantén dos repositorios: un repo de app (código fuente, CI) y un repo de configuración (manifiestos, la fuente de verdad de GitOps). CI escribe solo el digest/tag de la imagen en el repo de configuración; CD lo reconcilia. Combínalo con progressive delivery para que un nuevo tag dispare un canary, y con verificación de firmas (cosign) para que solo se promuevan imágenes firmadas. Este es el pipeline canónico y seguro de 2026: compilar → firmar → actualizar manifiesto → reconciliar por GitOps → despliegue progresivo.

Caso Real: GitOps en Producción

En producción, GitOps es la columna vertebral de despliegue para una flota de clústeres Kubernetes que corre decenas de microservicios. Cada cambio — subidas de versión de aplicación, configuración, add-ons de plataforma — fluye a través de un repo de configuración en Git y es reconciliado por un agente dentro del clúster. Nada llega a un clúster salvo mediante un commit revisado y versionado, y los rollbacks están a un git revert de distancia.

Flota Declarativa

Un repo de configuración maneja cada clúster. Los generadores de cluster de ApplicationSet despliegan add-ons de plataforma (ingress, cert-manager, monitoreo) por toda la flota, con valores por clúster desde etiquetas. Agregar un clúster es un PR, no un runbook.

Sin Credenciales de Clúster en CI

CI compila, firma y actualiza un digest de imagen en Git; el agente dentro del clúster reconcilia. Los pipelines nunca tienen credenciales de kube-admin, y los clústeres no aceptan tráfico de despliegue entrante — una gran reducción de la superficie de ataque.

Auto-Reparación + Auditoría

La sincronización automática con self-heal revierte el drift en minutos; el prune elimina recursos huérfanos. Cada despliegue, rollback y cambio de configuración es un commit auditable, y el progressive delivery controla los lanzamientos con métricas en vivo.

Últimas Características de Argo CD y Flux (2025-2026)

Argo CD 3.x (ApplicationSet + Notifications en el núcleo): A partir de Argo CD 3.0, el controlador ApplicationSet y el controlador de Notifications vienen en los manifiestos de instalación por defecto — ya no hay despliegues separados de Argoproj-Labs. 3.0 también endureció el RBAC granular (las políticas ya no se propagan a los sub-recursos) e hizo que los selectores anidados de ApplicationSet siempre apliquen. La línea 3.x sigue una cadencia menor trimestral con las tres menores más recientes soportadas.

Argo CD 3.4 / 3.5 (endurecimiento de la cadena de suministro): Los releases 3.x recientes se enfocan en seguridad y escala; v3.4.5 (julio de 2026) es el release estable actual. La línea 3.5 — todavía en release candidate a julio de 2026 — agrega soporte de mTLS en el repo-server y verificación opcional de integridad de las fuentes dry del hydrator (alpha), además de mejoras en la gestión nativa de ApplicationSet. Combinado con fuentes de artefactos OCI y verificación cosign, Argo CD puede forzar que solo se sincronicen a un clúster manifiestos firmados y atestados.

Flux 2.9 (junio de 2026): Flux 2.9 introdujo un sistema de plugins para la CLI (con los plugins Mirror y Schema), reglas de ignorar campos en server-side apply para control fino del drift, autenticación a AWS CodeCommit vía Workload Identity, y descubrimiento de directorios por patrones de ruta en el ArtifactGenerator para gestionar artefactos en monorepos. Se apoya en Flux 2.8, que trajo soporte de Helm v4 con server-side apply y chequeos de salud mejorados.

OCI como fuente GitOps de primera clase: Ambas herramientas ahora tratan los registros OCI como un par de Git para entregar manifiestos y charts. Empaquetar la configuración como un artefacto OCI inmutable y direccionado por digest — publicado por CI, verificado por cosign, referenciado por OCIRepository (Flux) o una fuente de tipo OCI (Argo CD) — da despliegues reproducibles y a prueba de manipulaciones y desacopla el artefacto de entrega del churn de ramas.

External Secrets Operator v1 GA y ESO 2.x: Las APIs centrales de ESO alcanzaron la estabilidad v1 y la línea 2.x (2.8 a julio de 2026) abarca más de 40 proveedores, haciendo de los vaults externos la forma dominante de mantener el texto cifrado fuera de Git. Junto con SOPS+age para cifrado a nivel de archivo y Sealed Secrets para necesidades locales al clúster, los equipos tienen ahora una historia de secretos madura y en capas que se adapta a cualquier topología GitOps.

El progressive delivery se vuelve estándar: Argo Rollouts (con Argo CD) y Flagger (con Flux) son ambos estándar de producción en 2026, con el enrutamiento de tráfico de Gateway API sumándose a las opciones de Istio/Linkerd/mesh. El pipeline moderno canónico es compilar → firmar (cosign) → actualizar manifiesto vía automatización de imágenes → reconciliar por GitOps → canary controlado por métricas — un camino de extremo a extremo donde cada paso es declarativo, versionado y verificable.

3.0

ApplicationSet + Notifications en el Núcleo

Desde Argo CD 3.0 ambos vienen en los manifiestos por defecto. El RBAC ya no se propaga a sub-recursos; los selectores anidados de ApplicationSet siempre aplican.

3.5 RC

Argo CD 3.5 mTLS + Commits Firmados

El mTLS del repo-server y la verificación opcional de integridad de las fuentes endurecen la cadena de suministro. Aún en release candidate; v3.4.5 es el estable actual. Menores trimestrales, tres más recientes soportadas.

2.9

Flux 2.9 (junio de 2026)

Sistema de plugins para la CLI, reglas de ignorar campos en server-side apply, Workload Identity para AWS CodeCommit y patrones de ruta del ArtifactGenerator para monorepos.

OCI

Fuentes OCI + cosign

Ambas herramientas consumen artefactos OCI fijados por digest y verifican firmas antes de aplicar — entrega reproducible y a prueba de manipulaciones más allá del HEAD de una rama.

ESO 2.x

External Secrets Operator 2.x

APIs v1 GA, más de 40 proveedores. Mantén el texto cifrado fuera de Git con vaults en la nube; combina con SOPS+age y Sealed Secrets para una historia de secretos completa.

GA

Progressive Delivery Estándar

Argo Rollouts + Argo CD y Flagger + Flux, ahora con enrutamiento de tráfico de Gateway API. Los canaries controlados por métricas son el lanzamiento seguro por defecto en 2026.

# Flux 2.9 image automation: bump image tags back to Git
apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImagePolicy
metadata: { name: api, namespace: flux-system }
spec:
  imageRepositoryRef: { name: api }
  policy:
    semver: { range: ">=1.9.0" }
---
apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImageUpdateAutomation
metadata: { name: api, namespace: flux-system }
spec:
  interval: 5m
  sourceRef: { kind: GitRepository, name: flux-system }
  git:
    commit:
      author: { name: fluxbot, email: [email protected] }
    push: { branch: main }

Más Guías