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".
241 lines
8.1 KiB
Markdown
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)
|