DevOps · GitOps|14 min de lectura|

GitOps para Empresas con ArgoCD

GitOps es un modelo operacional donde el estado declarativo de tu infraestructura y aplicaciones vive en Git, y un operador automatizado reconcilia continuamente el estado actual del cluster contra ese estado deseado. Para empresas, esto no es solo una mejora de proceso — transforma la responsabilidad operacional: todo cambio a producción tiene autor, timestamp, revisión y puede revertirse en segundos. Esta guía documenta la implementación de GitOps con ArgoCD en entornos empresariales reales.

Por qué GitOps cambia la operación empresarial

El modelo push-based tradicional (el pipeline de CI aplica cambios directamente al cluster con kubectl) tiene problemas fundamentales de auditoría y consistencia. ¿Qué versión está exactamente en producción ahora? ¿Quién aplicó el último cambio y cuándo? ¿Puedo reproducir el estado exacto del cluster? Con GitOps, todas estas preguntas tienen respuesta en el historial de Git.

El beneficio menos mencionado: GitOps convierte los cambios manuales en producción en no persistentes por diseño. ArgoCD detecta cualquier desviación del estado declarado en Git y la revierte automáticamente. Esto elimina la práctica de aplicar hotfixes directamente al cluster sin documentar — una de las fuentes más frecuentes de incidentes difíciles de diagnosticar.

ArgoCD: configuración base para producción

ArgoCD introduce el concepto de Application como recurso de Kubernetes. Cada Application define qué repositorio Git observar, en qué path encontrar los manifiestos, y en qué cluster/namespace aplicarlos.

yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: api-production
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/empresa/infra-gitops.git
    targetRevision: main
    path: apps/api/production
  destination:
    server: https://kubernetes.default.svc
    namespace: production
  syncPolicy:
    automated:
      prune: true       # elimina recursos no definidos en Git
      selfHeal: true    # revierte cambios manuales al cluster
    syncOptions:
    - CreateNamespace=true

selfHeal: true activa la reconciliación automática contra drift. prune: true elimina recursos del cluster que ya no están definidos en Git. Para cambios de alta criticidad, es recomendable deshabilitar automated y requerir sync manual con aprobación — el balance entre automatización y control depende del SLA del servicio.

App of Apps: arquitectura para múltiples equipos

El patrón App of Apps permite que una Application raíz gestione las demás aplicaciones como código. En lugar de crear cada Application manualmente por interfaz o kubectl, defines una root app que observa un directorio con los manifiestos de todas las demás applications.

yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: root-apps
  namespace: argocd
spec:
  source:
    repoURL: https://github.com/empresa/infra-gitops.git
    path: apps/
    directory:
      recurse: true
  destination:
    server: https://kubernetes.default.svc
    namespace: argocd
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

Con esta arquitectura, cada equipo gestiona sus propias applications mediante PRs al repositorio central de infraestructura. Ningún desarrollador necesita acceso directo al cluster de producción — ArgoCD es el único actor que aplica cambios.

Gestión de Secretos con GitOps: el problema real

La gestión de secretos es el obstáculo principal para adoptar GitOps en empresas. No puedes commitear credenciales en Git, ni siquiera en repositorios privados. Las dos soluciones production-grade que usamos en proyectos empresariales:

Sealed Secrets (Bitnami): Cifra los secretos con la clave pública del cluster. El SealedSecret cifrado puede vivir en Git de forma segura — solo el cluster puede descifrarlo con su clave privada. Es la solución más simple cuando todos los secretos son específicos del cluster.

bash
# Crear Secret y sellarlo en un solo comando
kubectl create secret generic db-credentials \
  --from-literal=password=mysecretpassword \
  --dry-run=client -o yaml | \
  kubeseal --format yaml > sealed-db-credentials.yaml

# El archivo sealed puede commitearse de forma segura en Git

External Secrets Operator: Sincroniza secretos desde AWS Secrets Manager, HashiCorp Vault, GCP Secret Manager o Azure Key Vault directamente a Kubernetes Secrets. La mejor opción para empresas que ya tienen una solución centralizada de secrets management o necesitan rotar secretos sin re-deployar.

RBAC Empresarial con ArgoCD Projects

En una organización con múltiples equipos usando el mismo cluster, el control de acceso en ArgoCD es crítico. Los AppProjects permiten restringir qué repositorios puede usar cada equipo, en qué clusters puede desplegar y qué namespaces puede gestionar.

yaml
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: team-payments
  namespace: argocd
spec:
  description: Proyecto del equipo de pagos
  sourceRepos:
  - 'https://github.com/empresa/payments-service.git'
  destinations:
  - namespace: payments-*
    server: https://kubernetes.default.svc
  clusterResourceWhitelist:
  - group: ''
    kind: Namespace

