Skip to content

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

[plugins."io.containerd.grpc.v1.cri"]
  max_container_log_line_size = 16384

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 --prune une 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