aula-07 e aula-08: Cluster Talos HA na Hetzner com Autoscaler
aula-07: Criação de imagem Talos customizada na Hetzner Cloud - Usa Talos Factory para gerar imagem ARM64/AMD64 - Inclui extensões: qemu-guest-agent, hcloud aula-08: Provisionamento de cluster Kubernetes Talos via OpenTofu - 3 Control Planes em HA (CAX11 ARM64) - 1 Worker Node (CAX11 ARM64) - Rede privada, Floating IP, Firewall - Cluster Autoscaler para Hetzner (0-5 workers extras) - Setup interativo com validação de pré-requisitos - Custo estimado: ~€18/mês (base) Também inclui: - .gitignore para ignorar arquivos sensíveis - CLAUDE.md com instruções do projeto
This commit is contained in:
139
aula-08/install-autoscaler.sh
Executable file
139
aula-08/install-autoscaler.sh
Executable file
@@ -0,0 +1,139 @@
|
||||
#!/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 ""
|
||||
Reference in New Issue
Block a user