Saltar a contenido

Cloud-native: GitOps con ArgoCD

ArgoCD es una herramienta declarativa de entrega continua GitOps para Kubernetes. Sincroniza aplicaciones desde repositorios Git hacia tu clúster automáticamente.

Resumen

Principios de GitOps: - Infraestructura y aplicaciones definidas en Git - Git es la única fuente de verdad - La sincronización automatizada detecta y corrige el drift - Rastro de auditoría completo a través del historial de Git

Beneficios: - Gestión declarativa de aplicaciones - Control de versiones para infraestructura - Despliegues automatizados - Rollbacks sencillos - Mejor colaboración y cumplimiento

Instalación

Inicio rápido

# Crear el namespace
kubectl create namespace argocd

# Instalar ArgoCD
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

# Acceder a la UI (port-forward)
kubectl port-forward svc/argocd-server -n argocd 8080:443

# Obtener la contraseña de admin
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d

Visita https://localhost:8080 con admin y la contraseña anterior.

Usando Helm (recomendado para producción)

helm repo add argo https://argoproj.github.io/argo-helm
helm install argocd argo/argo-cd -n argocd --create-namespace \
  --values values.yaml

Estructura de Directorios (Recomendada)

Usa una separación clara entre los manifiestos base y los overlays específicos de cada entorno:

gitops-repo/
├── README.md
├── base/                    # Manifiestos base de Kubernetes
│   ├── namespace.yaml
│   ├── deployment.yaml
│   ├── service.yaml
│   └── kustomization.yaml
├── overlays/                # Parches específicos por entorno
│   ├── dev/
│   │   ├── kustomization.yaml
│   │   └── replicas.yaml
│   ├── staging/
│   │   ├── kustomization.yaml
│   │   └── replicas.yaml
│   └── prod/
│       ├── kustomization.yaml
│       ├── replicas.yaml
│       └── ingress.yaml
└── argocd-apps/            # Definiciones de Application de ArgoCD
    ├── app-dev.yaml
    ├── app-staging.yaml
    └── app-prod.yaml

Creación de una Aplicación

Creación manual vía UI

  1. Ve a Applications+ NEW APP
  2. Rellena los detalles:
  3. Application name: my-app
  4. Project: default
  5. Repository URL: https://github.com/myorg/gitops-repo
  6. Revision: main
  7. Path: overlays/prod
  8. Cluster URL: https://kubernetes.default.svc
  9. Namespace: prod
  10. Haz clic en CREATE

Usando el CRD Application (recomendado)

---
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/myorg/gitops-repo
    targetRevision: main
    path: overlays/prod
  destination:
    server: https://kubernetes.default.svc
    namespace: prod
  syncPolicy:
    automated:
      prune: true      # Elimina recursos que no estén en Git
      selfHeal: true   # Auto-sincroniza ante drift del clúster
    syncOptions:
    - CreateNamespace=true

Aplícalo con:

kubectl apply -f argocd-apps/app-prod.yaml

Sincronización

Sincronización manual

# Vía CLI
argocd app sync my-app

# Vía UI: haz clic en el botón "SYNC"

Sincronización automática

syncPolicy:
  automated:
    prune: true       # Auto-elimina recursos que no estén en Git
    selfHeal: true    # Auto-sincroniza cuando el clúster tiene drift

Disparo por Webhook (más rápido que el polling)

GitHub → Settings → Webhooks → Add webhook: - Payload URL: https://argocd.example.com/api/webhook - Content type: application/json - Trigger on: Push events

Buenas Prácticas

  1. Separa los repos por función:
  2. Un repo para apps, otro para infraestructura
  3. Permisos y flujos de CI/CD más limpios

  4. Usa Kustomize o Helm para los overlays:

    # kustomization.yaml
    bases:
    - ../../base
    patchesStrategicMerge:
    - replicas.yaml
    

  5. Implementa RBAC:

    apiVersion: v1
    kind: AppProject
    metadata:
      name: staging
    spec:
      sourceRepos:
      - 'https://github.com/myorg/*'
      destinations:
      - namespace: 'staging'
        server: https://kubernetes.default.svc
    

  6. Monitoriza el drift con notificaciones:

  7. Integración con Slack/Teams para fallos de sincronización
  8. Alertas por email para intervenciones manuales

  9. Usa protección de ramas:

  10. Exige revisiones de PR antes de fusionar a main
  11. Exige tests antes de desplegar

Resolución de Problemas

Problema Causa Solución
App atascada en "Syncing" Problemas de red o despliegues grandes Revisa los logs de argocd-application-controller
"Repository not accessible" Falta la clave SSH o las credenciales Registra el repo con clave SSH en la UI
Los recursos no sincronizan Path incorrecto o falta el namespace Verifica el path de Git y el namespace en el spec
Drift detectado constantemente Auto-sync desactivado Activa selfHeal: true

Configuración Avanzada

Múltiples Clústeres

destinations:
- server: https://kubernetes.default.svc        # Clúster local
  namespace: prod
- server: https://staging-cluster.example.com   # Clúster remoto
  namespace: prod

Notificaciones (ejemplo con Slack)

# Instalar la extensión de Notifications
kubectl apply -f https://raw.githubusercontent.com/argoproj-labs/argocd-notifications/release-1.0/manifests/install.yaml

# Configurar la integración con Slack (ver la documentación de ArgoCD)

Ver También