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
- Ve a Applications → + NEW APP
- Rellena los detalles:
– Application name:my-app
– Project:default
– Repository URL:https://github.com/myorg/gitops-repo
– Revision:main
– Path:overlays/prod
– Cluster URL:https://kubernetes.default.svc
– Namespace:prod - 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
-
Separa los repos por función:
– Un repo para apps, otro para infraestructura
– Permisos y flujos de CI/CD más limpios -
Usa Kustomize o Helm para los overlays:
# kustomization.yaml bases: - ../../base patchesStrategicMerge: - replicas.yaml -
Implementa RBAC:
apiVersion: v1 kind: AppProject metadata: name: staging spec: sourceRepos: - 'https://github.com/myorg/*' destinations: - namespace: 'staging' server: https://kubernetes.default.svc -
Monitoriza el drift con notificaciones:
– Integración con Slack/Teams para fallos de sincronización
– Alertas por email para intervenciones manuales -
Usa protección de ramas:
– Exige revisiones de PR antes de fusionar a main
– 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)
