nubyron · DevOps · GitOps
Abril 2026 · 10 min de lectura
GitOps lleva varios años siendo el buzzword favorito de las charlas de KubeCon, pero en 2026 ha pasado de experimento a estándar de facto en organizaciones que despliegan sobre Kubernetes. La promesa es simple: Git como fuente de verdad única, y el clúster reconciliándose continuamente con ese estado declarado.
El problema no es si adoptar GitOps, sino cuál de los dos grandes proyectos elegir: ArgoCD —el favorito de los equipos que priorizan visibilidad y experiencia de usuario— o Flux v2 —la apuesta de quienes valoran la arquitectura composable y el control fino sobre la reconciliación—. Este post te da los elementos técnicos y contextuales para tomar esa decisión con criterio.
¿Qué es GitOps de verdad (más allá del hype)?
GitOps no es simplemente "guardar los manifiestos en Git". El término, acuñado por Weaveworks en 2017, implica un modelo operativo con cuatro principios fundamentales definidos por el OpenGitOps Working Group:
- Declarativo: todo el sistema se describe como estado deseado, no como procedimientos.
- Versionado e inmutable: el estado deseado se almacena en Git con historial completo.
- Pulled automáticamente: el agente en el clúster extrae los cambios; nunca se empuja desde fuera.
- Reconciliado continuamente: el agente detecta y corrige desviaciones (drift) de forma continua.
Clave práctica: el modelo pull es lo que diferencia GitOps de un pipeline CI/CD clásico. En CI/CD tradicional, el pipeline empuja al clúster (push). En GitOps, el agente dentro del clúster observa el repositorio y se sincroniza. Esto elimina credenciales de Kubernetes en el CI y reduce drásticamente la superficie de ataque.
El flujo básico en producción funciona así:
# El desarrollador solo hace esto:
git commit -m "feat: actualizar imagen a v2.1.0"
git push origin main
# El agente GitOps (ArgoCD o Flux) detecta el cambio
# compara el estado deseado con el estado actual
# y aplica la diferencia al clúster automáticamente
Nada de kubectl apply manuales, nada de secretos de cluster en el CI, y rollback instantáneo con un simple git revert.
ArgoCD: visibilidad y experiencia como arma principal
// Proyecto CNCF Graduated · Lanzado por Intuit en 2018ArgoCD nació como respuesta a un problema real en Intuit: cómo gestionar cientos de aplicaciones en Kubernetes manteniendo visibilidad. Su apuesta diferencial es su interfaz web, que convierte la reconciliación GitOps en algo que cualquier miembro del equipo puede entender con un vistazo.
Instalación en minutos
# Crear namespace
kubectl create namespace argocd
# Instalar ArgoCD (manifest oficial)
kubectl apply -n argocd -f \
https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
# Esperar que los pods estén listos
kubectl wait --for=condition=Ready pods --all \
-n argocd --timeout=120s
# Obtener la contraseña inicial del admin
kubectl -n argocd get secret argocd-initial-admin-secret \
-o jsonpath="{.data.password}" | base64 -d
# Port-forward para acceder a la UI
kubectl port-forward svc/argocd-server -n argocd 8080:443
Definir tu primera Application
# application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: mi-servicio
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/nubyron/infra-gitops
targetRevision: HEAD
path: apps/mi-servicio
destination:
server: https://kubernetes.default.svc
namespace: produccion
syncPolicy:
automated:
prune: true # elimina recursos huérfanos
selfHeal: true # corrige cambios manuales (drift)
syncOptions:
- CreateNamespace=true
- PrunePropagationPolicy=foreground
retry:
limit: 5
backoff:
duration: 5s
factor: 2
maxDuration: 3m
El patrón App-of-Apps
Cuando gestionas decenas de aplicaciones, el patrón App-of-Apps es esencial: una Application raíz que apunta a un directorio de otras Applications. El resultado es un árbol de dependencias gestionado completamente desde Git.
# root-app.yaml — la Application que gestiona todas las demás
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: root-app
namespace: argocd
spec:
source:
repoURL: https://github.com/nubyron/infra-gitops
path: apps # directorio con múltiples Application manifests
targetRevision: HEAD
destination:
server: https://kubernetes.default.svc
namespace: argocd
syncPolicy:
automated:
prune: true
selfHeal: true
ApplicationSets: escalado dinámico
Para escenarios multi-cluster o multi-entorno, ApplicationSets es el recurso que permite generar Applications dinámicamente a partir de generadores (lista, Git, cluster, matrix):
# applicationset-multienv.yaml
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: mi-servicio-multienv
spec:
generators:
- matrix:
generators:
- clusters: {} # itera sobre todos los clusters registrados
- list:
elements:
- env: staging
- env: production
template:
metadata:
name: 'mi-servicio-{{name}}-{{env}}'
spec:
source:
repoURL: https://github.com/nubyron/infra-gitops
targetRevision: HEAD
path: 'envs/{{env}}/mi-servicio'
destination:
server: '{{server}}'
namespace: mi-servicio
ArgoCD · Fortalezas
- ✓ UI web excepcional para visualizar el estado
- ✓ ApplicationSets para multi-cluster dinámico
- ✓ SSO/RBAC integrado listo para producción
- ✓ Health checks personalizados por recurso
- ✓ Soporte nativo Helm, Kustomize, Jsonnet
- ✓ Gran ecosistema de plugins (argocd-image-updater)
ArgoCD · Debilidades
- ✓ Componentes monolíticos (mayor footprint)
- ✓ Todo gestionado via CRDs de ArgoCD (acoplamiento)
- ✓ El servidor de API es un SPOF potencial
- ✓ Curva de aprendizaje de Rego en políticas
- ✓ Actualizaciones de imágenes menos elegantes
Flux v2: composabilidad y control fino sobre la reconciliación
// Proyecto CNCF Graduated · Arquitectura basada en controladoresFlux v2 rompió completamente con su versión anterior y adoptó una arquitectura basada en controladores especializados siguiendo el patrón operator de Kubernetes. No hay un servidor central: cada componente de Flux es un controlador independiente que puede instalarse o no según tus necesidades.
Instalación con flux CLI
# Instalar el CLI de Flux
curl -s https://fluxcd.io/install.sh | sudo bash
# Verificar prerequisitos del clúster
flux check --pre
# Bootstrap con GitHub (crea el repo si no existe)
flux bootstrap github \
--owner=nubyron \
--repository=infra-gitops \
--branch=main \
--path=./clusters/produccion \
--personal
# Resultado: Flux instala sus componentes en el clúster
# y comite los manifests de instalación en el repo de Git
# El clúster ahora se gestiona a sí mismo desde Git
Anatomía de Flux v2: los controladores clave
# GitRepository — define la fuente Git a monitorizar
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
name: infra-gitops
namespace: flux-system
spec:
interval: 1m
url: https://github.com/nubyron/infra-gitops
ref:
branch: main
secretRef:
name: github-credentials
---
# Kustomization — reconcilia un directorio del repo
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: mi-servicio
namespace: flux-system
spec:
interval: 5m
sourceRef:
kind: GitRepository
name: infra-gitops
path: ./apps/mi-servicio
prune: true
wait: true # espera a que los recursos estén Ready
timeout: 5m
healthChecks:
- apiVersion: apps/v1
kind: Deployment
name: mi-servicio
namespace: produccion
Ventaja clave: dependencias entre Kustomizations
Una de las funcionalidades más potentes de Flux que no tiene equivalente directo en ArgoCD: definir dependencias explícitas entre Kustomizations para garantizar el orden de despliegue:
# La infraestructura debe estar lista antes de desplegar las apps
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: apps
spec:
dependsOn:
- name: infrastructure # espera a que esta Kustomization esté Ready
- name: cert-manager
interval: 10m
path: ./apps
sourceRef:
kind: GitRepository
name: infra-gitops
prune: true
Actualización automática de imágenes con Image Automation
# Monitorizar nuevas imágenes en el registry
apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImageRepository
metadata:
name: mi-servicio
spec:
image: ghcr.io/nubyron/mi-servicio
interval: 5m
---
# Política de selección: solo versiones semver estables
apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImagePolicy
metadata:
name: mi-servicio
spec:
imageRepositoryRef:
name: mi-servicio
policy:
semver:
range: '>=1.0.0'
---
# Automation: comitea el cambio de imagen en Git automáticamente
apiVersion: image.toolkit.fluxcd.io/v1beta1
kind: ImageUpdateAutomation
metadata:
name: flux-system
spec:
interval: 30m
sourceRef:
kind: GitRepository
name: infra-gitops
git:
checkout:
ref:
branch: main
commit:
author:
email: fluxbot@nubyron.com
name: FluxBot
messageTemplate: 'chore: actualizar {{range .Updated.Images}}{{.}}{{end}}'
push:
branch: main
update:
strategy: Setters
Flux v2 · Fortalezas
- ✓ Arquitectura modular (solo instalas lo que usas)
- ✓ Dependencias entre Kustomizations nativas
- ✓ Sin servidor central: menor SPOF
- ✓ Image automation elegante y nativa
- ✓ Multi-tenancy con namespace isolation real
- ✓ Bootstrap GitOps del propio Flux desde Git
Flux v2 · Debilidades
- ✓ Sin UI web oficial (depende de Weave GitOps)
- ✓ Curva de aprendizaje más alta
- ✓ Debugging más complejo sin UI
- ✓ Menos plugins de terceros disponibles
- ✓ Documentación más dispersa
Comparativa detallada: criterios que importan en producción
| Criterio | ArgoCD | Flux v2 |
|---|---|---|
| Interfaz web | Excelente nativa | Weave GitOps (externa) |
| Arquitectura | Servidor centralizado + controladores | Solo controladores (sin servidor) |
| Multi-tenancy | Projects + RBAC AppProject | Namespace isolation nativa con ServiceAccounts |
| Multi-cluster | ApplicationSets muy potente | Cluster API integration |
| Soporte Helm | Integración Helm nativa | HelmRelease con control fino de versiones |
| Soporte Kustomize | Nativo | Primera clase |
| Image automation | Plugin argocd-image-updater | Nativa con ImagePolicy |
| Dependencias entre apps | Sync waves (limitado) | dependsOn explícito |
| Drift detection | Excelente + visual | Bueno (reconciliación continua) |
| Footprint de recursos | ~150–300 MB RAM total | ~60–120 MB RAM total |
| RBAC/SSO | Integrado (OIDC, LDAP, GitHub) | Delega a Kubernetes RBAC |
| Notificaciones | Plugin notifications | notification-controller nativo |
| Madurez CNCF | Graduated | Graduated |
| Velocidad de bootstrap | Manual inicial + GitOps tras setup | 100% GitOps desde el día 0 |
¿Cuál elegir? La guía de decisión
No hay una respuesta universal. El criterio de elección depende de tres factores: el perfil de tu equipo, la complejidad de tu entorno, y la importancia que le das a la experiencia operativa del día a día.
Elige ArgoCD si…
- Tu equipo necesita visibilidad visual del estado
- Tienes perfiles menos técnicos que deben operar el clúster
- Gestionas muchas apps en múltiples clusters (ApplicationSets)
- Necesitas SSO/RBAC sin configuración extra
- Tu organización valora la adopción rápida
- Usas herramientas heterogéneas (Helm + Kustomize + Jsonnet)
Elige Flux v2 si…
- Tu equipo es sólido técnicamente y prefiere CLI
- Necesitas multi-tenancy con aislamiento fuerte
- Quieres el menor footprint posible
- Las dependencias entre componentes son complejas
- Quieres que el propio Flux se gestione desde Git desde el día 0
- La image automation es un requisito core
El patrón híbrido existe: algunas organizaciones usan Flux para gestionar la infraestructura (cert-manager, ingress, monitoring) y ArgoCD para las aplicaciones de negocio, aprovechando la UI de ArgoCD donde más valor aporta. No es lo más común, pero funciona.
Rollback: la operación que más importa en producción
Con ArgoCD:
# Ver el historial de sync
argocd app history mi-servicio
# Rollback a un revision anterior (desde UI o CLI)
argocd app rollback mi-servicio 3
# O el rollback gitops puro: revert en Git
git revert HEAD --no-edit
git push origin main
# ArgoCD detecta el cambio y reconcilia automáticamente
Con Flux:
# Ver el estado de reconciliación
flux get kustomizations --watch
# Suspender la reconciliación momentáneamente
flux suspend kustomization mi-servicio
# El rollback GitOps: revert en Git
git revert HEAD --no-edit
git push origin main
# Reanudar la reconciliación
flux resume kustomization mi-servicio
# Forzar reconciliación inmediata
flux reconcile kustomization mi-servicio --with-source
Trampa común: en ambas herramientas, activar prune: true sin
entenderlo bien puede eliminar recursos que no deberían eliminarse. Actívalo con cuidado en
producción y testéalo exhaustivamente en staging primero.
Conclusión accionable
ArgoCD y Flux son ambos excelentes. La diferencia real no está en las capacidades técnicas —están a la par en lo esencial— sino en el modelo mental que adopta tu equipo y en la experiencia que quieres ofrecer a quien opera la plataforma.
Si tuviéramos que resumirlo: ArgoCD para equipos que operan, Flux para equipos que construyen plataformas. Y en cualquier caso, ambos son infinitamente mejores que seguir haciendo kubectl apply a mano.
- 01Evalúa el perfil de tu equipo: ¿necesitan UI o están cómodos con CLI y CRDs? Esa respuesta decide el 70% de la elección.
- 02Instala ambos en un clúster de prueba con
kindy despliega la misma aplicación con cada uno. El feeling operativo es insustituible. - 03Define tu estructura de repositorios antes de instalar nada. Mono-repo vs multi-repo es una decisión de arquitectura, no de herramienta.
- 04Activa
selfHeal/prune(ArgoCD) oprune(Flux) solo cuando entiendas completamente qué recursos gestiona cada Application/Kustomization. - 05Empieza con un entorno no crítico, mide los tiempos de reconciliación y define tus SLOs de sincronización antes de ir a producción.
nubyron
DevOps · Cloud · DevSecOps · FinOps