GitOps com ArgoCD em Produção: Guia Completo de Automação de Deploy

DevOps

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 →

#GitOps#ArgoCD#Kubernetes#持续交付#Argo Rollouts#Sealed Secrets#多集群#渐进式交付