Files

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

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

kubectl port-forward -n monitoring svc/monitoring-grafana 3000:80
open http://localhost:3000

Obter senha

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.

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

# 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

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

sum(container_memory_working_set_bytes{container!=""}) by (namespace)

Dashboard: Kubernetes / Views / Namespaces

5. Network throughput

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

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%.

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

kubectl logs -n monitoring -l app.kubernetes.io/name=grafana -c sc-dashboard

Métricas não aparecem

kubectl port-forward -n monitoring svc/vmagent 8429:8429
open http://localhost:8429/targets

Cleanup

./cleanup.sh

Remove o Helm release e o namespace monitoring. Dados de métricas serão perdidos.

Referências