Runbook : NodeDiskFull¶
Alerte : NodeDiskFull / NodeDiskPressure (PrometheusRule, severity critical)
Symptôme :
Le node
<node>a moins de 10 % d'espace disque libre. Kubelet commence à éjecter des pods.
Severity : 🔴 critical — notif Slack #akko-critical, répétition 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 consommant de l'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 + correctif¶
| Cause | Correctif |
|---|---|
| Trop d'images containerd | crictl rmi --prune — purge des images orphelines |
| Logs non rotatés | Configurer log-opts.max-size=10m + max-file=3 dans containerd |
| Stockage logs layer plein | Bump rétention + compactor : voir monitoring/loki/values.yaml |
| PVC object storage saturé | Aligner les values sur le live OU migrer vers Longhorn (L09) |
| Core dumps non purgés | find /var/lib -name "core.*" -mtime +7 -delete + désactiver via sysctl |
| Snapshots DB k3s trop volumineux | k3s etcd-snapshot prune --retention=5 |
| Fichiers temp JupyterHub | find /home/jovyan -name "*.ipynb_checkpoints*" -mtime +30 -delete |
Correctif d'urgence (< 5 min pour récupérer 10 %)¶
# Sur le node concerné
ssh root@<node>
# 1. Purger les images containerd orphelines (libère souvent > 10 GB)
crictl rmi --prune
# 2. Purger les logs > 7 jours
find /var/log/pods -name '*.log' -mtime +7 -delete
# 3. Purger les anciens snapshots DB k3s
k3s etcd-snapshot prune --retention=5
df -h
Correctif pérenne (R02)¶
Configurer le garbage collection kubelet¶
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 la rotation des logs containerd¶
Fichier : /etc/containerd/config.toml
Cette configuration doit être gérée via Ansible/GitOps pour survivre aux rebuilds (règle R03).
Prévention¶
- Dashboard Dashboards « Node disk usage » — surveillance par node
- CronJob de purge hebdomadaire : déployer un DaemonSet qui lance
crictl rmi --pruneune fois par semaine - Rétention logs layer stricte : 30 jours max en production, voir L10
- Alertes précoces :
NodeDiskPressureWarningà 80 % (pas 90 %)
Lessons learned¶
- L09 — Les PVC local-path ne sont pas redimensionnables. Si le PVC object storage est plein, migrer vers Longhorn avant d'atteindre 95 %.
Liens utiles¶
- PVC Full — cas plus ciblé sur un PVC spécifique
- Rétention logs layer (service Supervision)