GitOps: Convertí Git en la Fuente de Verdad de tu Infraestructura

DUGLAS MORENODUGLAS MORENO 👁 1

Introducción a GitOps

GitOps es un paradigma de desarrollo que usa Git como única fuente de verdad para definir, gestionar y auditar tanto la infraestructura como las aplicaciones. En vez de operar servicios manualmente o mediante scripts aislados, se declara todo el estado en un repositorio Git y se deja que agentes automatizados lo mantengan sincronizado con el cluster en producción.

Si trabajás en equipos de DevOps, SRE o desarrollo de aplicaciones, GitOps puede ayudarte a reducir el error humano, acelerar los despliegues y mejorar la trazabilidad de cada cambio. Al final de este artículo, vas a saber:

  • Qué son los principios básicos de GitOps.
  • Cómo construir un repositorio declarativo y versiónado.
  • Qué herramientas populares (Argo CD, Flux, etc.) ofrecen.
  • Las buenas prácticas para implementar GitOps en producción.
  • Los errores más comunes y cómo evitarlos.

Y también vas a ver un diagrama en Mermaid que resume el flujo de trabajo de GitOps, para que puedas referirlo cuando expliques la idea a tu equipo.


Por qué GitOps está ganando terreno

  • Versionado implícito: todo lo que cambia queda registrado, con autor, fecha y motivo.
  • Colaboración basada en pull‑request: el mismo flujo de trabajo que usan los desarrolladores para el código de aplicación se extiende a la infraestructura.
  • Reversión instantánea: si un despliegue genera problemas, bastará con hacer un commit con la versión anterior y el sistema lo aplicará de vuelta.
  • Integración continua: los pipelines CI pueden validar manifests, realizar pruebas de linting o aplicar verificaciones de seguridad antes de que el cluster lo reciba.

Si alguna vez te encontraste editando archivos JSON de Terraform o YAMLs de Helm manualmente en servidores de producción, sabes que GitOps puede transformar ese caos en un flujo de trabajo sistemático y auditado.


Fundamentos de GitOps: los cuatro principios clave

1️⃣ Declarativo, no imperativo

El estado deseado se expresa mediante código declarativo (YAML/JSON) en un repositorio. El sistema se encarga de cómo alcanzarlo; vos solo declarás qué querés.

# ejemplo: aplicación en Argo CD
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: guestbook
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/example/gitops.git
    path: overlays/production
  destination:
    server: https://kubernetes.default.svc
    namespace: guestbook
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

2️⃣ Única fuente de verdad

Todos los artefacts (infraestructura, valores de aplicación, políticas) residen en un único repo (o un conjunto de repositorios estrechamente acoplados). No hay copias en máquinas, dashboards o documentos. El sistema lee directamente desde Git.

3️⃣ Automatización basada en Git

Los agentes de GitOps (Argo CD, Flux, Jenkins X, entre otros) observan continuamente el repo. Cuando detectan un cambio (push, pull‑request, tag), ejecutan automáticamente:

  • Sync – aplicar los manifests en el cluster.
  • Verification – chequear condiciones de salud, alerta de políticas, pruebas de aceptación.
  • Rollback – revertir al commit anterior si algo falla.

4️⃣ Auditoría e iteración mediante pull‑request

Cada cambio es un pull‑request en Git, lo que proporciona:

  • Revisor assignado.
  • Comentarios obligatorios.
  • Proceso de aprobación.
  • Reversión histórica clara (history).

Cómo se ve un flujo de trabajo típico de GitOps

1️⃣ Desarrollo de manifiestos

# Aplicación en Kubernetes usando Kustomize
kustomize build overlays/prod > prod.yaml

2️⃣ CI – verificación y testeo

# ejemplo de pipeline de GitHub Actions
jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Validar YAML
        run: |
          python -c "import yaml, sys; yaml.safe_load(open('prod.yaml'))"
      - name: Ejecutar helm lint
        run: helm lint charts/myapp

3️⃣ Commit y push a GitOps repo

