Aplicação ASP.NET Core rodando em cluster Kubernetes (EKS) na AWS, com infraestrutura provisionada via Terraform e deploy automatizado via Helm.
Repositório: https://github.com/gilbertomt/devops-nt
- Código Terraform - Provisiona infraestrutura completa na AWS
- Dockerfile - Containeriza a aplicação .NET com multi-stage build
- Manifests Helm - Gerencia deployment no Kubernetes
- Documentação - Instruções completas de execução
- Scripts de Automação - Deploy e destroy com um comando
Antes de começar, você precisa ter estas ferramentas instaladas:
- Git - Instruções de instalação
- AWS CLI - Instruções de instalação
- Terraform - Instruções de instalação
- kubectl - Instruções de instalação
- Helm - Instruções de instalação
- Docker - Instruções de instalação
Depois de instalar, configure suas credenciais AWS:
aws configureInformar:
AWS Access Key ID: credencial de acessoAWS Secret Access Key: chave secretaDefault region name:us-east-1Default output format: pressionar Enter
Para validar:
aws sts get-caller-identityCom os requisitos configurados, clone o projeto e execute:
git clone https://github.com/gilbertomt/devops-nt
cd devops-nt
bash scripts/deploy.shO script executa automaticamente as seguintes fases:
- Primeiro cria a infraestrutura (EKS, VPC, ECR) sem Helm
- Faz build e push da imagem, depois aplica os charts Helm (ingress + app)
Tempo estimado: 15-20 minutos.
Para entender cada etapa ou em caso de falha do script automatizado:
cd terraform
# Inicializar e validar
terraform init
terraform plan -var="deploy_helm=false"
# Aplicar mudanças (SEM Helm nesta fase)
terraform apply -var="deploy_helm=false"
# Confirmar com 'yes'
# Exportar outputs necessários
export ECR_REPO=$(terraform output -raw ecr_repository_url)
export AWS_REGION=$(terraform output -raw aws_region)
export CLUSTER_NAME=$(terraform output -raw cluster_name)
cd ..Aguardar 10-15 minutos para criação do cluster EKS e recursos relacionados.
Nota importante: Use -var="deploy_helm=false" para que o Terraform crie apenas a infraestrutura (VPC, EKS, ECR) sem instalar os charts Helm. Você aplicará o Helm no Passo 5.
# Autenticar no ECR
aws ecr get-login-password --region "$AWS_REGION" \
| docker login --username AWS --password-stdin \
$(echo "$ECR_REPO" | cut -d'/' -f1)
# Construir imagem
docker build -f app/Dockerfile -t "$ECR_REPO:v1" .
# Enviar para repositório
docker push "$ECR_REPO:v1"# Atualizar kubeconfig
aws eks update-kubeconfig \
--region "$AWS_REGION" \
--name "$CLUSTER_NAME"
# Validar conectividade
kubectl get nodesResultado esperado: 3 nodes com status Ready.
# Adicionar repositório Helm
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
# Instalar controller
helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--create-namespace \
--set controller.service.type=LoadBalancerAguardar provisionamento do LoadBalancer (2-3 minutos).
# Criar namespace
kubectl create namespace devops-nt-app --dry-run=client -o yaml | kubectl apply -f -
# Deploy via Helm
helm upgrade --install devops-nt-app ./helm/devops-nt-app \
--set image.repository="$ECR_REPO" \
--set image.tag="v1" \
-n devops-nt-appMonitorar status dos pods:
kubectl get pods -n devops-nt-app -wkubectl get svc ingress-nginx-controller -n ingress-nginx -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'
echo ""Acessar o endereço retornado via navegador ou curl.
curl http://[ENDERECO_DO_LOADBALANCER]/Resposta esperada: mensagem de status da aplicação.
kubectl get nodesResultado: 3 nodes com status Ready.
kubectl get pods -n devops-nt-appResultado: 3 pods com status Running.
curl http://[ENDERECO_DO_LOADBALANCER]/healthResposta esperada: {"status":"healthy","service":"devops-nt-app"}.
Para remover todos os recursos provisionados:
bash scripts/destroy.shConfirmar com sim quando solicitado.
Se você executou o deploy manual, siga estes passos na ordem inversa:
Passo 1: Remover aplicação
helm uninstall devops-nt-app -n devops-nt-app
kubectl delete namespace devops-nt-appPasso 2: Remover NGINX Ingress Controller
helm uninstall ingress-nginx -n ingress-nginx
kubectl delete namespace ingress-nginxPasso 3: Destruir infraestrutura
cd terraform
terraform destroy
# Confirmar com 'yes'
cd ..Aguardar 10-15 minutos para remoção completa dos recursos.
O destroy (manual ou automatizado) remove:
- Deployment Helm
- NGINX Ingress Controller
- Cluster EKS e nodes
- VPC e recursos de rede
- Repositório ECR (com imagens, se houver)
Ferramenta não instalada. Consultar links na seção Requisitos acima.
# Verificar logs
kubectl logs -n devops-nt-app -l app=devops-nt-app
# Ver eventos
kubectl get events -n devops-nt-app --sort-by='.lastTimestamp'aws configure # Reconfigurar
aws sts get-caller-identity # ValidarIsso é normal. Aguarde até 5 minutos. Para verificar o status:
kubectl get svc -n ingress-nginx -wdevops-nt/
│
├── app/ ← REQUISITO: Aplicação ASP.NET Core
│ ├── Dockerfile # Multi-stage build
│ └── devops-nt-app/ # Código-fonte C#
│
├── helm/ ← REQUISITO: Charts Kubernetes
│ └── devops-nt-app/
│ ├── Chart.yaml # Metadados do chart
│ ├── values.yaml # Valores configuráveis
│ └── templates/
│ ├── deployment.yaml # Pod deployment
│ ├── service.yaml # ClusterIP service
│ └── ingress.yaml # NGINX ingress
│
├── terraform/ ← REQUISITO: Infraestrutura como Código
│ ├── providers.tf # Configuração de providers
│ ├── network.tf # VPC, subnets, NAT Gateway
│ ├── eks.tf # Cluster EKS e node groups
│ ├── ecr.tf # ECR com force_delete
│ ├── helm.tf # Helm releases (condicionado a deploy_helm)
│ ├── variables.tf # Variáveis (deploy_helm, app_replicas)
│ └── output.tf # Outputs (ECR, cluster, region)
│
├── scripts/ ← Automação
│ ├── deploy.sh # Deploy em 2 fases
│ └── destroy.sh # Cleanup automático
│
└── README.md ← REQUISITO: Instruções