Workshop completo: aulas 08-10 com Talos, n8n e GitLab na Hetzner
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
This commit is contained in:
139
aula-08/install-nginx-ingress.sh
Executable file
139
aula-08/install-nginx-ingress.sh
Executable file
@@ -0,0 +1,139 @@
|
||||
#!/bin/bash
|
||||
# =============================================================================
|
||||
# Instala/Atualiza o NGINX Ingress Controller com LoadBalancer Hetzner
|
||||
# =============================================================================
|
||||
#
|
||||
# Este script configura o NGINX Ingress para:
|
||||
# - Usar LoadBalancer da Hetzner (requer CCM instalado)
|
||||
# - Suportar TCP passthrough para SSH do GitLab
|
||||
# - Comunicação via rede privada
|
||||
#
|
||||
# Pré-requisitos:
|
||||
# - Cluster Kubernetes rodando
|
||||
# - Hetzner CCM instalado (./install-ccm.sh)
|
||||
# - Helm 3.x instalado
|
||||
#
|
||||
# Uso:
|
||||
# ./install-nginx-ingress.sh
|
||||
#
|
||||
# =============================================================================
|
||||
|
||||
set -e
|
||||
|
||||
# Cores para output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m'
|
||||
|
||||
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"; }
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
|
||||
# =============================================================================
|
||||
# VERIFICAÇÕES
|
||||
# =============================================================================
|
||||
|
||||
log_info "Verificando pré-requisitos..."
|
||||
|
||||
if ! command -v kubectl &> /dev/null; then
|
||||
log_error "kubectl não encontrado"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! command -v helm &> /dev/null; then
|
||||
log_error "Helm não encontrado"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Verificar se CCM está instalado
|
||||
if ! kubectl get deployment hccm-hcloud-cloud-controller-manager -n kube-system &> /dev/null; then
|
||||
log_warn "Hetzner CCM não parece estar instalado"
|
||||
log_warn "Execute ./install-ccm.sh primeiro para LoadBalancer automático"
|
||||
read -p "Continuar mesmo assim? (y/N) " -n 1 -r
|
||||
echo
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
log_success "Pré-requisitos OK"
|
||||
|
||||
# =============================================================================
|
||||
# INSTALAR NGINX INGRESS
|
||||
# =============================================================================
|
||||
|
||||
log_info "Adicionando repositório Helm..."
|
||||
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx 2>/dev/null || true
|
||||
helm repo update
|
||||
|
||||
log_info "Instalando/Atualizando NGINX Ingress Controller..."
|
||||
|
||||
helm upgrade --install nginx-ingress ingress-nginx/ingress-nginx \
|
||||
-n ingress-nginx \
|
||||
--create-namespace \
|
||||
-f "$SCRIPT_DIR/nginx-ingress-values.yaml" \
|
||||
--wait \
|
||||
--timeout 5m
|
||||
|
||||
log_success "NGINX Ingress instalado!"
|
||||
|
||||
# =============================================================================
|
||||
# AGUARDAR LOADBALANCER
|
||||
# =============================================================================
|
||||
|
||||
log_info "Aguardando LoadBalancer receber IP externo..."
|
||||
echo "(pode levar 1-2 minutos)"
|
||||
|
||||
for i in {1..60}; do
|
||||
EXTERNAL_IP=$(kubectl get svc nginx-ingress-ingress-nginx-controller \
|
||||
-n ingress-nginx \
|
||||
-o jsonpath='{.status.loadBalancer.ingress[0].ip}' 2>/dev/null || echo "")
|
||||
|
||||
if [ -n "$EXTERNAL_IP" ] && [ "$EXTERNAL_IP" != "<pending>" ]; then
|
||||
break
|
||||
fi
|
||||
|
||||
echo -n "."
|
||||
sleep 2
|
||||
done
|
||||
|
||||
echo ""
|
||||
|
||||
if [ -n "$EXTERNAL_IP" ] && [ "$EXTERNAL_IP" != "<pending>" ]; then
|
||||
log_success "LoadBalancer IP: $EXTERNAL_IP"
|
||||
else
|
||||
log_warn "LoadBalancer ainda não tem IP. Verifique com:"
|
||||
echo " kubectl get svc -n ingress-nginx"
|
||||
fi
|
||||
|
||||
# =============================================================================
|
||||
# RESUMO
|
||||
# =============================================================================
|
||||
|
||||
echo ""
|
||||
echo "=============================================="
|
||||
echo -e "${GREEN} NGINX Ingress Configurado!${NC}"
|
||||
echo "=============================================="
|
||||
echo ""
|
||||
echo "LoadBalancer IP: ${EXTERNAL_IP:-<pendente>}"
|
||||
echo ""
|
||||
echo "Portas expostas:"
|
||||
echo " - 80 (HTTP)"
|
||||
echo " - 443 (HTTPS)"
|
||||
echo " - 22 (SSH - para GitLab)"
|
||||
echo ""
|
||||
echo "Próximos passos:"
|
||||
echo " 1. Configure DNS apontando para o IP acima:"
|
||||
echo " - n8n.kube.quest → $EXTERNAL_IP"
|
||||
echo " - git.kube.quest → $EXTERNAL_IP"
|
||||
echo " - registry.git.kube.quest → $EXTERNAL_IP"
|
||||
echo ""
|
||||
echo " 2. Instale o GitLab:"
|
||||
echo " cd ../aula-09 && ./setup.sh"
|
||||
echo ""
|
||||
echo "=============================================="
|
||||
Reference in New Issue
Block a user