git add prod.yaml
 GIT_AUTHOR_NAME="bot" \
   GIT_AUTHOR_EMAIL="bot@example.com" \
   GIT_COMMITTER_NAME="bot" \
   GIT_COMMITTER_EMAIL="bot@example.com" \
   git commit -m "feat: despliegue de guestbook v2.1.0
   Co-authored-by: openhands <openhands@all-hands.dev>"
git push origin main

4️⃣ Agent de GitOps detecta el cambio

Argo CD (por ejemplo) Polling cada 30 segundos. Al ver la actualización de prod.yaml, inicia un sync.

5️⃣ Sync – aplicación del estado deseado

El controlador de Argo CD crea Deployments, Services, ConfigMaps, etc. Si la aplicación no se encuentra en estado Healthy tras un tiempo de espera configurado, dispara un rollback.

6️⃣ Verificación continua

Puedes agregar un Workflow de Argo CD que use kustomize para validar recursos, o un check de política OPA Gatekeeper que falle el sync si la etiqueta de seguridad environment=prod no está presente.

# OPA policy para el namespace
package gatekeeper

require_label = {"environment"}

violation[msg] {
  not require_label[_]
  input.review.object.metadata.labels["environment"] != "prod"
  msg := "El namespace debe tener label environment=prod"
}

Stack de herramientas de GitOps

Componente Propósito Popularidad Notas de integración
Argo CD GitOps de Kubernetes, lado cliente ★★★★★ Soporta Helm, Kustomize, plain YAML, OCI artifacts.
Flux GitOps ligero con enfoque en Helm y Kubernetes ★★★★☆ Usa git diff para decidir cambios; bueno para equipos pequeños.
Jenkins X GitOps + CI en niveles superiores, enfocado en lenguajes específicos ★★★☆☆ Ideal si ya usás pipelines de Jenkins.
Spinnaker Despliegue multicloud, soporta GitOps + pipelines personalizados ★★★★☆ Puede usar Git como fuente de truth pero tiene UI extra.
Tekton Pipelines CI para validaciones previas al sync ★★★★☆ Se integra con Argo CD a través de triggers.

Elección del stack: si ya usás Kustomize y Helm, empieza con Argo CD; para flujos simples y equipos pequeños, Flux es rápido de instalar (flux install) y tiene una huella baja.


Implementación de un repositorio declarativo

Dividir el repo

  • infra/ – definitions de cluster (RBAC, redes, namespaces).
  • apps/ – templates de aplicación (usar Kustomize o Helm).
  • env/ – overlays por entorno (dev, staging, prod).

Estructura de ejemplo

.gitops/
├── clusters/
│   ├── prod.yaml
│   └── dev.yaml
├── apps/
│   └── guestbook/
│       ├── kustomization.yaml
│       └── overlays/
│           ├── prod/
│           │   └── image-tag.yaml
│           └── dev/
│               └── image-tag.yaml
└── README.md

kustomization.yaml ejemplo:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - deployment.yaml
  - service.yaml
images:
  - name: ghcr.io/example/guestbook
    newTag: v2.1.0

Usar OCI artifacts (opcional)

Argo CD puede leer imágenes de contenedores con manifests embebidos, por ejemplo:

source:
  repoURL: oci://ghcr.io/example/guestbook-chart
  chart: guestbook
  targetRevision: 2.1.0

Esto decouple los valores del chart del repo Git y permite actualizaciones atomicas sin esperar un push de Git.


Buenas prácticas para adoptar GitOps

  1. Un solo repo para cada entorno – Reduce la deriva del estado. Si necesitas múltiples repos, documenta por qué.
  2. Usa pull‑request reviews obligatorios – Aplica protección al branch main y exige aprobaciones.
  3. Usa recursos de limitación de RBAC – No expongas tokens de CI completos; usa ServiceAccount con ImagePullSecrets y políticas Role/RoleBinding.
  4. Declarativo sobre secrets – Guarda los secretos en Kubernetes Secrets (o HashiCorp Vault) en vez de commitear claves en texto plano. Puedes usar kubectl create secret en un pipeline CI.
  5. Validaciones automáticas – Añade un check de lint (yamllint, kubeval) como paso previo al merge.
  6. Practica la infraestructura como código – Mantené los cambios en Git, no en la consola del cloud.
  7. Automatiza rollback y rotación de secrets – Usa Argo CD automated sync o cronjobs que actualicen los valores.
  8. Documenta el diagrama de flujo – Usa Mermaid (o similar) para que los nuevos miembros del equipo comprendan el flujo.

