Pular para o conteúdo
DevOps 13 min read

GitOps na Prática: ArgoCD vs FluxCD para Kubernetes

Entenda o que é GitOps, compare ArgoCD e FluxCD, e aprenda como implementar continuous deployment declarativo para Kubernetes.

Por Equipe Integr8 11/01/2025

O que é GitOps?

GitOps é um paradigma operacional onde o Git serve como single source of truth para infraestrutura e aplicações. Em vez de executar comandos imperativos, você declara o estado desejado em arquivos versionados no Git.

💡Princípios do GitOps
  1. Declarativo: Todo o sistema é descrito declarativamente
  2. Versionado: O estado desejado está em Git
  3. Automatizado: Mudanças aprovadas são aplicadas automaticamente
  4. Reconciliação: Software garante convergência contínua

Por que GitOps?

🔒

Segurança

Credenciais do cluster não ficam expostas em pipelines CI/CD

📜

Auditoria

Todo deploy é um commit com autor, timestamp e mensagem

🔄

Rollback Simples

Reverter é um git revert, não um processo complexo

🔁

Drift Detection

Detecta e corrige automaticamente configurações manuais

GitOps vs Push-based CI/CD

No GitOps, o operador dentro do cluster puxa as mudanças do Git
100%
Comparação Push-based vs GitOps

No GitOps, o operador dentro do cluster puxa as mudanças do Git

ArgoCD: O Favorito da Comunidade

ArgoCD é a ferramenta GitOps mais popular, com uma UI rica e grande ecossistema.

Arquitetura do ArgoCD

# Componentes principais
components:
  api-server:
    description: API REST e gRPC, serve UI e CLI

  repo-server:
    description: Clone repos Git, gera manifests

  application-controller:
    description: Monitora apps, executa reconciliação

  dex:
    description: Autenticação SSO (OIDC, LDAP, GitHub)

  redis:
    description: Cache para performance

Instalação do ArgoCD

# Criar namespace
kubectl create namespace argocd

# Instalar ArgoCD
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

# Obter senha inicial do admin
kubectl -n argocd get secret argocd-initial-admin-secret \
  -o jsonpath="{.data.password}" | base64 -d

# Port forward para acessar UI
kubectl port-forward svc/argocd-server -n argocd 8080:443

Definindo uma Application

# application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
  namespace: argocd
spec:
  project: default

  source:
    repoURL: https://github.com/myorg/my-app-config
    targetRevision: main
    path: k8s/overlays/production

  destination:
    server: https://kubernetes.default.svc
    namespace: my-app

  syncPolicy:
    automated:
      prune: true        # Remove recursos que não estão no Git
      selfHeal: true     # Corrige drift automaticamente
    syncOptions:
      - CreateNamespace=true
      - PruneLast=true

ApplicationSet para Multi-Cluster/Multi-Env

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: my-app-set
  namespace: argocd
spec:
  generators:
    - list:
        elements:
          - cluster: staging
            url: https://staging.k8s.example.com
          - cluster: production
            url: https://prod.k8s.example.com

  template:
    metadata:
      name: 'my-app-{{cluster}}'
    spec:
      project: default
      source:
        repoURL: https://github.com/myorg/my-app-config
        targetRevision: main
        path: 'k8s/overlays/{{cluster}}'
      destination:
        server: '{{url}}'
        namespace: my-app

FluxCD: GitOps Nativo do CNCF

FluxCD é a alternativa mais “cloud-native”, usando CRDs do Kubernetes para tudo.

Arquitetura do FluxCD

# Controllers do Flux
controllers:
  source-controller:
    description: Gerencia fontes (Git, Helm, OCI)

  kustomize-controller:
    description: Reconcilia Kustomizations

  helm-controller:
    description: Reconcilia HelmReleases

  notification-controller:
    description: Eventos e alertas

  image-automation-controller:
    description: Atualiza imagens automaticamente

Bootstrap do FluxCD

# Instalar Flux CLI
curl -s https://fluxcd.io/install.sh | sudo bash

# Bootstrap com GitHub
flux bootstrap github \
  --owner=myorg \
  --repository=fleet-infra \
  --branch=main \
  --path=clusters/production \
  --personal

Definindo Resources no Flux

# GitRepository - fonte
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
  name: my-app
  namespace: flux-system
spec:
  interval: 1m
  url: https://github.com/myorg/my-app-config
  ref:
    branch: main
---
# Kustomization - o que deployar
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
  name: my-app
  namespace: flux-system
spec:
  interval: 10m
  targetNamespace: my-app
  sourceRef:
    kind: GitRepository
    name: my-app
  path: ./k8s/overlays/production
  prune: true
  healthChecks:
    - apiVersion: apps/v1
      kind: Deployment
      name: my-app
      namespace: my-app

Image Automation (recurso único do Flux)

# ImageRepository - monitorar registry
apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImageRepository
metadata:
  name: my-app
  namespace: flux-system
spec:
  image: ghcr.io/myorg/my-app
  interval: 1m
---
# ImagePolicy - qual tag usar
apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImagePolicy
metadata:
  name: my-app
  namespace: flux-system
spec:
  imageRepositoryRef:
    name: my-app
  policy:
    semver:
      range: ">=1.0.0"
---
# ImageUpdateAutomation - commit automático
apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImageUpdateAutomation
metadata:
  name: my-app
  namespace: flux-system
spec:
  interval: 30m
  sourceRef:
    kind: GitRepository
    name: fleet-infra
  git:
    checkout:
      ref:
        branch: main
    commit:
      author:
        name: fluxcdbot
        email: flux@example.com
      messageTemplate: 'chore: update {{.AutomationObject.Name}} to {{.NewImage}}'
    push:
      branch: main
  update:
    path: ./clusters/production
    strategy: Setters

Comparativo: ArgoCD vs FluxCD

AspectoArgoCDFluxCD
UI✅ Rica e interativa❌ Apenas CLI/API
Curva de AprendizadoMais fácilMais CRDs para aprender
Multi-tenancyProjectsNamespaced controllers
Image AutomationVia plugin✅ Nativo
Helm✅ Nativo✅ Nativo
Kustomize✅ Nativo✅ Nativo
SSO/RBAC✅ Dex integradoVia Kubernetes RBAC
RecursosMais pesadoMais leve
CNCFGraduatedGraduated
Nossa Recomendação

ArgoCD para times que precisam de UI visual e estão começando com GitOps. FluxCD para times que preferem abordagem 100% declarativa e já são proficientes em Kubernetes.

Boas Práticas de GitOps

    Estrutura Recomendada de Repo

    fleet-infra/
    ├── clusters/
    │   ├── staging/
    │   │   ├── flux-system/        # Bootstrap do Flux
    │   │   ├── infrastructure.yaml # Referência para infra
    │   │   └── apps.yaml           # Referência para apps
    │   └── production/
    │       ├── flux-system/
    │       ├── infrastructure.yaml
    │       └── apps.yaml
    ├── infrastructure/
    │   ├── base/
    │   │   ├── cert-manager/
    │   │   ├── ingress-nginx/
    │   │   └── monitoring/
    │   └── overlays/
    │       ├── staging/
    │       └── production/
    └── apps/
        ├── base/
        │   └── my-app/
        │       ├── deployment.yaml
        │       ├── service.yaml
        │       └── kustomization.yaml
        └── overlays/
            ├── staging/
            │   └── kustomization.yaml
            └── production/
                └── kustomization.yaml

    Quer implementar GitOps na sua organização? Fale com nossos especialistas em DevOps e Kubernetes.