Remove indireção GitOps (factory/monitoring repo) que adicionava complexidade sem valor pedagógico. O foco da aula é observabilidade, não pipeline de deploy. Antes: setup.sh → cria repo → push manifests → ArgoCD app → sync → instala Agora: setup.sh → helm install → pronto README reescrito com foco em "o que monitorar" (PVC cheio, CrashLoop, CPU saturada) em vez de "como instalar via GitOps".
231 lines
7.6 KiB
Bash
Executable File
231 lines
7.6 KiB
Bash
Executable File
#!/bin/bash
|
|
# =============================================================================
|
|
# Aula 12 - Victoria Metrics (Observabilidade)
|
|
# =============================================================================
|
|
#
|
|
# Este script instala o stack de monitoramento via Helm:
|
|
# 1. Victoria Metrics (coleta + storage de métricas)
|
|
# 2. Grafana (dashboards)
|
|
# 3. Alertas pré-configurados
|
|
#
|
|
# Pré-requisitos:
|
|
# - Cluster Kubernetes (aula-08)
|
|
# - kubectl e helm instalados
|
|
#
|
|
# =============================================================================
|
|
|
|
set -e
|
|
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
CYAN='\033[0;36m'
|
|
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}[ERROR]${NC} $1"; }
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
ENV_FILE="${SCRIPT_DIR}/.env"
|
|
|
|
# =============================================================================
|
|
# VERIFICAR PRÉ-REQUISITOS
|
|
# =============================================================================
|
|
|
|
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
|
|
|
|
if ! kubectl cluster-info &> /dev/null; then
|
|
log_error "Não foi possível conectar ao cluster"
|
|
exit 1
|
|
fi
|
|
|
|
log_success "Pré-requisitos verificados"
|
|
|
|
# =============================================================================
|
|
# CARREGAR CONFIGURAÇÃO
|
|
# =============================================================================
|
|
|
|
if [[ -f "$ENV_FILE" ]]; then
|
|
source "$ENV_FILE"
|
|
fi
|
|
|
|
# Herdar domínio da aula-10 ou aula-11
|
|
for ENV_SRC in "${SCRIPT_DIR}/../aula-11/.env" "${SCRIPT_DIR}/../aula-10/.env"; do
|
|
if [[ -f "$ENV_SRC" && -z "$DOMAIN" ]]; then
|
|
source "$ENV_SRC"
|
|
fi
|
|
done
|
|
|
|
# =============================================================================
|
|
# COLETAR CONFIGURAÇÃO
|
|
# =============================================================================
|
|
|
|
echo ""
|
|
echo -e "${CYAN}═══════════════════════════════════════════════════${NC}"
|
|
echo -e "${CYAN} Victoria Metrics - Observabilidade${NC}"
|
|
echo -e "${CYAN}═══════════════════════════════════════════════════${NC}"
|
|
echo ""
|
|
|
|
if [[ -z "$DOMAIN" ]]; then
|
|
read -p "Domínio base (ex: kube.quest): " DOMAIN
|
|
fi
|
|
|
|
if [[ -z "$GRAFANA_HOST" ]]; then
|
|
DEFAULT_GRAFANA="grafana.${DOMAIN}"
|
|
read -p "Hostname do Grafana [${DEFAULT_GRAFANA}]: " GRAFANA_HOST
|
|
GRAFANA_HOST="${GRAFANA_HOST:-$DEFAULT_GRAFANA}"
|
|
fi
|
|
log_info "Grafana: https://${GRAFANA_HOST}"
|
|
|
|
# TLS
|
|
if [[ -z "$USE_CLOUDFLARE" && -z "$USE_LETSENCRYPT" ]]; then
|
|
echo ""
|
|
echo "Configuração de TLS:"
|
|
echo " 1) Let's Encrypt (recomendado)"
|
|
echo " 2) CloudFlare (proxy)"
|
|
echo " 3) HTTP apenas"
|
|
read -p "Escolha [1-3]: " TLS_CHOICE
|
|
case $TLS_CHOICE in
|
|
1) USE_CLOUDFLARE=false; USE_LETSENCRYPT=true ;;
|
|
2) USE_CLOUDFLARE=true; USE_LETSENCRYPT=false ;;
|
|
*) USE_CLOUDFLARE=false; USE_LETSENCRYPT=false ;;
|
|
esac
|
|
fi
|
|
|
|
# Salvar
|
|
cat > "$ENV_FILE" << EOF
|
|
# Configuração gerada pelo setup.sh - $(date)
|
|
DOMAIN=${DOMAIN}
|
|
GRAFANA_HOST=${GRAFANA_HOST}
|
|
USE_CLOUDFLARE=${USE_CLOUDFLARE}
|
|
USE_LETSENCRYPT=${USE_LETSENCRYPT}
|
|
EOF
|
|
|
|
log_success "Configuração salva"
|
|
|
|
# =============================================================================
|
|
# PREPARAR VALUES COM HOSTNAME DO GRAFANA
|
|
# =============================================================================
|
|
|
|
log_info "Preparando configuração..."
|
|
|
|
VALUES_FILE="${SCRIPT_DIR}/gitops/apps/victoria-metrics/values.yaml"
|
|
TEMP_VALUES=$(mktemp)
|
|
sed "s/grafana\.kube\.quest/${GRAFANA_HOST}/g" "$VALUES_FILE" > "$TEMP_VALUES"
|
|
|
|
# Ajustar TLS no values
|
|
if [[ "$USE_LETSENCRYPT" != "true" ]]; then
|
|
# Remover anotação cert-manager se não usa Let's Encrypt
|
|
sed -i.bak '/cert-manager.io\/cluster-issuer/d' "$TEMP_VALUES"
|
|
rm -f "$TEMP_VALUES.bak"
|
|
fi
|
|
|
|
if [[ "$USE_CLOUDFLARE" == "true" || "$USE_LETSENCRYPT" != "true" ]]; then
|
|
# Remover bloco TLS se não usa Let's Encrypt
|
|
sed -i.bak '/tls:/,/- grafana/d' "$TEMP_VALUES"
|
|
rm -f "$TEMP_VALUES.bak"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# INSTALAR VIA HELM
|
|
# =============================================================================
|
|
|
|
echo ""
|
|
log_info "=== Instalando Victoria Metrics Stack ==="
|
|
|
|
helm repo add vm https://victoriametrics.github.io/helm-charts/ 2>/dev/null || true
|
|
helm repo update vm
|
|
|
|
kubectl create namespace monitoring 2>/dev/null || true
|
|
|
|
if helm status monitoring -n monitoring &> /dev/null; then
|
|
log_warn "Já instalado. Atualizando..."
|
|
HELM_CMD="upgrade"
|
|
else
|
|
HELM_CMD="install"
|
|
fi
|
|
|
|
helm ${HELM_CMD} monitoring vm/victoria-metrics-k8s-stack \
|
|
--namespace monitoring \
|
|
-f "$TEMP_VALUES" \
|
|
--wait \
|
|
--timeout 10m
|
|
|
|
rm -f "$TEMP_VALUES"
|
|
|
|
log_success "Victoria Metrics Stack instalado!"
|
|
|
|
# =============================================================================
|
|
# APLICAR ALERTAS CUSTOMIZADOS
|
|
# =============================================================================
|
|
|
|
if [[ -f "${SCRIPT_DIR}/gitops/apps/victoria-metrics/templates/alerts.yaml" ]]; then
|
|
echo ""
|
|
log_info "Aplicando alertas customizados..."
|
|
kubectl apply -f "${SCRIPT_DIR}/gitops/apps/victoria-metrics/templates/alerts.yaml" -n monitoring 2>/dev/null || true
|
|
log_success "Alertas aplicados"
|
|
fi
|
|
|
|
# =============================================================================
|
|
# OBTER SENHA DO GRAFANA
|
|
# =============================================================================
|
|
|
|
echo ""
|
|
log_info "Obtendo credenciais do Grafana..."
|
|
|
|
GRAFANA_PASSWORD=""
|
|
for i in {1..30}; do
|
|
GRAFANA_PASSWORD=$(kubectl get secret -n monitoring -l app.kubernetes.io/name=grafana \
|
|
-o jsonpath='{.items[0].data.admin-password}' 2>/dev/null | base64 -d 2>/dev/null)
|
|
if [[ -n "$GRAFANA_PASSWORD" ]]; then break; fi
|
|
sleep 2
|
|
done
|
|
|
|
# =============================================================================
|
|
# RESUMO FINAL
|
|
# =============================================================================
|
|
|
|
PROTOCOL="https"
|
|
if [[ "$USE_CLOUDFLARE" == "false" && "$USE_LETSENCRYPT" == "false" ]]; then
|
|
PROTOCOL="http"
|
|
fi
|
|
|
|
echo ""
|
|
echo -e "${CYAN}═══════════════════════════════════════════════════${NC}"
|
|
echo -e "${GREEN} Victoria Metrics Instalado!${NC}"
|
|
echo -e "${CYAN}═══════════════════════════════════════════════════${NC}"
|
|
echo ""
|
|
echo "Grafana:"
|
|
echo " URL: ${PROTOCOL}://${GRAFANA_HOST}"
|
|
echo " Username: admin"
|
|
echo " Password: ${GRAFANA_PASSWORD:-'(kubectl get secret -n monitoring -l app.kubernetes.io/name=grafana -o jsonpath=\"{.items[0].data.admin-password}\" | base64 -d)'}"
|
|
echo ""
|
|
echo "Acesso alternativo (port-forward):"
|
|
echo " kubectl port-forward -n monitoring svc/monitoring-grafana 3000:80"
|
|
echo " open http://localhost:3000"
|
|
echo ""
|
|
echo "Verificar:"
|
|
echo " kubectl get pods -n monitoring"
|
|
echo ""
|
|
echo "Desinstalar:"
|
|
echo " ./cleanup.sh"
|
|
echo ""
|
|
echo -e "${CYAN}═══════════════════════════════════════════════════${NC}"
|
|
echo ""
|
|
|
|
log_info "Status dos pods:"
|
|
kubectl get pods -n monitoring
|