El equipo de pagos puede desplegar únicamente desde su repositorio, solo a namespaces con prefijo payments-. Cualquier intento de acceder a otros namespaces o clusters falla en la validación de ArgoCD, sin requerir intervención manual.

Integración CI: la diferencia entre push y pull

Con GitOps, el pipeline de CI solo actualiza el repositorio de infraestructura (nueva versión de imagen, nueva configuración). ArgoCD detecta el cambio y aplica el nuevo estado al cluster. El CI nunca habla directamente con el cluster.

yaml
# GitLab CI — stage que actualiza el tag de imagen en el repo de infra
update-image-tag:
  stage: deploy
  script:
    - git clone https://oauth2:${GITOPS_TOKEN}@github.com/empresa/infra-gitops.git
    - cd infra-gitops
    - |
      sed -i "s|image: empresa/api:.*|image: empresa/api:${CI_COMMIT_SHORT_SHA}|g" \
        apps/api/production/deployment.yaml
    - git config user.email "ci@empresa.com"
    - git config user.name "GitLab CI"
    - git commit -am "ci: update api to ${CI_COMMIT_SHORT_SHA}"
    - git push origin main
  only:
    - main

Esta separación es fundamental para auditoría y compliance. Cada cambio a producción tiene un commit en Git con autor identificado. El rollback es un git revert. La reconciliación de ArgoCD garantiza que el estado del cluster siempre converge al estado declarado en Git.

Rollback en 30 Segundos

Una de las ventajas más concretas de GitOps es el rollback instantáneo. El estado deseado es el commit de Git — hacer rollback es literalmente seleccionar una revision anterior en ArgoCD o hacer git revert en el repositorio. No hay reconstrucción de configuración, no hay comandos de kubectl complejos.

En producción, el rollback via ArgoCD tarda el tiempo que tome reconciliar (típicamente 30-90 segundos). Comparado con el proceso manual de identificar la imagen anterior, editar el deployment, aplicar y verificar, la diferencia en MTTR puede ser de minutos u horas.

Para cambios de base de datos que acompañan deploys, el rollback de ArgoCD solo revierte el código. Las migraciones de base de datos requieren estrategia de backward compatibility o rollback separado. GitOps no reemplaza una estrategia de database migrations — la complementa.

Preguntas frecuentes

¿GitOps es solo para Kubernetes?
GitOps como modelo operacional aplica a cualquier infraestructura gestionable como código. Terraform + Atlantis implementa GitOps para infraestructura cloud. Sin embargo, la implementación más madura con mayor tooling disponible es la combinación Kubernetes + ArgoCD o FluxCD.
¿ArgoCD o FluxCD para una empresa?
ArgoCD tiene UI más rica y es más fácil de operar para equipos que no son Kubernetes-native. FluxCD es más ligero y mejor integrado con el ecosistema GitOps (Flagger para canary deployments, image automation). Para la mayoría de las empresas que adoptan GitOps por primera vez, ArgoCD es la elección más pragmática por su curva de aprendizaje más suave.
¿Cómo manejo feature flags y configuración de aplicación en GitOps?
La configuración de aplicación no sensible (timeouts, feature flags booleanos, endpoints) debe vivir en ConfigMaps en el repositorio de infraestructura. Los feature flags con lógica compleja deberían estar en un sistema dedicado (LaunchDarkly, Unleash) que la aplicación lee en runtime — no en el repositorio de infraestructura. Los cambios de configuración pasan por el mismo proceso de PR/review que el código.
¿Qué pasa si alguien hace un kubectl edit manual en producción?
Con selfHeal: true en ArgoCD, el cambio manual será revertido automáticamente en el próximo ciclo de reconciliación (cada 3 minutos por default). ArgoCD detectará el drift y lo marcará en la UI. Este comportamiento es exactamente el punto: GitOps hace los cambios manuales no persistentes, forzando que todo pase por el repositorio.
¿Cuánto tiempo tarda implementar GitOps en una empresa con deploy manual?
En proyectos reales, el primer servicio critico funcionando con ArgoCD (incluyendo secrets management y el pipeline CI actualizado) tarda 2-3 semanas. La migración completa del ecosistema de servicios es un proceso de 2-4 meses dependiendo del número de servicios y la complejidad de las integraciones. El mayor tiempo no es técnico — es el cambio de cultura del equipo de operaciones.

¿Tu equipo está pasando de deploys manuales con kubectl a un flujo GitOps profesional? Implementamos ArgoCD en producción con las prácticas correctas desde el inicio.

Habla con el equipo

Artículos relacionados

IQS

Equipo de Ingeniería — IQS

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