Aula 08 - Cluster Kubernetes HA: - Setup interativo com OpenTofu para Talos na Hetzner - CCM, CSI Driver, Cluster Autoscaler, Metrics Server - NGINX Ingress com LoadBalancer (HTTP/HTTPS/SSH) Aula 09 - n8n na Hetzner: - Deploy via Helm com PostgreSQL e Redis - Suporte multi-tenant com add-client.sh - Integração com Hetzner CSI para volumes persistentes Aula 10 - GitLab na Hetzner: - Setup agnóstico: CloudFlare (trusted proxies) ou Let's Encrypt - Anti-affinity para distribuir webservice/sidekiq em nós diferentes - Container Registry e SSH via TCP passthrough - Documentação do erro 422 e solução com trustedCIDRsForXForwardedFor Melhorias gerais: - READMEs atualizados com arquitetura e troubleshooting - Scripts cleanup.sh para todas as aulas - CLAUDE.md atualizado com contexto do projeto
206 lines
7.1 KiB
Bash
Executable File
206 lines
7.1 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
############################################################
|
|
# Aula 08 - Cleanup
|
|
# Destrói a infraestrutura provisionada
|
|
############################################################
|
|
|
|
set -e
|
|
|
|
# Cores para output
|
|
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}[ERRO]${NC} $1"; }
|
|
|
|
echo ""
|
|
echo "============================================"
|
|
echo " Cleanup - Destruir Infraestrutura"
|
|
echo "============================================"
|
|
echo ""
|
|
|
|
# Verificar se tofu está instalado
|
|
if ! command -v tofu &> /dev/null; then
|
|
log_error "OpenTofu não encontrado!"
|
|
exit 1
|
|
fi
|
|
|
|
# Verificar se há state
|
|
if [ ! -f "terraform.tfstate" ] && [ ! -d ".terraform" ]; then
|
|
log_warn "Nenhuma infraestrutura encontrada para destruir."
|
|
exit 0
|
|
fi
|
|
|
|
# Verificar workers do autoscaler (criados fora do OpenTofu)
|
|
if [ -f "kubeconfig" ]; then
|
|
export KUBECONFIG="$SCRIPT_DIR/kubeconfig"
|
|
|
|
AUTOSCALER_WORKERS=$(kubectl get nodes -l node.kubernetes.io/instance-type=cax11 \
|
|
--no-headers 2>/dev/null | wc -l | tr -d ' ' || echo "0")
|
|
|
|
if [ "$AUTOSCALER_WORKERS" -gt "1" ]; then
|
|
log_warn "Detectados $AUTOSCALER_WORKERS workers (incluindo os do autoscaler)"
|
|
log_warn "Workers criados pelo autoscaler serão removidos via API Hetzner"
|
|
echo ""
|
|
fi
|
|
fi
|
|
|
|
log_warn "ATENÇÃO: Esta operação irá DESTRUIR todos os recursos!"
|
|
echo ""
|
|
echo "Recursos que serão removidos:"
|
|
echo " - NGINX Ingress Controller"
|
|
echo " - Hetzner CSI Driver"
|
|
echo " - LoadBalancer (Hetzner LB)"
|
|
echo " - 3x Control Plane nodes"
|
|
echo " - Workers (incluindo os criados pelo autoscaler)"
|
|
echo " - Rede privada"
|
|
echo " - Floating IP"
|
|
echo " - Firewall"
|
|
echo " - Placement Group"
|
|
echo ""
|
|
|
|
read -p "Tem certeza que deseja continuar? (digite 'sim' para confirmar): " confirm
|
|
|
|
if [ "$confirm" != "sim" ]; then
|
|
log_info "Operação cancelada"
|
|
exit 0
|
|
fi
|
|
|
|
echo ""
|
|
|
|
# Remover workers do autoscaler primeiro (se existirem)
|
|
if [ -f "terraform.tfvars" ]; then
|
|
HCLOUD_TOKEN=$(grep 'hcloud_token' terraform.tfvars | cut -d'"' -f2)
|
|
CLUSTER_NAME=$(tofu output -raw cluster_name 2>/dev/null || echo "")
|
|
|
|
if [ -n "$HCLOUD_TOKEN" ] && [ -n "$CLUSTER_NAME" ]; then
|
|
log_info "Verificando workers do autoscaler..."
|
|
|
|
# Listar servers com label do cluster que NÃO são gerenciados pelo tofu
|
|
AUTOSCALER_SERVERS=$(HCLOUD_TOKEN="$HCLOUD_TOKEN" hcloud server list \
|
|
-l cluster="$CLUSTER_NAME" \
|
|
-o noheader -o columns=id,name 2>/dev/null | \
|
|
grep -E "worker-pool" || true)
|
|
|
|
if [ -n "$AUTOSCALER_SERVERS" ]; then
|
|
log_warn "Removendo workers criados pelo autoscaler..."
|
|
echo "$AUTOSCALER_SERVERS" | while read -r server_id server_name; do
|
|
log_info " Removendo $server_name (ID: $server_id)..."
|
|
HCLOUD_TOKEN="$HCLOUD_TOKEN" hcloud server delete "$server_id" --quiet 2>/dev/null || true
|
|
done
|
|
log_success "Workers do autoscaler removidos"
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# ==========================================================================
|
|
# Remover LoadBalancer criado pelo CCM (não gerenciado pelo OpenTofu)
|
|
# ==========================================================================
|
|
# O LoadBalancer é criado pelo Hetzner CCM quando o NGINX Ingress é instalado.
|
|
# Ele está conectado à subnet e impede a destruição da rede se não for removido.
|
|
|
|
log_info "Verificando LoadBalancer do Hetzner CCM..."
|
|
|
|
# Tentar via kubectl primeiro (se cluster ainda acessível)
|
|
if [ -f "kubeconfig" ]; then
|
|
export KUBECONFIG="$SCRIPT_DIR/kubeconfig"
|
|
if kubectl cluster-info &>/dev/null; then
|
|
if kubectl get svc -n ingress-nginx nginx-ingress-ingress-nginx-controller &>/dev/null; then
|
|
log_info "Removendo Service LoadBalancer via kubectl..."
|
|
kubectl delete svc nginx-ingress-ingress-nginx-controller -n ingress-nginx --timeout=60s 2>/dev/null || true
|
|
sleep 10 # Aguardar CCM processar a remoção
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# Fallback: deletar diretamente via hcloud CLI
|
|
if [ -f "terraform.tfvars" ]; then
|
|
HCLOUD_TOKEN=$(grep 'hcloud_token' terraform.tfvars | cut -d'"' -f2)
|
|
if [ -n "$HCLOUD_TOKEN" ]; then
|
|
LB_NAME="k8s-ingress" # Nome definido no nginx-ingress-values.yaml
|
|
if HCLOUD_TOKEN="$HCLOUD_TOKEN" hcloud load-balancer describe "$LB_NAME" &>/dev/null; then
|
|
log_info "Removendo LoadBalancer '$LB_NAME' via hcloud CLI..."
|
|
HCLOUD_TOKEN="$HCLOUD_TOKEN" hcloud load-balancer delete "$LB_NAME" --quiet 2>/dev/null || true
|
|
log_success "LoadBalancer removido"
|
|
sleep 5 # Aguardar Hetzner processar
|
|
else
|
|
log_info "LoadBalancer '$LB_NAME' não encontrado (OK)"
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# ==========================================================================
|
|
# Remover NGINX Ingress Controller
|
|
# ==========================================================================
|
|
# Instalado pelo setup.sh para expor serviços HTTP/HTTPS/SSH
|
|
|
|
if [ -f "kubeconfig" ]; then
|
|
export KUBECONFIG="$SCRIPT_DIR/kubeconfig"
|
|
if kubectl cluster-info &>/dev/null; then
|
|
if helm status ingress-nginx -n ingress-nginx &>/dev/null; then
|
|
log_info "Removendo NGINX Ingress Controller..."
|
|
helm uninstall ingress-nginx -n ingress-nginx --wait 2>/dev/null || true
|
|
kubectl delete namespace ingress-nginx --wait=false 2>/dev/null || true
|
|
log_success "NGINX Ingress removido"
|
|
sleep 5 # Aguardar processamento
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# ==========================================================================
|
|
# Remover Hetzner CSI Driver
|
|
# ==========================================================================
|
|
# Instalado pelo setup.sh para provisionar volumes persistentes
|
|
|
|
if [ -f "kubeconfig" ]; then
|
|
export KUBECONFIG="$SCRIPT_DIR/kubeconfig"
|
|
if kubectl cluster-info &>/dev/null; then
|
|
if helm status hcloud-csi -n kube-system &>/dev/null; then
|
|
log_info "Removendo Hetzner CSI Driver..."
|
|
helm uninstall hcloud-csi -n kube-system --wait 2>/dev/null || true
|
|
log_success "Hetzner CSI Driver removido"
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
echo ""
|
|
log_info "Destruindo infraestrutura via OpenTofu..."
|
|
echo ""
|
|
|
|
tofu destroy -auto-approve
|
|
|
|
echo ""
|
|
log_success "Infraestrutura destruída!"
|
|
echo ""
|
|
|
|
# Limpar arquivos locais (manter .terraform para re-deploy rápido)
|
|
log_info "Limpando arquivos gerados..."
|
|
|
|
rm -f kubeconfig talosconfig tfplan terraform.tfstate terraform.tfstate.backup
|
|
|
|
log_success "Arquivos removidos"
|
|
echo ""
|
|
|
|
# Perguntar sobre terraform.tfvars
|
|
if [ -f "terraform.tfvars" ]; then
|
|
read -p "Remover terraform.tfvars também? (s/N): " remove_tfvars
|
|
if [[ "$remove_tfvars" =~ ^[Ss]$ ]]; then
|
|
rm -f terraform.tfvars
|
|
log_success "terraform.tfvars removido"
|
|
else
|
|
log_info "terraform.tfvars mantido (útil para re-deploy)"
|
|
fi
|
|
fi
|
|
|
|
echo ""
|
|
log_success "Cleanup concluído!"
|