GitOps com ArgoCD em Produção: Guia Completo de Automação de Deploy
Por Que GitOps É o Padrão para Deploy no Kubernetes em 2026
O deploy no Kubernetes evoluiu de kubectl manual para pipelines de CI/CD e depois GitOps. Em 2026, GitOps é o padrão de fato para deploy no Kubernetes. A razão principal é simples: Git é a Única Fonte de Verdade.
O CI/CD tradicional usa um "modelo push" — o sistema de CI precisa de credenciais do cluster para enviar alterações via kubectl apply. Isso cria riscos de segurança, desvio de estado e dificuldades de auditoria. GitOps usa um "modelo pull" — um agente dentro do cluster monitora continuamente o repositório Git e aplica automaticamente o estado declarado.
| Característica | CI/CD Tradicional | GitOps |
|---|---|---|
| Modelo de Deploy | Push | Pull |
| Fonte de Estado | Sistema de CI | Repositório Git |
| Credenciais do Cluster | Com o CI | No cluster |
| Desvio de Estado | Difícil de detectar | Detecção e remediação automática |
| Trilha de Auditoria | Logs de CI | Histórico do Git |
| Rollback | Re-executar pipeline | git revert |
| Multi-cluster | Complexo | Gerenciamento unificado |
| Alterações de Emergência | kubectl (sem auditoria) | Git PR (auditado) |
| Curva de Aprendizado | Baixa | Média |
Arquitetura e Conceitos Fundamentais do ArgoCD
Arquitetura
┌─────────────────────────────────────────────────────┐
│ Git Repository │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ app.yaml │ │ helm/ │ │ kustomize│ │
│ └──────────┘ └──────────┘ └──────────┘ │
└──────────────────────┬──────────────────────────────┘
│ git clone/pull
┌──────────────────────▼──────────────────────────────┐
│ ArgoCD Controller │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Repo Server │ │ App Controller│ │
│ └──────────────┘ └──────────────┘ │
└──────────────────────┬──────────────────────────────┘
│ kubectl apply
┌──────────────────────▼──────────────────────────────┐
│ Kubernetes Cluster │
└─────────────────────────────────────────────────────┘
Configuração Completa: Instalar, Configurar, Primeira Aplicação
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.13.0/manifests/install.yaml
kubectl wait --for=condition=available --timeout=300s deployment/argocd-server -n argocd
kubectl -n argocd get secret argocd-initial-admin-secret \
-o jsonpath="{.data.password}" | base64 -d
kubectl port-forward svc/argocd-server -n argocd 8080:443
Primeira Aplicação
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/myorg/my-app-manifests.git
targetRevision: main
path: overlays/production
destination:
server: https://kubernetes.default.svc
namespace: my-app
syncPolicy:
automated:
prune: true
selfHeal: true
allowEmpty: false
syncOptions:
- CreateNamespace=true
- ServerSideApply=true
retry:
limit: 3
backoff:
duration: 5s
factor: 2
maxDuration: 3m
Gerenciamento Multi-Cluster
argocd cluster add production-cluster --name prod-us-east
argocd cluster add production-cluster-eu --name prod-eu-west
ApplicationSet para Multi-Cluster
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: my-app-multi-cluster
namespace: argocd
spec:
generators:
- clusters:
selector:
matchLabels:
environment: production
template:
metadata:
name: 'my-app-{{name}}'
spec:
project: production
source:
repoURL: https://github.com/myorg/my-app-manifests.git
targetRevision: main
path: overlays/production
destination:
name: '{{name}}'
namespace: my-app
syncPolicy:
automated:
prune: true
selfHeal: true
Entrega Progressiva com Argo Rollouts
kubectl create namespace argo-rollouts
kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/download/v1.7.0/install.yaml
Configuração de Rollout
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: my-app
namespace: my-app
spec:
replicas: 10
strategy:
canary:
steps:
- setWeight: 10
- pause: { duration: 5m }
- setWeight: 20
- pause: { duration: 5m }
- analysis:
templates:
- templateName: success-rate
- setWeight: 50
- pause: { duration: 10m }
- setWeight: 100
canaryService: my-app-canary
stableService: my-app-stable
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: myorg/my-app:v2.0.0
ports:
- containerPort: 8080
Template de Análise
apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
name: success-rate
namespace: my-app
spec:
metrics:
- name: success-rate
interval: 60s
count: 5
successCondition: result[0] >= 0.99
provider:
prometheus:
address: http://prometheus.monitoring:9090
query: |
sum(rate(http_requests_total{app="my-app",status!~"5.."}[1m]))
/
sum(rate(http_requests_total{app="my-app"}[1m]))
Gerenciamento de Secrets com Sealed Secrets
kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.27.0/controller.yaml
kubectl create secret generic my-app-secret \
--from-literal=db-password='super-secret-password' \
--namespace my-app \
--dry-run=client -o yaml > secret.yaml
kubeseal --format yaml < secret.yaml > sealed-secret.yaml
Backup do Certificado do Sealed Secrets
kubectl get secret -n kube-system sealed-secrets-key -o yaml > sealed-secrets-key-backup.yaml
ArgoCD vs Flux vs Spinnaker
| Dimensão | ArgoCD | Flux | Spinnaker |
|---|---|---|---|
| Linguagem | Go | Go | Java/Kotlin |
| UI | Excelente | Básica | Excelente |
| Multi-cluster | Nativo | Nativo | Nativo |
| RBAC | Granular | Básico | Granular |
| Entrega Progressiva | Argo Rollouts | Flagger | Nativo |
| Gerenciamento de Secrets | Sealed Secrets | SOPS | Halyard |
| Curva de Aprendizado | Média | Baixa | Alta |
| Uso de Recursos | Médio | Baixo | Alto |
| Melhor Para | Equipes médias-grandes | Equipes pequenas | Grandes empresas |
5 Armadilhas Comuns
1. Auto-sync Causando Incidentes em Produção
spec:
syncPolicy:
automated:
prune: false
selfHeal: false
2. Ignorar Resource Hooks
metadata:
annotations:
argocd.argoproj.io/hook: PreSync
argocd.argoproj.io/hook-delete-policy: HookSucceeded
3. Muitas Aplicações Causando Problemas de Performance
data:
status.processors: "20"
task.result.workers: "10"
4. Certificado do Sealed Secrets Sem Backup
kubectl get secret -n kube-system sealed-secrets-key -o yaml > backup.yaml
5. Estrutura Ruim do Repositório Git
├── clusters/
│ ├── production/
│ │ ├── apps/
│ │ └── infrastructure/
│ └── staging/
├── helm-charts/
├── kustomize/
│ ├── base/
│ └── overlays/
└── argocd/
├── projects/
└── applicationsets/
10 Resolução de Erros
| # | Sintoma | Causa Possível | Resolução |
|---|---|---|---|
| 1 | Aplicação sempre OutOfSync | Alterações no Git não acionam sync | Verificar Webhook e syncPolicy |
| 2 | Sync falha | Formato de manifesto inválido | argocd app diff my-app |
| 3 | Erro de pull de imagem | Credenciais de registry ausentes | Configurar imagePullSecrets |
| 4 | Conexão multi-cluster falha | RBAC insuficiente | Verificar ServiceAccount argocd-manager |
| 5 | Erro de renderização do Helm Chart | Problema de referência de Values | Verificar com helm template |
| 6 | Recursos excluídos inesperadamente | prune: true mal configurado | Verificar syncPolicy.prune |
| 7 | Rollout travado | Métricas de Analysis não atendidas | kubectl argo rollouts get rollout my-app |
| 8 | Descriptografia do SealedSecret falha | Certificado incompatível | Garantir que o cert do controller corresponda |
| 9 | Timeout de conexão Git | Restrição de Network Policy | Verificar NetworkPolicy e proxy |
| 10 | OOM | Muitas Applications | Aumentar recursos do repo-server |
argocd app get my-app
argocd app sync my-app --dry-run
argocd app diff my-app
kubectl logs -n argocd deployment/argocd-application-controller
Ferramentas Recomendadas
- Formatador JSON: Use /pt-BR/json/format para formatar configurações de Application do ArgoCD
- Codificador Base64: Use /pt-BR/encode/base64 para codificação/decodificação de dados de Secret
- Calculadora de Hash: Use /pt-BR/encode/hash para verificação de integridade de arquivos de configuração
Resumo: GitOps usa Git como a única fonte de verdade, resolvendo os problemas de segurança e consistência do CI/CD tradicional através de um "modelo pull". ArgoCD é a ferramenta GitOps para Kubernetes mais madura em 2026, combinada com Argo Rollouts para entrega progressiva, Sealed Secrets para gerenciamento de secrets e ApplicationSet para gerenciamento multi-cluster. Práticas-chave: usar auto-sync com cautela em produção, fazer backup dos certificados do Sealed Secrets, organizar adequadamente a estrutura do repositório Git e usar Analysis Templates como portas de qualidade.
Experimente estas ferramentas executadas localmente no navegador — nenhum cadastro necessário →