Runbook: Utilizzo Disco Elevato
Severita: Warning
Alert Prometheus: DiskUsageHigh
Descrizione
Questo alert si attiva quando un PersistentVolumeClaim (PVC) nel namespace pos-enterprise supera l'80% di utilizzo. I PVC della piattaforma sono utilizzati principalmente per lo storage di Prometheus (metriche), Loki (log), Tempo (tracce) e eventuali dati applicativi.
Regola Prometheus:
(kubelet_volume_stats_used_bytes{namespace="pos-enterprise"}
/ kubelet_volume_stats_capacity_bytes{namespace="pos-enterprise"})
> 0.8
Impatto
- Prometheus: se il disco si riempie, Prometheus smette di raccogliere metriche. Si perde visibilita sul sistema.
- Loki: i nuovi log non vengono indicizzati. La ricerca dei log recenti non funziona.
- Tempo: le tracce distribuite non vengono salvate. Non e possibile debuggare problemi di latenza.
- Pod failure: se un pod scrive su un PVC pieno, le operazioni di I/O falliscono con errore
ENOSPC. - Corruzione dati: TSDB di Prometheus o indici di Loki possono corrompersi se il disco si riempie durante una scrittura.
Diagnosi
1. Identificare i PVC con spazio insufficiente
# Lista PVC con utilizzo
kubectl get pvc -n pos-enterprise
# Dettaglio utilizzo per ogni PVC
kubectl get pv -o json | jq -r '
.items[] |
select(.spec.claimRef.namespace == "pos-enterprise") |
"\(.spec.claimRef.name) - Capacity: \(.spec.capacity.storage)"
'
2. Verificare l'utilizzo reale
# Dalla metrica Prometheus (se ancora attivo)
kubectl port-forward svc/prometheus -n pos-enterprise 9090:9090
# Utilizzo per PVC (Grafana o Prometheus UI)
kubelet_volume_stats_used_bytes{namespace="pos-enterprise"}
/ kubelet_volume_stats_capacity_bytes{namespace="pos-enterprise"}
# Trend di crescita (GB/giorno)
deriv(kubelet_volume_stats_used_bytes{namespace="pos-enterprise"}[24h]) / 1024 / 1024 / 1024 * 86400
# Spazio rimanente in GB
(kubelet_volume_stats_capacity_bytes{namespace="pos-enterprise"}
- kubelet_volume_stats_used_bytes{namespace="pos-enterprise"})
/ 1024 / 1024 / 1024
3. Ispezionare il contenuto del disco
# Entrare nel pod che usa il PVC
kubectl exec -it <POD_NAME> -n pos-enterprise -- sh
# Verificare l'utilizzo
df -h
du -sh /* 2>/dev/null | sort -rh | head -20
# Per Prometheus
du -sh /prometheus/wal/
du -sh /prometheus/chunks_head/
ls -la /prometheus/ | head -20
# Per Loki
du -sh /loki/chunks/
du -sh /loki/index/
du -sh /loki/compactor/
# Per Tempo
du -sh /tempo/traces/
du -sh /tempo/wal/
4. Verificare la retention policy
# Prometheus retention
kubectl get deployment prometheus -n pos-enterprise -o jsonpath='{.spec.template.spec.containers[0].args}' | tr ',' '\n' | grep retention
# Loki retention
kubectl get configmap loki-config -n pos-enterprise -o yaml | grep -A 5 "retention"
# Tempo retention
kubectl get configmap tempo-config -n pos-enterprise -o yaml | grep -A 5 "retention"
5. Verificare se ci sono file temporanei o di compaction accumulati
# Prometheus WAL troppo grande (indicatore di problema di compaction)
kubectl exec deployment/prometheus -n pos-enterprise -- \
du -sh /prometheus/wal/
# File di checkpoint Prometheus
kubectl exec deployment/prometheus -n pos-enterprise -- \
ls -lah /prometheus/wal/checkpoint.* 2>/dev/null
Risoluzione
Azione immediata: pulizia dati obsoleti
Prometheus
# Forzare la compaction TSDB
kubectl exec deployment/prometheus -n pos-enterprise -- \
wget -qO- --post-data='' http://localhost:9090/-/compact
# Forzare la cancellazione dei blocchi scaduti
kubectl exec deployment/prometheus -n pos-enterprise -- \
wget -qO- --post-data='' http://localhost:9090/api/v1/admin/tsdb/clean_tombstones
# Eliminare serie metriche specifiche non piu necessarie
curl -X POST 'http://localhost:9090/api/v1/admin/tsdb/delete_series' \
-d 'match[]={__name__=~"old_metric_.*"}'
Loki
# Forzare la compaction
kubectl exec deployment/loki -n pos-enterprise -- \
wget -qO- http://localhost:3100/compactor/ring
# Eliminare chunk vecchi (se la retention non li ha rimossi)
kubectl exec deployment/loki -n pos-enterprise -- \
find /loki/chunks -name "*.gz" -mtime +15 -delete
Tempo
# Forzare il flush del WAL
kubectl exec deployment/tempo -n pos-enterprise -- \
wget -qO- --post-data='' http://localhost:3200/flush
# Eliminare tracce vecchie
kubectl exec deployment/tempo -n pos-enterprise -- \
find /tempo/traces -mtime +7 -delete
Ridurre la retention policy
Prometheus (da 30 giorni a 15 giorni)
kubectl patch deployment prometheus -n pos-enterprise --type='json' -p='[
{"op": "replace",
"path": "/spec/template/spec/containers/0/args",
"value": [
"--config.file=/etc/prometheus/prometheus.yml",
"--storage.tsdb.path=/prometheus",
"--storage.tsdb.retention.time=15d",
"--storage.tsdb.retention.size=8GB",
"--web.enable-admin-api",
"--web.enable-lifecycle"
]}
]'
Loki
kubectl edit configmap loki-config -n pos-enterprise
# Modificare:
# limits_config:
# retention_period: 336h # 14 giorni (da 720h/30 giorni)
# compactor:
# retention_enabled: true
# delete_request_store: filesystem
# Riavviare Loki
kubectl rollout restart deployment loki -n pos-enterprise
Tempo
kubectl edit configmap tempo-config -n pos-enterprise
# Modificare:
# compactor:
# compaction:
# block_retention: 168h # 7 giorni
kubectl rollout restart deployment tempo -n pos-enterprise
Espansione PVC (se il provider lo supporta)
# Verificare che la StorageClass supporti l'espansione
kubectl get storageclass -o json | jq '.items[] | {name: .metadata.name, allowVolumeExpansion}'
# Espandere il PVC (esempio: da 10Gi a 20Gi)
kubectl patch pvc <PVC_NAME> -n pos-enterprise -p '{"spec":{"resources":{"requests":{"storage":"20Gi"}}}}'
# Verificare lo stato dell'espansione
kubectl get pvc <PVC_NAME> -n pos-enterprise -o jsonpath='{.status.conditions}'
# Nota: alcuni provider richiedono il restart del pod per completare l'espansione
kubectl delete pod <POD_USING_PVC> -n pos-enterprise
Log rotation per i pod applicativi
# Verificare se i container scrivono log su disco (oltre a stdout)
kubectl exec <POD_NAME> -n pos-enterprise -- ls -lah /app/logs/ 2>/dev/null
# Configurare logrotate se necessario
kubectl exec <POD_NAME> -n pos-enterprise -- \
sh -c "find /app/logs -name '*.log' -size +100M -exec truncate -s 0 {} \;"
Pulizia log container (a livello di nodo)
# Se il problema e nei log dei container sul nodo
# (gestiti da containerd/docker, non nei PVC)
ssh <NODE_IP> "sudo find /var/log/containers -name '*pos-enterprise*' -size +500M"
# Forzare la rotazione dei log del container runtime
ssh <NODE_IP> "sudo crictl rmi --prune"
Prevenzione
- Alert a soglie progressive: 70% (info), 80% (warning), 90% (critical).
- Retention policy definite: documentare e applicare policy di retention per ogni componente.
Retention raccomandate
| Componente | Retention | Dimensione PVC | Note |
|---|---|---|---|
| Prometheus | 15 giorni | 20Gi | Con remote write a Thanos per long-term |
| Loki | 14 giorni | 15Gi | Solo log di errore in produzione |
| Tempo | 7 giorni | 10Gi | Sampling al 10% in produzione |
| PostgreSQL DWH | 365 giorni | 50Gi | Dati aggregati, non raw |
- Compaction automatica: verificare che i job di compaction di Prometheus, Loki e Tempo funzionino regolarmente.
- Monitoraggio trend: dashboard Grafana con proiezione di esaurimento disco.
# Giorni rimanenti prima dell'esaurimento
(kubelet_volume_stats_available_bytes{namespace="pos-enterprise"})
/ deriv(kubelet_volume_stats_used_bytes{namespace="pos-enterprise"}[7d])
/ 86400
- PVC auto-expansion: se supportato dal cloud provider, abilitare l'espansione automatica.
- Log level in produzione: assicurarsi che il log level sia
infoowarn(nondebugotrace).
# Verificare il log level attuale
kubectl get deployment api-gateway -n pos-enterprise \
-o jsonpath='{.spec.template.spec.containers[0].env}' | \
jq '.[] | select(.name == "LOGLEVEL")'
Escalation
| Livello | Condizione | Contatto |
|---|---|---|
| L1 - Ops | PVC 80-85%, crescita lenta | Ridurre retention, monitorare |
| L1 - Ops | PVC 85-90%, crescita rapida | Espandere PVC, pulire dati |
| L2 - Infra | PVC > 90%, espansione non possibile | DevOps Lead - migrazione storage |
| L3 - All | PVC 100%, servizi di osservabilita down | Incident - ripristino immediato |
Tempo massimo di risposta: 30 minuti. Se il PVC di Prometheus supera il 90%, trattare come Critical perche si perde la capacita di monitoraggio.
Questa pagina ti è stata utile?