Runbook: NodeDiskFull¶
Alerte : NodeDiskFull / NodeDiskPressure (PrometheusRule, severity critical)
Symptôme :
Node
<node>a moins de 10% d'espace disque libre. Kubelet commence à evict des pods.
Severity : 🔴 critical — notif Slack #akko-critical, repeat 15 min
Diagnostic¶
1. Identifier le node saturé¶
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
kubectl top node
kubectl get node -o custom-columns=NAME:.metadata.name,CONDITIONS:.status.conditions[?(@.type=='DiskPressure')].status
2. SSH sur le node + df -h¶
ssh root@<node>
df -h
du -sh /var/lib/rancher/k3s/agent/containerd/* | sort -h | tail -20
du -sh /var/log/pods/* | sort -h | tail -20
3. Identifier les pods avec gros ephemeral storage¶
kubectl get pod -n akko -o json | \
jq -r '.items[] | "\(.metadata.name) \(.spec.containers[].resources.requests."ephemeral-storage" // "n/a")"'
Causes fréquentes + fix¶
| Cause | Fix |
|---|---|
| Images containerd trop nombreuses | crictl rmi --prune — purge les images orphelines |
| Logs conteneurs pas rotatés | Configurer log-opts.max-size=10m + max-file=3 dans containerd |
| logs layer stockage plein | Bump rétention + compactor : voir monitoring/loki/values.yaml |
| PVC object storage saturé | Alignement values sur live OR migration vers Longhorn resizable (L09) |
| Core dumps pas purgés | find /var/lib -name "core.*" -mtime +7 -delete + désactiver via sysctl |
| k3s snapshot DB trop gros | k3s etcd-snapshot prune --retention=5 |
| Temp files JupyterHub spawner | find /home/jovyan -name "*.ipynb_checkpoints*" -mtime +30 -delete |
Fix d'urgence (< 5 min pour récupérer 10%)¶
# Sur le node concerné
ssh root@<node>
# 1. Purge images containerd orphelines (souvent > 10 GB libérés)
crictl rmi --prune
# 2. Purge logs > 7 jours
find /var/log/pods -name '*.log' -mtime +7 -delete
# 3. Purge k3s snapshot DB anciens
k3s etcd-snapshot prune --retention=5
df -h
Fix pérenne (R02)¶
Configurer kubelet garbage collection¶
Fichier : /etc/rancher/k3s/config.yaml sur le node
kubelet-arg:
- "image-gc-high-threshold=75"
- "image-gc-low-threshold=65"
- "eviction-hard=imagefs.available<10%,memory.available<100Mi"
- "eviction-soft=imagefs.available<15%"
- "eviction-soft-grace-period=imagefs.available=2m"
Puis systemctl restart k3s.
Configurer containerd log rotation¶
Fichier : /etc/containerd/config.toml
Attention : cette configuration doit être managée via Ansible/GitOps pour survivre aux rebuilds (règle R03).
Prévention¶
- Dashboard Dashboards "Node disk usage" — surveillance par node
- CronJob de purge hebdo : déployer un DaemonSet qui tourne
crictl rmi --pruneune fois par semaine - logs layer retention strict : 30 jours max en production, voir L10
- Alertes précoces :
NodeDiskPressureWarningà 80% (pas 90%)
Lessons learned¶
- L09 — local-path PVC non-resizable. Si object storage PVC plein, migrer vers Longhorn avant d'atteindre 95%.
Liens utiles¶
- PVC Full — cas plus ciblé sur un PVC spécifique
- logs layer retention (Monitoring service)