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.
- Declarativo: Todo o sistema é descrito declarativamente
- Versionado: O estado desejado está em Git
- Automatizado: Mudanças aprovadas são aplicadas automaticamente
- 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
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
| Aspecto | ArgoCD | FluxCD |
|---|---|---|
| UI | ✅ Rica e interativa | ❌ Apenas CLI/API |
| Curva de Aprendizado | Mais fácil | Mais CRDs para aprender |
| Multi-tenancy | Projects | Namespaced controllers |
| Image Automation | Via plugin | ✅ Nativo |
| Helm | ✅ Nativo | ✅ Nativo |
| Kustomize | ✅ Nativo | ✅ Nativo |
| SSO/RBAC | ✅ Dex integrado | Via Kubernetes RBAC |
| Recursos | Mais pesado | Mais leve |
| CNCF | Graduated | Graduated |
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.