
Curso Kubernetes 22 — GitOps com ArgoCD
A pergunta que define GitOps: se alguém apagar um Deployment às 3h da manhã, o cluster volta sozinho?
Se a resposta é "não", você tem CI com kubectl apply, não GitOps. A diferença é quem manda no estado desejado.
Selo do curso: testado em Kubernetes 1.35 com ArgoCD 2.x.
O modelo
Git (estado desejado) ──► ArgoCD (comparação) ──► Cluster (estado real)
▲ │
└──── drift detectado ───┘
- Fonte de verdade: repositório Git.
- Agente: ArgoCD roda no cluster e compara continuamente.
- Resultado:
Synced/OutOfSynceHealthy/Degraded.
Ninguém aplica com kubectl em produção. Se aplicar, o ArgoCD reverte — e isso é o comportamento correto.
Instalação
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
Acesso:
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
Em produção: Ingress com TLS, SSO (OIDC) e RBAC do ArgoCD. O admin local é só para bootstrap.
Uma 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
Pontos que importam:
prune: trueremove o que saiu do Git.selfHeal: truecorrige alteração manual.retryevita ficar emDegradedpor erro transitório de imagem.
App-of-apps
Um repositório, muitas Applications:
gitops/
bootstrap/
root-app.yaml
apps/
portal/
base/
overlays/homolog
overlays/prod
observability/
operators/
A root-app aponta para apps/ e o ArgoCD descobre o resto. Adicionar ambiente novo = abrir PR.
Sincronização: manual ou automática
| Modo | Quando usar |
|---|---|
Manual (syncPolicy vazio) |
produção regulada, janela aprovada |
| Automated | homolog, staging, serviços internos |
Automated + selfHeal |
tudo que precisa resistir a mudança manual |
Automated + prune |
ambientes descartáveis e GitOps maduro |
prune em produção exige cuidado: um erro de path no PR pode remover recursos. Use Prune=false annotation em objetos críticos e proteja o repositório com revisão obrigatória.
Drift: o inimigo silencioso
Drift acontece quando alguém:
- edita o Deployment no painel;
- roda
kubectl set image; - aplica um manifest avulso;
- altera um HPA que muda réplicas (réplicas gerenciadas por HPA não devem estar no Git).
argocd app diff portal-homolog
argocd app history portal-homolog
HPA + réplicas no Git é uma briga eterna: o ArgoCD quer 2, o HPA quer 6. Remova replicas do manifest gerenciado quando houver HPA.
Segredos no GitOps
Não commite Secret. Opções:
- Sealed Secrets: criptografa e pode ir para o Git.
- External Secrets Operator: busca no Vault/secret manager.
- SOPS + age: criptografia no repositório.
O ArgoCD só precisa enxergar o recurso final; a origem do segredo fica fora.
Laboratório
- Instale o ArgoCD e acesse a UI.
- Crie um repositório GitOps com um Deployment simples.
- Crie a Application e sincronize.
- Altere o Deployment na mão (
kubectl scale) e veja oselfHealvoltar ao valor do Git. - Delete o Deployment e confirme a recriação.
- Faça um commit com
replicas: 3e acompanhe o sync automático. - Remova o recurso do Git e veja o
pruneagir. - Provogue um erro (imagem inexistente) e observe
Degraded+ retry.
Erros comuns
| Sintoma | Causa |
|---|---|
OutOfSync eterno |
campo gerenciado por outro controller (HPA, webhook) |
ComparisonError |
repo/path/branch errado ou credencial |
Degraded após sync |
image pull, quota, PVC pending |
| Recurso órfão | prune: false |
| Sync sobrescreve HPA | replicas no manifest |
| Segredo no Git | falta de Sealed/External Secrets |
| Loop de sync | default do cluster difere do manifest (ignoreDifferences) |
ignoreDifferences é paliativo: use quando o campo é realmente gerenciado por outro componente, não para esconder drift real.
Checklist
- [ ] ArgoCD com SSO e RBAC (admin local só no bootstrap).
- [ ] Repositório GitOps separado do código da aplicação.
- [ ]
selfHealepruneconscientes por ambiente. - [ ]
replicasfora do manifest onde há HPA. - [ ] Segredos via Sealed/External Secrets.
- [ ]
argocd app difffaz parte do processo de PR. - [ ] Alertas para
DegradedeOutOfSync. - [ ] Backup do repositório GitOps.
Glossário
- Application: CRD que liga repo/path a um destino.
- sync: aplicar o estado desejado.
- prune: remover recursos ausentes no Git.
- selfHeal: reverter drift automaticamente.
- drift: divergência entre Git e cluster.
- app-of-apps: padrão de Applications que gerenciam Applications.
Próximo
Com o deploy versionado e reconciliado, falta o detalhe que o usuário sente: zero downtime. Probes, rolling update, PDB e HPA no próximo capítulo.
Próximo: Curso Kubernetes 23 — Deploy sem downtime: probes, rolling update e HPA
Continuar a ler
Leia também
KubernetesKubernetes de Verdade — do zero ao cluster em produção
Uma trilha prática para entender, montar e operar um cluster Kubernetes — do primeiro pod ao failover do Postgres.
4 min de leitura
KubernetesCurso Kubernetes 28 — DR e capstone: provar que o cluster volta
RPO, RTO e drills reais: cenários de desastre, runbook, restore medido e o capstone que fecha o curso com um cluster que se recupera.
5 min de leitura
KubernetesCurso Kubernetes 27 — SLO/SLI, on-call e postmortem blameless
O que prometer, como medir e o que fazer quando o erro estoura: SLI, SLO, error budget, alertas que acordam alguém e postmortem sem caça às bruxas.
4 min de leitura
Comentários
Ainda sem comentários
Seja o primeiro a compartilhar sua opinião sobre este artigo.
Deixe um comentário