Elimina sed no values.yaml e passa hostname via --set no Helm, consistente com o padrão das outras aulas.
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:
- Domínio base (herda da aula-10)
- Hostname do Grafana (ex:
grafana.kube.quest) - 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.