Lab GitOps 100% local do curso DevOps Essentials (523) da 4Linux.
Você vai construir um ambiente completo de GitOps — repositório Git, operador de deploy automático, aplicação web e emulador AWS — tudo rodando na sua máquina, sem conta em cloud, sem cartão de crédito.
- Subir um cluster Kubernetes local com Kind
- Hospedar um repositório Git com Gitea (self-hosted)
- Fazer deploys automáticos via ArgoCD (GitOps)
- Escalar e fazer rollback de aplicações usando apenas
git push - Emular serviços AWS localmente com Floci
- Provisionar infraestrutura como código com OpenTofu
┌─────────────────────────────────────────────────────────┐
│ VM Vagrant │
│ (192.168.56.10) │
│ │
│ Browser / Terminal (do host) │
│ 192.168.56.10:3000 → Gitea (Git server) │
│ 192.168.56.10:8080 → ArgoCD (GitOps operator) │
│ 192.168.56.10:9090 → Aplicação Flask │
│ 192.168.56.10:4566 → Floci (AWS local) │
│ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ Cluster Kind (Docker) │ │
│ │ │ │
│ │ namespace: gitea │ │
│ │ └─ gitea-http (Git server via Helm) │ │
│ │ │ │
│ │ namespace: argocd │ │
│ │ └─ argocd-server │ │
│ │ └─ observa gitea/devops-lab.git │ │
│ │ └─ aplica k8s/ no cluster │ │
│ │ │ │
│ │ namespace: devops-lab │ │
│ │ └─ devops-app (Flask — DevOpsLab HelloWorld) │ │
│ │ │ │
│ │ namespace: tools │ │
│ │ └─ floci (S3, SQS, DynamoDB, Lambda...) │ │
│ └──────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
git push → Gitea → ArgoCD detecta (~3 min) → kubectl apply → app atualizada
Rollback = git revert — o cluster nunca é modificado diretamente.
| Ferramenta | Versão mínima | Instalação |
|---|---|---|
| Docker | 24+ | docs.docker.com |
| kind | 0.27+ | kind.sigs.k8s.io |
| kubectl | 1.32+ | kubernetes.io/docs/tasks/tools |
| helm | 3.16+ | helm.sh |
Hardware recomendado: 8 GB RAM, 4 CPUs, 20 GB de disco livre.
# 1. Subir a VM (~10-15 minutos na primeira vez — instala todas as ferramentas)
vagrant up
# 2. Entrar na VM
vagrant ssh
# 3. Subir o lab completo (~5-10 minutos)
cd ~/523
bash setup.shApós o setup, acesse pelo host (sua máquina física):
| Serviço | Endereço | Credenciais |
|---|---|---|
| Gitea | http://192.168.56.10:3000 | gitadmin / gitadmin123 |
| ArgoCD | http://192.168.56.10:8080 | admin / (ver abaixo) |
| Aplicação | http://192.168.56.10:9090 | — |
| Floci | http://192.168.56.10:4566 | test / test |
git clone https://github.com/4linux/523.git
cd 523
bash setup.sh| Serviço | Endereço | Credenciais |
|---|---|---|
| Gitea | http://localhost:3000 | gitadmin / gitadmin123 |
| ArgoCD | http://localhost:8080 | admin / (ver abaixo) |
| Aplicação | http://localhost:9090 | — |
| Floci | http://localhost:4566 | test / test |
Senha inicial do ArgoCD:
kubectl -n argocd get secret argocd-initial-admin-secret \
-o jsonpath="{.data.password}" | base64 -d && echo523-devops-essentials-lab/
│
├── setup.sh # Sobe cluster Kind + instala Gitea, ArgoCD, Floci
├── teardown.sh # Destrói o cluster completamente
├── lab.sh # Helpers para o lab guiado
│
├── app/ # Aplicação Flask (DevOpsLab HelloWorld)
│ ├── app.py # Rotas: / e /health
│ ├── Dockerfile
│ ├── requirements.txt
│ ├── static/ # CSS e imagens
│ └── templates/ # HTML (index.html)
│
├── k8s/ # Manifests Kubernetes (gerenciados pelo ArgoCD)
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── configmap.yaml
│ └── kustomization.yaml
│
├── argocd/
│ └── application.yaml # ArgoCD Application apontando para o Gitea
│
└── aws-lab/ # Lab AWS local com Floci
├── test_aws.py # Testes com boto3
└── terraform/
├── main.tf # Provider AWS → Floci (SQS via OpenTofu)
├── variables.tf
└── outputs.tf
Vagrant VM: use
192.168.56.10no lugar delocalhostpara acessar os serviços pelo browser do host.
Altere a mensagem de boas-vindas da aplicação e veja o ArgoCD fazer o deploy automaticamente.
# 1. Editar o alert bar em app/templates/index.html
# Linha: <div class="alert">DevOps Essentials Lab — ...</div>
# 2. Build da nova imagem
docker build -t devops-app:v2 app/
kind load docker-image devops-app:v2 --name devops-lab
# 3. Atualizar a imagem no deployment
sed -i 's|devops-app:.*|devops-app:v2|' k8s/deployment.yaml
# 4. Commitar e enviar ao Gitea
git add .
git commit -m "feat: atualiza mensagem do alert bar"
git push
# 5. Aguardar o ArgoCD sincronizar (~3 minutos)
# Acompanhe em: http://192.168.56.10:8080 (Vagrant) | http://localhost:8080 (direto)
# Resultado em: http://192.168.56.10:9090 (Vagrant) | http://localhost:9090 (direto)sed -i 's/replicas: 1/replicas: 3/' k8s/deployment.yaml
git add k8s/deployment.yaml
git commit -m "scale: aumenta réplicas para 3"
git push
# Verificar os pods subindo
kubectl get pods -n devops-lab -wgit revert HEAD --no-edit
git push
# O ArgoCD reverte o cluster automaticamente
# Sem kubectl, sem acesso direto ao cluster# Tente modificar o cluster diretamente (fora do Git)
kubectl scale deployment devops-app -n devops-lab --replicas=5
# Aguarde ~3 minutos — o ArgoCD vai reverter para o que está no Git
kubectl get pods -n devops-labOs comandos abaixo são executados dentro da VM (vagrant ssh). O Floci está acessível em localhost:4566 de dentro da VM.
cd aws-lab/terraform
tofu init
tofu plan
tofu apply -auto-approve
# Verificar a fila criada
export AWS_ENDPOINT_URL=http://localhost:4566
export AWS_ACCESS_KEY_ID=test
export AWS_SECRET_ACCESS_KEY=test
export AWS_DEFAULT_REGION=us-east-1
aws sqs list-queues
# Enviar e receber mensagem
aws sqs send-message \
--queue-url http://localhost:4566/000000000000/devops-essentials-lab-queue \
--message-body "Olá do DevOps Essentials!"
aws sqs receive-message \
--queue-url http://localhost:4566/000000000000/devops-essentials-lab-queue
# Destruir a fila
tofu destroy -auto-approveOs comandos abaixo são executados dentro da VM (vagrant ssh).
export AWS_ENDPOINT_URL=http://localhost:4566
export AWS_ACCESS_KEY_ID=test
export AWS_SECRET_ACCESS_KEY=test
export AWS_DEFAULT_REGION=us-east-1
# Criar bucket e fazer upload
aws s3 mb s3://devops-essentials-lab
echo "Olá do DevOps Essentials!" | aws s3 cp - s3://devops-essentials-lab/hello.txt
# Listar e ler
aws s3 ls s3://devops-essentials-lab/
aws s3 cp s3://devops-essentials-lab/hello.txt -
# Limpar
aws s3 rb s3://devops-essentials-lab --force| Ferramenta | Papel no lab |
|---|---|
| Kind | Cria um cluster Kubernetes dentro do Docker — sem precisar de VM |
| Gitea | Servidor Git self-hosted — o "GitHub" local do lab |
| ArgoCD | Operador GitOps — observa o Gitea e sincroniza o cluster automaticamente |
| Floci | Emulador local de serviços AWS (S3, SQS, DynamoDB, Lambda) |
| OpenTofu | IaC open source — fork do Terraform pela Linux Foundation (Apache 2.0) |
| Flask | Framework web Python — base da aplicação de demonstração |
| Helm | Gerenciador de pacotes Kubernetes — instala Gitea e ArgoCD |
kubectl describe pod -n devops-lab <nome-do-pod>
# Imagem não carregada no Kind
kind load docker-image devops-app:latest --name devops-labkubectl exec -n argocd deploy/argocd-server -- \
curl -sf http://gitea-http.gitea.svc.cluster.local:3000
kubectl get pods -n giteakubectl get pods -n tools
kubectl logs -n tools deploy/floci
curl http://localhost:4566/_localstack/health # de dentro da VMlsof -i :3000
lsof -i :8080
# Pare o processo ou rode: bash teardown.shvagrant status
vagrant reload # reinicia a VM
vagrant destroy -f && vagrant up # recria do zero# Force sync manual
kubectl -n argocd patch app devops-app \
--type merge -p '{"operation":{"initiatedBy":{"username":"admin"},"sync":{"revision":"HEAD"}}}'bash teardown.shRemove o cluster Kind e todos os recursos. Não deixa nada para trás.
Este lab faz parte do curso DevOps Essentials (523) da 4Linux.
Próximos passos na trilha: