#!/bin/bash # ============================================================================= # Setup da Aula 05 - KEDA + Victoria Metrics # ============================================================================= # # Este script instala e configura: # 1. Victoria Metrics (coleta e armazena métricas) # 2. KEDA (auto-scaling baseado em eventos) # 3. Aplicação node-bugado com auto-scaling # # Pré-requisitos: # - Kubernetes cluster rodando (k3s, minikube, kind, etc) # - kubectl configurado # - Helm 3.x instalado # # Uso: # chmod +x setup.sh # ./setup.sh # # ============================================================================= set -e # Para na primeira falha # Cores para output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Funções de log log_info() { echo -e "${BLUE}[INFO]${NC} $1"; } log_success() { echo -e "${GREEN}[OK]${NC} $1"; } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } log_error() { echo -e "${RED}[ERRO]${NC} $1"; } # ============================================================================= # VERIFICAÇÕES INICIAIS # ============================================================================= log_info "Verificando pré-requisitos..." # Verificar kubectl if ! command -v kubectl &> /dev/null; then log_error "kubectl não encontrado. Instale o kubectl primeiro." exit 1 fi log_success "kubectl encontrado" # Verificar conexão com cluster if ! kubectl cluster-info &> /dev/null; then log_error "Não foi possível conectar ao cluster Kubernetes." exit 1 fi log_success "Conectado ao cluster Kubernetes" # Verificar helm if ! command -v helm &> /dev/null; then log_error "Helm não encontrado. Instale o Helm >= 3.14 primeiro." log_info "Instalação: https://helm.sh/docs/intro/install/" exit 1 fi log_success "Helm $(helm version --short) encontrado" echo "" # ============================================================================= # 1. INSTALAR VICTORIA METRICS # ============================================================================= log_info "=== Instalando Victoria Metrics ===" # Adicionar repo do Victoria Metrics log_info "Adicionando repositório Helm do Victoria Metrics..." helm repo add vm https://victoriametrics.github.io/helm-charts/ 2>/dev/null || true helm repo update # Verificar se já está instalado if helm status vm -n monitoring &> /dev/null; then log_warn "Victoria Metrics já está instalado. Pulando..." else log_info "Instalando Victoria Metrics Stack..." helm install vm vm/victoria-metrics-k8s-stack \ --namespace monitoring \ --create-namespace \ --set vmsingle.enabled=true \ --wait log_success "Victoria Metrics instalado com sucesso!" fi # Aguardar pods ficarem prontos log_info "Aguardando pods do Victoria Metrics ficarem prontos..." kubectl wait --for=condition=ready pod \ -l app.kubernetes.io/name=vmsingle \ -n monitoring \ --timeout=120s 2>/dev/null || true log_success "Victoria Metrics está rodando" echo "" # ============================================================================= # 2. INSTALAR KEDA # ============================================================================= log_info "=== Instalando KEDA ===" # Adicionar repo do KEDA log_info "Adicionando repositório Helm do KEDA..." helm repo add kedacore https://kedacore.github.io/charts 2>/dev/null || true helm repo update # Verificar se já está instalado if helm status keda -n keda &> /dev/null; then log_warn "KEDA já está instalado. Pulando..." else log_info "Instalando KEDA..." helm install keda kedacore/keda \ --namespace keda \ --create-namespace \ --wait log_success "KEDA instalado com sucesso!" fi # Aguardar pods ficarem prontos log_info "Aguardando pods do KEDA ficarem prontos..." kubectl wait --for=condition=ready pod \ -l app=keda-operator \ -n keda \ --timeout=120s log_success "KEDA está rodando" echo "" # ============================================================================= # 3. INSTALAR NGINX INGRESS (se não existir) # ============================================================================= log_info "=== Verificando NGINX Ingress ===" if kubectl get ingressclass nginx &> /dev/null; then log_success "NGINX Ingress já está instalado" else log_info "Instalando NGINX Ingress Controller..." helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx 2>/dev/null || true helm repo update helm install nginx-ingress ingress-nginx/ingress-nginx \ --namespace ingress-nginx \ --create-namespace \ --wait log_success "NGINX Ingress instalado" fi echo "" # ============================================================================= # 4. APLICAR MANIFESTOS DA APLICAÇÃO # ============================================================================= log_info "=== Aplicando manifestos da aplicação ===" # Diretório do script SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" log_info "Aplicando ConfigMap..." kubectl apply -f "$SCRIPT_DIR/configmap.yaml" log_info "Aplicando Deployment..." kubectl apply -f "$SCRIPT_DIR/deployment.yaml" log_info "Aplicando Service..." kubectl apply -f "$SCRIPT_DIR/service.yaml" log_info "Aplicando Ingress..." kubectl apply -f "$SCRIPT_DIR/ingress-nginx.yaml" log_info "Aplicando ScaledObject (KEDA)..." kubectl apply -f "$SCRIPT_DIR/scaledobject.yaml" log_success "Todos os manifestos aplicados!" echo "" # ============================================================================= # 5. AGUARDAR TUDO FICAR PRONTO # ============================================================================= log_info "=== Aguardando aplicação ficar pronta ===" log_info "Aguardando pods da aplicação..." kubectl wait --for=condition=ready pod \ -l app=node-bugado \ --timeout=120s log_success "Aplicação está rodando!" echo "" # ============================================================================= # RESUMO FINAL # ============================================================================= echo "==============================================" echo -e "${GREEN} Setup Completo!${NC}" echo "==============================================" echo "" echo "Componentes instalados:" echo " - Victoria Metrics (namespace: monitoring)" echo " - KEDA (namespace: keda)" echo " - NGINX Ingress Controller" echo " - Aplicação node-bugado (namespace: default)" echo "" echo "Comandos úteis:" echo " # Ver pods da aplicação" echo " kubectl get pods -l app=node-bugado" echo "" echo " # Ver ScaledObject e HPA" echo " kubectl get scaledobject" echo " kubectl get hpa" echo "" echo " # Teste de stress (300 requisições)" echo " ./teste-stress.sh http://localhost 300" echo "" echo " # Monitorar scaling em tempo real" echo " watch kubectl get pods -l app=node-bugado" echo "" echo "==============================================" echo "" # Mostrar status atual log_info "Status atual:" echo "" kubectl get pods -l app=node-bugado echo "" kubectl get scaledobject echo "" kubectl get hpa