Files
workshop/aula-12/README.md
ArgoCD Setup 61866c1920 refactor(aula-12): simplificar para helm install direto
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".
2026-03-14 02:11:10 -03:00

241 lines
8.1 KiB
Markdown

# 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)