La pregunta que define GitOps: si alguien elimina un Deployment a las 3 de la mañana, ¿el clúster se recupera solo?
Si la respuesta es «no», tienes CI con kubectl apply, no GitOps. La diferencia es quién controla el estado deseado.
Sello del curso: probado en Kubernetes 1.35 con ArgoCD 2.x.
El modelo
Git (estado desejado) ──► ArgoCD (comparação) ──► Cluster (estado real)
▲ │
└──── drift detectado ───┘
- Fuente de verdad: repositorio Git.
- Agente: ArgoCD se ejecuta en el clúster y compara continuamente.
- Resultado:
Synced/OutOfSyncyHealthy/Degraded.
Nadie aplica con kubectl en producción. Si se aplica, ArgoCD lo revierte — y ese es el comportamiento correcto.
Instalación
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
kubectl -n argocd get pods
Acceso:
kubectl -n argocd port-forward svc/argocd-server 8080:443
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath='{.data.password}' | base64 -d
En producción: Ingress con TLS, SSO (OIDC) y RBAC de ArgoCD. El admin local es solo para bootstrap.
Una Application
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: portal-homolog
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/example/portal-gitops.git
targetRevision: main
path: apps/portal/overlays/homolog
destination:
server: https://kubernetes.default.svc
namespace: portal
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
- ApplyOutOfSyncOnly=true
retry:
limit: 3
backoff:
duration: 10s
factor: 2
maxDuration: 3m
Puntos que importan:
prune: trueelimina lo que salió de Git.selfHeal: truecorrige cambios manuales.retryevita quedar enDegradedpor un error transitorio de imagen.
App-of-apps
Un repositorio, muchas Applications:
gitops/
bootstrap/
root-app.yaml
apps/
portal/
base/
overlays/homolog
overlays/prod
observability/
operators/
La root-app apunta a apps/ y ArgoCD descubre el resto. Agregar un entorno nuevo = abrir PR.
Sincronización: manual o automática
| Modo | Cuándo usar |
|---|---|
Manual (syncPolicy vacío) |
producción regulada, ventana aprobada |
| Automated | homolog, staging, servicios internos |
Automated + selfHeal |
todo lo que necesita resistir a cambios manuales |
Automated + prune |
entornos desechables y GitOps maduro |
prune en producción exige cuidado: un error de path en el PR puede eliminar recursos. Usa la anotación Prune=false en objetos críticos y protege el repositorio con revisión obligatoria.
Drift: el enemigo silencioso
El drift ocurre cuando alguien:
- edita el Deployment en el panel;
- ejecuta
kubectl set image; - aplica un manifest suelto;
- altera un HPA que cambia réplicas (las réplicas gestionadas por HPA no deben estar en Git).
argocd app diff portal-homolog
argocd app history portal-homolog
HPA + réplicas en Git es una pelea eterna: ArgoCD quiere 2, el HPA quiere 6. Elimina replicas del manifest gestionado cuando haya HPA.
Secretos en GitOps
No hagas commit de Secret. Opciones:
- Sealed Secrets: cifra y puede ir a Git.
- External Secrets Operator: obtiene desde Vault/secret manager.
- SOPS + age: cifrado en el repositorio.
ArgoCD solo necesita ver el recurso final; el origen del secreto queda fuera.
Laboratorio
- Instala ArgoCD y accede a la UI.
- Crea un repositorio GitOps con un Deployment simple.
- Crea la Application y sincroniza.
- Modifica el Deployment manualmente (
kubectl scale) y observa cómoselfHeallo revierte al valor de Git. - Elimina el Deployment y confirma la recreación.
- Haz un commit con
replicas: 3y observa el sync automático. - Elimina el recurso de Git y observa cómo
pruneactúa. - Provoca un error (imagen inexistente) y observa
Degraded+ retry.
Errores comunes
| Síntoma | Causa |
|---|---|
OutOfSync eterno |
campo gestionado por otro controller (HPA, webhook) |
ComparisonError |
repo/path/branch incorrecto o credencial |
Degraded después de sync |
image pull, quota, PVC pending |
| Recurso huérfano | prune: false |
| Sync sobrescribe HPA | replicas en el manifest |
| Secreto en Git | falta de Sealed/External Secrets |
| Loop de sync | el default del clúster difiere del manifest (ignoreDifferences) |
ignoreDifferences es paliativo: úsalo cuando el campo es realmente gestionado por otro componente, no para ocultar drift real.
Checklist
- [ ] ArgoCD con SSO y RBAC (admin local solo en bootstrap).
- [ ] Repositorio GitOps separado del código de la aplicación.
- [ ]
selfHealypruneconscientes por entorno. - [ ]
replicasfuera del manifest donde haya HPA. - [ ] Secretos mediante Sealed/External Secrets.
- [ ]
argocd app diffforma parte del proceso de PR. - [ ] Alertas para
DegradedyOutOfSync. - [ ] Backup del repositorio GitOps.
Glosario
- Application: CRD que vincula repo/path a un destino.
- sync: aplicar el estado deseado.
- prune: eliminar recursos ausentes en Git.
- selfHeal: revertir drift automáticamente.
- drift: divergencia entre Git y el clúster.
- app-of-apps: patrón de Applications que gestionan Applications.
Próximo
Con el deploy versionado y reconciliado, falta el detalle que el usuario siente: zero downtime. Probes, rolling update, PDB y HPA en el próximo capítulo.
Próximo: Curso Kubernetes 23 — Deploy sin downtime: probes, rolling update y HPA
Seguir leyendo
Lea también
TutoriaisManual LSI / Broadcom MegaRAID — MegaCli y StorCLI
Con esta guía, su equipo gana autonomía para diagnosticar rebuilds, resolver foreign configurations, gestionar BBU y CacheCade — con escenarios reales de producción documentados.
20 min de leitura
Nginx Cheatsheet
Guía de bolsillo con ejemplos listos para configurar Nginx en producción: desde instalación y virtual hosts hasta ajuste de rendimiento y resolución de problemas.
12 min de leitura
KubernetesCurso Kubernetes 27 — SLO/SLI, on-call y postmortem sin culpa
Qué prometer, cómo medir y qué hacer cuando el error se dispara: SLI, SLO, presupuesto de error, alertas que despiertan a alguien y postmortem sin caza de brujas.
5 min de leitura
Comentarios
Aún sin comentarios
Sea el primero en compartir su opinión sobre este artículo.

Deje un comentario