Skip to content

renanjava/prova-eliel

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CRUD com Load Balancer no NGINX e Kubernetes (Entidade Pessoa e Trabalho)

É uma API RESTful avançada desenvolvida para gerenciar entidades de Pessoa e Trabalho, com um relacionamento entre elas. A aplicação utiliza o framework NestJS e o ORM Prisma para persistência de dados em um banco PostgreSQL. Além disso, a aplicação é escalável, utilizando múltiplas instâncias balanceadas por um servidor NGINX e gerenciada em um cluster Kubernetes.

Funcionalidades

  • Gerenciamento de Pessoas: Criação, consulta, atualização e exclusão de registros de pessoas.
  • Gerenciamento de Trabalhos: Criação, consulta, atualização e exclusão de registros de trabalhos.
  • Relacionamento Pessoa-Trabalho: Cada pessoa está associada a um trabalho, permitindo consultas relacionadas.
  • Validação de Dados: Validação robusta de DTOs (Data Transfer Objects) utilizando class-validator.
  • Persistência com PostgreSQL: Banco de dados relacional gerenciado pelo Prisma ORM.
  • Load Balancer: Utilização de NGINX para balancear a carga entre múltiplas instâncias da aplicação.
  • Monitoramento e Backup: Health Check com LivenessProbe e backup diário do banco de dados às 03:00 da manhã.

Tecnologias Utilizadas

  • NestJS: Framework para criar a API RESTful, gerenciando rotas e lógica de negócio.
  • TypeScript: Linguagem principal, garantindo tipagem estática e maior segurança.
  • Prisma: ORM para gerenciar o banco PostgreSQL, incluindo migrations e sincronização de dados.
  • PostgreSQL: Banco de dados relacional para armazenar pessoas e trabalhos.
  • NGINX: Servidor web utilizado como load balancer.
  • Docker: Contêineres para a aplicação, banco de dados e servidor web.
  • Kubernetes: Orquestração de contêineres para gerenciar pods, services, deployments e replicasets.
  • Minikube: Ambiente de desenvolvimento local para Kubernetes.

Pré-requisitos

Antes de começar, certifique-se de ter instalado:

Como Executar a Aplicação

Executando com Docker

  1. Clone o repositório:
    git clone https://github.com/renanjava/prova-eliel
    cd prova-eliel
  2. Configure as variáveis de ambiente:

    Crie um arquivo .env com base no .env.example:

    DATABASE_URL=postgresql://user:password@postgres:5432/my_db
    PORT=3000
        
  3. Suba os contêineres com Docker Compose:
    docker-compose up --build

    Isso iniciará o banco PostgreSQL, duas instâncias da aplicação NestJS e o NGINX como Load Balancer.

Executando com Kubernetes (via Minikube)

  1. Inicie o Minikube com suporte ao provisionamento de volumes:

    O addon default-storageclass é necessário para que os volumes persistentes funcionem corretamente no cluster.

    minikube start --addons=default-storageclass
  2. Monte os arquivos de configuração necessários:

    Monte um diretório local (./config) dentro do Minikube, permitindo que o cluster acesse a configuração de criptografia de dados sensíveis.

    minikube mount ./config:/var/lib/minikube/certs/config
  3. Reinicie o Minikube com a configuração de criptografia ativada:

    Essa etapa configura o servidor da API para usar a política de criptografia definida no arquivo crypt.yaml.

    minikube start --extra-config=apiserver.encryption-provider-config=/var/lib/minikube/certs/config/crypt.yaml --addons=default-storageclass
  4. Ative o metrics-server:

    Esse addon permite coletar métricas dos pods, como uso de CPU e memória.

    minikube addons enable metrics-server
  5. Ative o addon de volumes persistentes:

    Permite o uso de volumes persistentes com o driver de armazenamento local padrão.

    minikube addons enable csi-hostpath-driver
  6. Abra o dashboard do Minikube:

    Interface gráfica para visualizar recursos do cluster em tempo real.

    minikube dashboard
  7. Aplique todos os manifestos YAML do projeto:

    Cria os recursos do banco de dados, da aplicação, e do NGINX dentro do cluster.

    kubectl apply -f db-configmaps.yaml
    kubectl apply -f db-secrets.yaml
    kubectl apply -f db-statefulsets.yaml
    kubectl apply -f app-configmaps.yaml
    kubectl apply -f app-secrets.yaml
    kubectl apply -f app-deployment.yaml
    kubectl apply -f app-service.yaml
    kubectl apply -f nginx-config.yaml
    kubectl apply -f nginx-deployment.yaml
    kubectl apply -f nginx-service-loadbalancer.yaml
        
  8. Inicie o túnel do Minikube:

    O túnel cria rotas no seu sistema para permitir o acesso externo ao LoadBalancer.

    minikube tunnel
  9. Verifique os serviços do cluster:

    O comando abaixo mostra os serviços criados, incluindo o EXTERNAL-IP do LoadBalancer.

    kubectl get svc
  10. Acesse a aplicação pelo navegador:

    Copie a URL do campo EXTERNAL-IP referente ao serviço NGINX e cole no seu navegador para acessar a aplicação.

Arquitetura

  • Banco de Dados: PostgreSQL gerenciado pelo Prisma e Kubernetes StatefulSets.
  • Load Balancer: NGINX balanceando a carga entre múltiplas instâncias da aplicação.
  • Configuração: ConfigMaps para variáveis de ambiente e Secrets para valores sensíveis.
  • Backup: CronJob para backup diário do banco de dados às 03:00 da manhã.
  • Volumes: PersistentVolumeClaim para armazenamento de dados do banco.
  • Monitoramento: Health Check com LivenessProbe a cada 3 segundos.

Escalabilidade

O uso de Kubernetes permite gerenciar réplicas da aplicação, garantindo alta disponibilidade e resiliência. O NGINX atua como Load Balancer, distribuindo requisições entre as instâncias. Além disso, o armazenamento persistente e os backups automáticos garantem a integridade dos dados.

About

Kubernetes, NGINX, Load Balancer, Database Backup, Health Check, Minio/AWS S3

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published