# Aula 12 - Observabilidade (Victoria Metrics + Grafana) Instale monitoramento no cluster e aprenda a **ver o que está acontecendo** — CPU, memória, disco, pods crashando, PVCs enchendo. ## Por que esta aula existe Nas aulas anteriores construímos um cluster completo: Kubernetes, Gitea, ArgoCD, auto-scaling. Mas se um pod estiver em CrashLoop, um PVC estiver 95% cheio, ou um node estiver com CPU saturada — **como você sabe?** Sem observabilidade, você descobre problemas quando o **usuário reclama**. Com observabilidade, você descobre **antes do usuário**. ## O que instalamos ``` helm install monitoring vm/victoria-metrics-k8s-stack ``` Um único comando. Sem GitOps intermediário, sem repositório extra, sem pipeline de CI. O foco desta aula é **usar** o monitoramento, não instalar infraestrutura. ### Componentes ``` ┌─────────────────────────────────────────────────────────────────┐ │ Victoria Metrics Stack │ ├─────────────────────────────────────────────────────────────────┤ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────┐ │ │ │ vmagent │ │ vmsingle │ │ Grafana │ │ │ │ (coleta) │─►│ (storage) │◄─│ (visualização) │ │ │ └─────────────┘ └─────────────┘ └─────────────────────────┘ │ │ │ │ │ │ │ ┌──────┴──────┐ ┌─────┴─────┐ ┌─────┴─────┐ │ │ │ node-export │ │ vmalert │ │ 20+ dash- │ │ │ │ kube-state │ │ (alertas) │ │ boards │ │ │ └─────────────┘ └───────────┘ └───────────┘ │ └─────────────────────────────────────────────────────────────────┘ ``` | Componente | O que faz | |------------|-----------| | **vmagent** | Scrapes métricas de todos os pods, nodes, services a cada 30s | | **vmsingle** | Armazena métricas (14 dias de retenção, 10Gi PVC) | | **vmalert** | Avalia regras de alerta (PVC cheio, pod crashando, CPU alta) | | **Grafana** | UI com 20+ dashboards pré-configurados | | **kube-state-metrics** | Expõe estado dos objetos K8s (pods, deployments, PVCs) | | **node-exporter** | Expõe métricas do SO (CPU, RAM, disco, rede) | ### Por que Victoria Metrics e não Prometheus? Compatível com PromQL, mas mais leve: | | Prometheus | Victoria Metrics | |---|---|---| | RAM | Alto | ~7x menor | | Compressão em disco | Básica | ~10x melhor | | Velocidade de query | Normal | ~2-3x mais rápido | | HA | Complexo (Thanos) | Simples | Para um cluster pequeno na Hetzner, Victoria Metrics é a escolha pragmática. ## Instalação ```bash cd aula-12 export KUBECONFIG=$(pwd)/../aula-08/kubeconfig ./setup.sh ``` O script pergunta: 1. Domínio base (herda da aula-10) 2. Hostname do Grafana (ex: `grafana.kube.quest`) 3. TLS (Let's Encrypt / CloudFlare / HTTP) Depois faz `helm install` direto — sem GitOps, sem repos intermediários. ## Acesso ao Grafana ### Via Ingress ``` URL: https://grafana.kube.quest Username: admin Password: (exibida no setup.sh) ``` ### Via Port-Forward ```bash kubectl port-forward -n monitoring svc/monitoring-grafana 3000:80 open http://localhost:3000 ``` ### Obter senha ```bash kubectl get secret -n monitoring -l app.kubernetes.io/name=grafana \ -o jsonpath='{.items[0].data.admin-password}' | base64 -d; echo ``` ## O que monitorar (casos reais) ### 1. PVC enchendo O problema mais comum em clusters pequenos. Um volume Hetzner de 10Gi enche silenciosamente. ```promql # PVCs acima de 80% (kubelet_volume_stats_used_bytes / kubelet_volume_stats_capacity_bytes) > 0.8 ``` Dashboard: **Kubernetes / Views / Persistent Volumes** ### 2. Pod em CrashLoop Quando um pod reinicia repetidamente sem ficar Ready. ```promql # Pods que restartaram mais de 5x na última hora sum(increase(kube_pod_container_status_restarts_total[1h])) by (pod, namespace) > 5 ``` Dashboard: **Kubernetes / Views / Pods** ### 3. Node com CPU saturada ```promql # CPU por node (%) 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) ``` Dashboard: **Node Exporter / Nodes** ### 4. Memória por namespace Quem está consumindo mais memória no cluster? ```promql sum(container_memory_working_set_bytes{container!=""}) by (namespace) ``` Dashboard: **Kubernetes / Views / Namespaces** ### 5. Network throughput ```promql # Bytes recebidos por pod (rate 5min) sum(rate(container_network_receive_bytes_total[5m])) by (pod) ``` ## Dashboards incluídos O chart já vem com **20+ dashboards** configurados: | Dashboard | Uso | |-----------|-----| | **Kubernetes / Views / Global** | Visão geral do cluster | | **Kubernetes / Views / Namespaces** | Recursos por namespace | | **Kubernetes / Views / Nodes** | CPU, memória, disco por node | | **Kubernetes / Views / Pods** | Métricas detalhadas de pods | | **Node Exporter / Nodes** | Métricas do SO | | **Node Exporter / USE Method** | Utilização, Saturação, Erros | | **VictoriaMetrics / vmagent** | Status da coleta | | **VictoriaMetrics / vmsingle** | Status do storage | ## Alertas configurados | Alerta | Condição | Severidade | |--------|----------|------------| | PVCAlmostFull | PVC > 80% | warning | | PVCFull | PVC > 95% | critical | | PodCrashLooping | Restarts > 5/hora | warning | | PodNotReady | Pod não Ready > 5min | warning | | NodeHighCPU | CPU > 90% por 5min | warning | | NodeLowMemory | RAM livre < 10% | warning | | NodeDiskFull | Disco > 85% | critical | ```bash # Ver alertas kubectl port-forward -n monitoring svc/vmalert 8880:8880 open http://localhost:8880/alerts ``` ## Integração com KEDA (Aula-05) Victoria Metrics pode alimentar KEDA para auto-scaling baseado em métricas: ```yaml triggers: - type: prometheus metadata: serverAddress: http://vmsingle-monitoring-victoria-metrics-k8s-stack.monitoring:8429 query: sum(kube_deployment_status_replicas_unavailable{deployment="myapp"}) threshold: '1' ``` ## Auto-Resize de PVC (Opcional) Expansão automática de volumes quando atingirem 80%. ```bash helm repo add pvc-autoresizer https://topolvm.github.io/pvc-autoresizer/ helm install pvc-autoresizer pvc-autoresizer/pvc-autoresizer \ --namespace pvc-autoresizer \ --create-namespace \ --set controller.args.prometheusURL=http://vmsingle-monitoring-victoria-metrics-k8s-stack.monitoring:8429 \ --set controller.args.noAnnotationCheck=true # Habilitar no StorageClass kubectl annotate storageclass hcloud-volumes resize.topolvm.io/enabled="true" ``` Com isso, **todos os PVCs** no cluster são monitorados e expandidos automaticamente. ## Troubleshooting ### Grafana não carrega dashboards ```bash kubectl logs -n monitoring -l app.kubernetes.io/name=grafana -c sc-dashboard ``` ### Métricas não aparecem ```bash kubectl port-forward -n monitoring svc/vmagent 8429:8429 open http://localhost:8429/targets ``` ## Cleanup ```bash ./cleanup.sh ``` Remove o Helm release e o namespace `monitoring`. Dados de métricas serão perdidos. ## Referências - [Victoria Metrics Docs](https://docs.victoriametrics.com/) - [victoria-metrics-k8s-stack Chart](https://github.com/VictoriaMetrics/helm-charts/tree/master/charts/victoria-metrics-k8s-stack) - [PromQL Cheat Sheet](https://promlabs.com/promql-cheat-sheet/) - [pvc-autoresizer](https://github.com/topolvm/pvc-autoresizer)