Pipeline GitOps production-ready com GitHub Actions, Amazon EKS, Terraform e estratégia Blue/Green Deployment para zero downtime.
Este projeto apresenta uma implementação completa de GitOps para Kubernetes utilizando Amazon EKS, demonstrando como automatizar deployments com zero downtime através de práticas modernas de CI/CD e Blue/Green Deployment.
Para validar a solução, implementei uma pipeline completa de GitOps onde:
🔄 GitHub Actions orquestra todo o fluxo de CI/CD automatizado 🏗️ Terraform provisiona a infraestrutura completa na AWS (VPC, EKS, IAM, ECR) 🎯 Objetivo: Demonstrar uma pipeline production-ready com deploy automatizado, estratégia Blue/Green e rollback rápido
🔄 Fluxo GitOps Implementado
Build & Test: Ao fazer push no repositório, o GitHub Actions valida manifestos, constrói imagens Docker dos 7 microserviços e envia para o Amazon ECR
Deploy Blue/Green: A pipeline de CD provisiona a nova versão (v2) em paralelo à versão atual (v1), executa health checks e aguarda aprovação manual
Traffic Switch: Após validação, o tráfego é redirecionado para a nova versão através do Service Selector, garantindo zero downtime
Rollback: Em caso de problemas, o rollback para a versão anterior é executado em menos de 30 segundos
✅ Resultado: A implementação demonstra um pipeline GitOps completo e resiliente, utilizando Terraform, GitHub Actions, Amazon EKS, AWS Load Balancer Controller e External DNS para automação end-to-end de deployments Kubernetes.
┌─────────────────────────────────────────────────────────────┐
│ Developer │
│ git commit → git push │
└────────────────┬────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ CI Pipeline (GitHub Actions) - Automático │
├─────────────────────────────────────────────────────────────┤
│ ✅ Validate Kubernetes manifests │
│ ✅ Build Docker images (7 microservices) │
│ ✅ Security scan & tests │
│ ✅ Push to Amazon ECR │
└────────────────┬────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ CD Pipeline (GitHub Actions) - Manual Approval │
├─────────────────────────────────────────────────────────────┤
│ ✅ Deploy v2 (Blue/Green) │
│ ✅ Health checks │
│ ✅ Switch traffic (Service selector) │
│ ✅ Verify deployment │
└────────────────┬────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Production (Amazon EKS) │
│ Application live @ eks.devopsproject.com.br │
└─────────────────────────────────────────────────────────────┘
- AWS Account com permissões administrativas
- AWS CLI configurado (v2.x)
- Terraform (v1.12+)
- kubectl (v1.28+)
- Conta GitHub (para Actions)
- Domínio próprio (opcional)
Siga o guia detalhado de configuração:
Este guia cobre:
- Configuração AWS CLI e credenciais
- Setup Terraform backend
- Criação de IAM roles necessárias
- Configuração Docker Hub
- Configuração GitHub Actions
- Repositórios ECR
Este script provisiona automáticamente via Terraform todas as stacks de infraestrutura necessárias para o projeto. Antes de executar o script rebuild-all.sh siga as orientações do guia de configuração inicial.
# Deploy automatizado (20-25 min)
./scripts/rebuild-all.sh# Ver pods
kubectl get pods -n ecommerce
# Ver ingress e ALB
kubectl get ingress -n ecommerce
# Acessar aplicação
# Via ALB direto
ALB_URL=$(kubectl get ingress ecommerce-ingress -n ecommerce \
-o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
echo "http://$ALB_URL"Trigger: Push em main ou Pull Request
Pipeline:
- Validate - Validação de YAML e manifests Kubernetes
- Build - Build de 7 imagens Docker (microservices)
- Test - Testes automatizados (placeholder)
- Push - Upload para Amazon ECR
Tempo: ~2 minutos
Trigger: Manual (workflow_dispatch)
Pipeline:
- Deploy v2 - Aplica manifests Kubernetes v2
- Health Check - Valida pods prontos
- Switch Traffic - Altera Service selector (v1 → v2)
- Verify - Testa endpoint público
Tempo: ~40 segundos
Estratégia: Blue/Green Deployment (zero downtime)
Trigger: Manual (workflow_dispatch)
Pipeline:
- Switch Traffic - Reverte Service selector (v2 → v1)
- Verify - Valida rollback bem-sucedido
- Cleanup - Remove recursos v2 (opcional)
Tempo: < 30 segundos
IAM User: github-actions-eks
├── AmazonEC2ContainerRegistryFullAccess (managed)
├── AmazonEKSClusterPolicy (managed)
└── EKS-CICD-Access (inline)
Princípio: Least Privilege - apenas permissões necessárias
# aws-auth ConfigMap
mapUsers:
- userarn: arn:aws:iam::ACCOUNT:user/github-actions-eks
username: github-actions-eks
groups:
- system:masters # Cluster admin para CI/CD- GitHub Environment Secrets - Credenciais AWS
- Kubernetes Secrets - Application secrets
- ECR - Container registry privado
Como funciona:
Estado Inicial:
├─ v1: 1 pod (ATIVO - 100% tráfego)
└─ v2: não existe
Durante Deploy:
├─ v1: 1 pod (ATIVO - 100% tráfego)
└─ v2: 2 pods (STANDBY - 0% tráfego)
Após Switch:
├─ v1: 1 pod (STANDBY - 0% tráfego)
└─ v2: 2 pods (ATIVO - 100% tráfego)
Rollback (<30s):
├─ v1: 1 pod (ATIVO - 100% tráfego)
└─ v2: 2 pods (STANDBY - 0% tráfego)
Vantagens:
- ✅ Zero downtime
- ✅ Rollback instantâneo (troca selector)
- ✅ Testes em produção sem impacto
- ✅ Duas versões simultâneas para validação
| Recurso | Quantidade | Descrição |
|---|---|---|
| EKS Cluster | 1 | Kubernetes 1.32 |
| EC2 Instances | 3 | t3.medium (Node Group) |
| VPC | 1 | 10.0.0.0/16 |
| Subnets | 6 | 2 public + 4 private |
| NAT Gateways | 2 | High availability |
| Application Load Balancer | 1 | Ingress traffic |
| ECR Repositories | 7 | Container images |
| Route53 Records | 1 | DNS (opcional) |
| Recurso | Quantidade | Descrição |
|---|---|---|
| Deployments | 8 | v1 + v2 + 6 microservices |
| Services | 8 | ClusterIP + LoadBalancer |
| Ingress | 1 | ALB Controller |
| ConfigMaps | 2 | NGINX v2 config |
| Namespace | 1 | ecommerce |
- EKS Cluster: $0.10/h
- EC2 (3x t3.medium): $0.125/h
- NAT Gateway (2x): $0.09/h
- ALB: $0.025/h
- Total: ~$0.34/hora
- EKS Cluster: ~$73/mês
- EC2 (3x t3.medium): ~$90/mês
- NAT Gateways: ~$65/mês
- ALB: ~$18/mês
- Total: ~$246/mês
# SEMPRE destruir após testes!
./scripts/destroy-all.sh
# Custos após destroy: $0/mêsDica: Para laboratório, use por 2-4 horas (~$1-2 total)
❌ Problema: GitHub Actions CI falha com erro "exit code 254" no build das imagens
✅ Solução:
# Verificar se as permissões ECR estão corretas
aws iam list-attached-user-policies --user-name github-actions-eks
# Se não aparecer GitHubActionsEKSPolicy, execute:
cd scripts
./setup-github-actions-iam.shA policy deve incluir permissões de:
ecr:GetAuthorizationTokenecr:CreateRepositoryecr:PutImage,ecr:BatchGetImage, etc.ecr:StartImageScan
❌ Problema: CI não dispara após push
✅ Solução: O CI só dispara para mudanças em:
- Arquivos dentro de
06-ecommerce-app/** .github/workflows/ci.yml
Mudanças no README.md raiz não disparam o CI.
❌ Problema: CD requer aprovação mas não inicia
✅ Solução: Verifique se o environment "production" está configurado:
- GitHub → Settings → Environments
- Crie "production" se não existir
- Configure os secrets:
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,AWS_ACCOUNT_ID
❌ Problema: terraform apply falha com erro de state lock
✅ Solução:
# Verificar locks no DynamoDB
aws dynamodb scan --table-name terraform-state-lock
# Forçar unlock (use com cuidado!)
terraform force-unlock <LOCK_ID>❌ Problema: kubectl não conecta ao cluster
✅ Solução:
# Atualizar kubeconfig
aws eks update-kubeconfig --name eks-devopsproject-cluster --region us-east-1
# Verificar conectividade
kubectl cluster-infoInfraestrutura base inspirada no trabalho de Kenerry Serain.
Ecommerece-app desenvolvido por Rayan Slim
- 📹 Canal YouTube: @RayanSlim087
Pipeline GitOps e CI/CD desenvolvidos como evolução do projeto original.
- 📹 YouTube: DevOps Project
- 💼 Portfólio: devopsproject.com.br
- 💻 GitHub: @jlui70
Se este projeto foi útil:
- ⭐ Star no repositório
- 🔄 Fork e contribua
- 📹 Compartilhe o conhecimento
- 🤝 Abra issues e PRs
MIT License - Veja LICENSE para detalhes.
trigger CI
