#!/bin/bash ############################################################ # Instala o Cluster Autoscaler no cluster Talos # Requer: cluster provisionado via setup.sh ############################################################ set -e # Cores RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR" 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}[ERROR]${NC} $1"; } echo "" echo "============================================" echo " Instalando Cluster Autoscaler" echo "============================================" echo "" # Verificar pré-requisitos if [ ! -f "kubeconfig" ]; then log_error "kubeconfig não encontrado! Execute setup.sh primeiro." exit 1 fi if [ ! -f "terraform.tfvars" ]; then log_error "terraform.tfvars não encontrado!" exit 1 fi export KUBECONFIG="$SCRIPT_DIR/kubeconfig" # Verificar conexão com cluster log_info "Verificando conexão com o cluster..." if ! kubectl get nodes &>/dev/null; then log_error "Não foi possível conectar ao cluster!" exit 1 fi log_success "Conectado ao cluster" # Obter valores do OpenTofu log_info "Obtendo configurações do OpenTofu..." WORKER_CONFIG_BASE64=$(tofu output -raw autoscaler_worker_config 2>/dev/null) TALOS_IMAGE_ID=$(tofu output -raw autoscaler_image_id 2>/dev/null) CLUSTER_NAME=$(tofu output -raw cluster_name 2>/dev/null) NETWORK_ID=$(tofu output -raw network_id 2>/dev/null) FIREWALL_ID=$(tofu output -raw firewall_id 2>/dev/null) SSH_KEY_NAME=$(tofu output -raw ssh_key_name 2>/dev/null) # Obter token do terraform.tfvars HCLOUD_TOKEN=$(grep 'hcloud_token' terraform.tfvars | cut -d'"' -f2) if [ -z "$WORKER_CONFIG_BASE64" ] || [ -z "$HCLOUD_TOKEN" ]; then log_error "Não foi possível obter as configurações necessárias!" exit 1 fi log_success "Configurações obtidas" echo " - Cluster: $CLUSTER_NAME" echo " - Image ID: $TALOS_IMAGE_ID" echo " - Network ID: $NETWORK_ID" echo " - SSH Key: $SSH_KEY_NAME" echo "" # Criar namespace com política privileged (necessário para hostNetwork) log_info "Criando namespace cluster-autoscaler..." kubectl create namespace cluster-autoscaler --dry-run=client -o yaml | kubectl apply -f - kubectl label namespace cluster-autoscaler pod-security.kubernetes.io/enforce=privileged --overwrite # Criar secret com credenciais log_info "Criando secret com credenciais..." kubectl create secret generic hcloud-autoscaler \ --namespace cluster-autoscaler \ --from-literal=token="$HCLOUD_TOKEN" \ --from-literal=cloud-init="$WORKER_CONFIG_BASE64" \ --dry-run=client -o yaml | kubectl apply -f - log_success "Secret criado" # Aplicar RBAC e Deployment log_info "Aplicando manifesto do cluster-autoscaler..." # Substituir variáveis no template e aplicar cat cluster-autoscaler.yaml | \ sed "s|\${TALOS_IMAGE_ID}|$TALOS_IMAGE_ID|g" | \ sed "s|\${NETWORK_NAME}|$CLUSTER_NAME-network|g" | \ sed "s|\${FIREWALL_NAME}|$CLUSTER_NAME-firewall|g" | \ sed "s|\${SSH_KEY_NAME}|$SSH_KEY_NAME|g" | \ kubectl apply -f - log_success "Cluster Autoscaler instalado!" # Aguardar pod ficar pronto log_info "Aguardando pod do autoscaler..." kubectl wait --for=condition=ready pod \ -l app=cluster-autoscaler \ -n cluster-autoscaler \ --timeout=120s echo "" log_success "Cluster Autoscaler pronto!" echo "" echo "============================================" echo " Configuração do Autoscaler" echo "============================================" echo "" echo " Pool: worker-pool" echo " Tipo: CAX11 (ARM64)" echo " Região: nbg1 (Nuremberg)" echo " Min nodes: 1" echo " Max nodes: 5" echo "" echo " Scale down após: 5 minutos" echo " Utilização mínima: 50%" echo "" echo "Comandos úteis:" echo "" echo " # Ver logs do autoscaler" echo " kubectl logs -n cluster-autoscaler -l app=cluster-autoscaler -f" echo "" echo " # Ver status dos nodes" echo " kubectl get nodes" echo "" echo " # Testar scale up (criar pods pending)" echo " kubectl create deployment test --image=nginx --replicas=10" echo ""