Guia de Desenvolvimento - Infra Operator
Este guia cobre desenvolvimento local, testes e fluxos de trabalho de deployment para o infra-operator.
Índice
- Pré-requisitos
- Configuração de Desenvolvimento Local
- Fluxos de Trabalho de Desenvolvimento
- Testes
- Deployment
- Troubleshooting
Pré-requisitos
Ferramentas Necessárias
Comando:
# Verificar se as ferramentas estão instaladas
go version # Go 1.21+
kubectl version # Kubernetes CLI
docker --version # Docker ou OrbStack
task --version # Task (go-task) ferramenta de automação
Instalando Ferramentas Faltantes
Comando:
# macOS (usando Homebrew)
brew install go
brew install kubectl
brew install go-task
brew install jq
# Instalar OrbStack (alternativa ao Docker para macOS)
# Download de: https://orbstack.dev/
# Ou usar Docker Desktop
# Download de: https://www.docker.com/products/docker-desktop
Cluster Kubernetes
Você precisa de um cluster Kubernetes local. Opções:
- OrbStack (recomendado para macOS) - Kubernetes integrado
- Docker Desktop - Habilitar Kubernetes nas configurações
- kind -
brew install kind && kind create cluster - minikube -
brew install minikube && minikube start
Verificar cluster:
kubectl cluster-info
kubectl get nodes
Configuração de Desenvolvimento Local
1. Configuração Inicial
Execute a configuração completa (necessário apenas uma vez):
Comando:
# Clonar/navegar para o projeto
cd /Users/andrebassi/works/.solutions/operators/infra-operator
# Executar setup (instala ferramentas, inicia LocalStack)
task setup
Isso irá:
- Verificar se todas as ferramentas necessárias estão instaladas
- Iniciar LocalStack para simulação AWS
- Inicializar LocalStack com recursos de teste
2. Verificar LocalStack
Comando:
# Verificar saúde do LocalStack
task localstack:health
# Listar serviços
curl http://localhost:4566/_localstack/health | jq
# Testar AWS CLI contra LocalStack
task localstack:aws -- s3 ls
task localstack:aws -- sqs list-queues
task localstack:aws -- dynamodb list-tables
3. Variáveis de Ambiente
Verifique o arquivo .env (criado a partir de .env.example):
cat .env
Variáveis principais:
AWS_ENDPOINT_URL=http://localhost:4566- Endpoint do LocalStackAWS_REGION=us-east-1- Região padrãoAWS_ACCESS_KEY_ID=test- Credenciais do LocalStackAWS_SECRET_ACCESS_KEY=test
Fluxos de Trabalho de Desenvolvimento
Fluxo 1: Desenvolvimento Local (Sem Kubernetes)
Execute o operator localmente sem fazer deploy no Kubernetes. Útil para iterações rápidas e debugging.
Comando:
# Iniciar modo de desenvolvimento
task dev
Isso irá:
- Iniciar LocalStack (se não estiver rodando)
- Gerar código (se controller-gen estiver disponível)
- Executar o binário do operator com
--clean-arch=true
O operator usará seu kubeconfig local para conectar ao cluster mas criará recursos AWS no LocalStack.
Logs serão transmitidos em tempo real.
Pressione Ctrl+C para parar.
Fluxo 2: Executar Contra o Cluster (Recomendado)
Execute o operator localmente mas reconcilie recursos no seu cluster Kubernetes:
Comando:
# Iniciar operator localmente, observando recursos do cluster
task run:local
Este modo:
- Executa operator na sua máquina (não in-cluster)
- Observa recursos Kubernetes (S3Buckets, AWSProviders, etc.)
- Cria recursos AWS no LocalStack
- Loga em
/tmp/log.txte console
Em outro terminal, aplicar recursos de teste:
Comando:
# Aplicar samples
kubectl apply -f config/samples/awsprovider_sample.yaml
kubectl apply -f config/samples/s3bucket_sample.yaml
# Observar status
kubectl get awsproviders -w
kubectl get s3buckets -w
# Verificar detalhes
kubectl describe s3bucket my-app-bucket
Fluxo 3: Deployment Completo no Cluster
Faça deploy do operator como um Pod no Kubernetes (similar à produção):
Comando:
# Fluxo de deployment completo
task dev:full
Isso irá:
- Executar testes unitários
- Construir imagem Docker
- Deploy no Kubernetes
- Instalar CRDs
- Aplicar recursos de exemplo
- Mostrar status
Monitorar o deployment:
Comando:
# Visualizar logs do operator
task k8s:logs
# Verificar status
task k8s:status
# Visualizar samples
task samples:status
Fluxo 4: Rebuild Rápido
Após fazer mudanças no código, reconstruir e fazer redeploy rapidamente:
Comando:
# Reconstruir imagem e reiniciar operator
task dev:quick
Isso é mais rápido que dev:full porque pula os testes e apenas reconstrói a imagem.
Testes
Testes Unitários
Execute testes unitários puros (sem Kubernetes, sem AWS):
Comando:
# Executar testes unitários com cobertura
task test:unit
Os testes estão em:
internal/domain/s3/bucket_test.go- Testes de lógica de domínio- Adicione mais testes em arquivos
*_test.go
Relatório de cobertura:
# Visualizar cobertura detalhada
go tool cover -html=coverage.out
Testes de Integração
Testar contra LocalStack (simulação AWS):
Comando:
# Executar testes de integração
task test:integration
Testes de integração:
- Usam endpoint LocalStack
- Criam buckets S3 reais, filas SQS, etc. (localmente)
- Testam interações com AWS SDK
- Localizados em
test/integration/
Testes End-to-End
Testes E2E completos com operator deployado no cluster:
Comando:
# Executar suite completa de testes E2E
task test:e2e
Isso irá:
- Deploy do operator no cluster
- Iniciar LocalStack
- Aplicar fixtures de teste de
test/e2e/fixtures/ - Verificar que recursos são criados
- Mostrar status
Fixtures de Teste E2E:
test/e2e/fixtures/01-awsprovider.yaml- Provider LocalStacktest/e2e/fixtures/02-s3bucket.yaml- Buckets de teste
Executar Todos os Testes
Comando:
# Executar testes unitários, de integração e E2E
task test:all
Deployment
Deploy em Cluster Local
Comando:
# Instalar CRDs
task k8s:install-crds
# Deploy do operator
task k8s:deploy
# Verificar
task k8s:status
Aplicar Samples
Comando:
# Criar recursos de exemplo (AWSProvider + S3Bucket)
task samples:apply
# Verificar status
task samples:status
# Visualizar status detalhado
kubectl describe s3bucket -n default
Visualizar Logs
Comando:
# Stream de logs do operator
task k8s:logs
# Ou diretamente com kubectl
kubectl logs -n infra-operator-system \
-l control-plane=controller-manager \
-f --tail=100
Reiniciar Operator
Comando:
# Reiniciar deployment do operator
task k8s:restart
Fazer Undeploy
Comando:
# Remover operator (mantém CRDs)
task k8s:undeploy
# Remover tudo incluindo CRDs
task clean:all
Construindo e Publicando
Construir Binário
Comando:
# Construir binário do operator
task build
O binário estará em: bin/manager
Construir Imagem Docker
Comando:
# Construir imagem com tag padrão
task docker:build
A imagem será tagueada como:
ttl.sh/infra-operator:dev-YYYYMMDD-HHMMSSttl.sh/infra-operator:latest
Push para Registry
Comando:
# Construir e fazer push para ttl.sh (registry efêmero)
task docker:push
Usando ttl.sh:
- Imagens expiram automaticamente após 24 horas
- Sem autenticação necessária
- Perfeito para testes
- Formato:
ttl.sh/infra-operator:tag
Para produção, use um registry real:
Atualizar Taskfile.yaml:
vars:
DOCKER_REGISTRY: ghcr.io/your-org
# ou: docker.io/your-username
# ou: your-registry.io
Gerenciamento do LocalStack
Iniciar/Parar LocalStack
Comando:
# Iniciar LocalStack
task localstack:start
# Parar LocalStack
task localstack:stop
# Reiniciar LocalStack
task localstack:restart
# Visualizar logs
task localstack:logs
Health Check
Comando:
# Verificar saúde do LocalStack
task localstack:health
# Ou manualmente
curl http://localhost:4566/_localstack/health | jq
Executar Comandos AWS CLI
Comando:
# Listar buckets S3 no LocalStack
task localstack:aws -- s3 ls
# Criar um bucket de teste
task localstack:aws -- s3 mb s3://test-bucket
# Listar filas SQS
task localstack:aws -- sqs list-queues
# Descrever tabela DynamoDB
task localstack:aws -- dynamodb describe-table --table-name test-table
Geração de Código
Gerar DeepCopy e CRDs
Comando:
# Gerar código (requer controller-gen)
task generate
Instalar controller-gen:
go install sigs.k8s.io/controller-tools/cmd/controller-gen@latest
Depois atualize Taskfile.yaml para descomentar a linha controller-gen.
Formatar Código
Comando:
# Formatar todo código Go
task fmt
Fazer Lint do Código
Comando:
# Executar linter
task lint
Instalar golangci-lint:
brew install golangci-lint
Troubleshooting
Operator Não Está Reconciliando
Verificar se operator está rodando:
task k8s:status
kubectl get pods -n infra-operator-system
Verificar logs por erros:
task k8s:logs
Problemas comuns:
- AWSProvider não Ready - verificar credenciais
- CRDs não instalados - executar
task k8s:install-crds - Problemas de RBAC - verificar
config/rbac/
LocalStack Não Está Funcionando
Verificar se LocalStack está rodando:
docker ps | grep localstack
task localstack:health
Reiniciar LocalStack:
task localstack:restart
Verificar logs do LocalStack:
task localstack:logs
Problemas comuns:
- Porta 4566 já em uso - parar serviços conflitantes
- Docker não está rodando - iniciar Docker/OrbStack
- Script de init falhou - verificar
hack/localstack-init.sh
S3Bucket Preso em NotReady
Verificar AWSProvider:
kubectl get awsproviders
kubectl describe awsprovider localstack
Verificar eventos do S3Bucket:
kubectl describe s3bucket my-app-bucket
Verificar se bucket existe no LocalStack:
task localstack:aws -- s3 ls
Problemas comuns:
- Provider não está ready - aguardar AWSProvider reconciliar
- Nome do bucket não é único - alterar nome do bucket
- LocalStack não acessível - verificar URL do endpoint
Recursos Não Estão Deletando
Verificar finalizers:
kubectl get s3bucket my-bucket -o yaml | grep finalizers -A 5
Forçar deleção (se preso):
kubectl patch s3bucket my-bucket \
-p '{"metadata":{"finalizers":[]}}' \
--type=merge
kubectl delete s3bucket my-bucket
Testes Unitários Falhando
Executar testes com output verbose:
go test -v -race ./internal/...
Executar teste específico:
go test -v -run TestBucket_Validate ./internal/domain/s3/
Problemas comuns:
- Caminhos de import errados - verificar nome do módulo em
go.mod - Dependências faltando - executar
go mod download
Testes de Integração Falhando
Garantir que LocalStack está rodando:
task localstack:start
task localstack:health
Verificar AWS_ENDPOINT_URL:
echo $AWS_ENDPOINT_URL # Deve ser http://localhost:4566
Executar testes de integração com debug:
export AWS_SDK_LOG_LEVEL=debug
task test:integration
Dicas de Desenvolvimento
Loop de Desenvolvimento Mais Rápido
- Use
task run:localao invés de deployment completo no cluster - Mantenha LocalStack rodando entre execuções de teste
- Use
deletionPolicy: Deleteem recursos de teste para auto-cleanup - Observe logs em terminal separado com
task k8s:logs
Debugging
Habilitar logging de debug:
Atualizar cmd/main.go:
opts := zap.Options{
Development: true,
// Adicionar:
Level: zapcore.DebugLevel,
}
Ou executar com flag:
go run ./cmd/main.go --zap-log-level=debug
Usar debugger delve:
# Instalar delve
go install github.com/go-delve/delve/cmd/dlv@latest
# Debugar operator
dlv debug ./cmd/main.go -- --clean-arch=true
Início Limpo
Remover todos os recursos e começar do zero:
Comando:
# Limpar tudo
task clean:all
# Começar do zero
task setup
task dev:full
Comandos Task Comuns
Referência rápida dos comandos mais usados:
Comando:
# Setup
task setup # Configuração inicial
task install-tools # Verificar ferramentas
# Desenvolvimento
task dev # Dev local (sem K8s)
task run:local # Executar contra cluster
task dev:full # Deployment completo
task dev:quick # Rebuild rápido
# Testes
task test:unit # Testes unitários
task test:integration # Testes de integração
task test:e2e # Testes E2E
task test:all # Todos os testes
# Build
task build # Construir binário
task docker:build # Construir imagem
task docker:push # Push da imagem
# Kubernetes
task k8s:install-crds # Instalar CRDs
task k8s:deploy # Deploy do operator
task k8s:status # Mostrar status
task k8s:logs # Stream de logs
task k8s:restart # Reiniciar operator
task k8s:undeploy # Remover operator
# Samples
task samples:apply # Aplicar samples
task samples:status # Verificar samples
task samples:delete # Remover samples
# LocalStack
task localstack:start # Iniciar LocalStack
task localstack:stop # Parar LocalStack
task localstack:health # Health check
task localstack:logs # Visualizar logs
task localstack:aws -- CMD # AWS CLI
# Cleanup
task clean # Limpar arquivos temporários
task clean:all # Limpar tudo
# Ajuda
task help # Mostrar todas as tasks
task --list # Listar tasks
Próximos Passos
- Implementar mais controllers - Usar S3 como template para Lambda, DynamoDB, etc.
- Adicionar webhooks - Webhooks de validação e mutação
- Adicionar métricas - Export de métricas Prometheus
- Melhorar testes - Mais testes de integração e E2E
- Deployment em produção - Helm chart, configuração IRSA