Aller au contenu

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

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

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