Skip to main content

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

ComponenteRetentionDimensione PVCNote
Prometheus15 giorni20GiCon remote write a Thanos per long-term
Loki14 giorni15GiSolo log di errore in produzione
Tempo7 giorni10GiSampling al 10% in produzione
PostgreSQL DWH365 giorni50GiDati 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 info o warn (non debug o trace).
# 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

LivelloCondizioneContatto
L1 - OpsPVC 80-85%, crescita lentaRidurre retention, monitorare
L1 - OpsPVC 85-90%, crescita rapidaEspandere PVC, pulire dati
L2 - InfraPVC > 90%, espansione non possibileDevOps Lead - migrazione storage
L3 - AllPVC 100%, servizi di osservabilita downIncident - 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?