Errores comunes y cómo evitarlos

Error Síntoma Prevención
Múltiples fuentes de truth Desperdicio de tiempo buscando el último estado en un archivo JSON local. Consolida todo en un solo repo Git; usa verificaciones CI para rechazar merges con archivos extra.
Código de aplicación mezclado con manifiestos Código fuente del proyecto y definiciones de Kubernetes en el mismo YAML. Separa la lógica de negocio de kustomization.yaml; usa Helm charts para pipelines de aplicación.
Pendiente de sincronización manual Los despliegues no se aplican automáticamente tras merges. Verifica que el agente de GitOps está corriendo (kubectl get pods -n argocd); revisa las políticas de syncPolicy.
Exposición de tokens en Git Commits con GITHUB_TOKEN o claves privadas. Usa GitHub Actions / GitLab CI para generar tokens de registro; nunca los comitees.
Sobrecarga de verificaciones Pipelines CI tardan horas; los desarrolladores los evitan. Limita verificaciones a lo esencial: lint, test unitario y validar schema de manifests.
No hay politicas de control de cambios Los cambios de producción se hacen a través de PR inexistentes. Implementa protección de ramas y requirePullRequestBeforeClosing en GitHub.

Diagrama descriptivo del flujo de trabajo de GitOps

A continuación tenés un diagrama en Mermaid que resume el pipeline. Usa este bloque como referencia al explicar GitOps a otros.

graph TD
    A[Desarrollador escribe manifiestos] --> B[Commit y Push a Git]
    B --> C[CI valida lint y pruebas]
    C --> D[Merge a main (PR)]
    D --> E[Agente de GitOps observa (Argo CD / Flux)]
    E --> F[Detecta cambios en Git]
    F --> G[Sync al cluster]
    G --> H[Verificación continua (salud, OPA)]
    H --> I{¿Todo ok?}
    I -->|Sí| J[Despliegue completado]
    I -->|No| K[Rollback automático]
    K --> J
    J --> L[Monitoreo y alertas]

Este diagrama muestra:

  • El repo Git como nodo central.
  • La validación de CI antes del merge.
  • El agente de GitOps sincronizando continuamente.
  • La verificación y el rollback automatizados.
  • El monitoreo posterior al despliegue.

Puedes copiarlo en un editor de diagramas en tiempo real que soporte Mermaid (ex: mermaid.live) para interactuar con él.


Conclusión

GitOps es más que una moda; es una forma sistemática de tratar la infraestructura y las aplicaciones como código versiónado. Al adoptar los cuatro principios —declarativo, única fuente de verdad, automatización basada en Git y pull‑request obligatorio— podés eliminar la deriva, reducir el error humano y acelerar los lanzamientos.

Empieza pequeño: define tu primer manifiesto con Argo CD o Flux, habilita el sync automático y protecté el branch main. A medida que el repositorio crezca, refina tus procesos CI/CD, integra verificaciones de políticas y documenta el flujo con diagramas claros.

GitOps no reemplaza la necesidad de una buena ingeniería; la amplifica. Con el tiempo, vas a tener pipelines más limpios, rollbacks más rápidos y una visibilidad total del estado de tus clústeres, directamente desde Git.


Próximos pasos

  • Instala Flux o Argo CD en un clúster de prueba.
  • Crea un repo GitOps mínimo con un solo Deployment.
  • Añade un check de OPA Gatekeeper.
  • Observa el sync en tiempo real con kubectl get pods y revisa los eventos de Argo CD.

Si querés más detalles sobre cualquier componente (ej: usar Kustomize con Argo CD, o CI con pipelines de GitHub Actions), avísame y profundizaremos en ello.

Comentarios (0)

Sé el primero en comentar.

Dejá tu comentario