Skip to content

Kubernetes — алерт когда PVC висит в Pending

PVC создан, но провайдер не выделил volume (StorageClass типа? capacity exhausted? CSI driver? upstream cloud quota?). Pod ждёт PVC и не запустится — но deployment-status не покажет почему.

Рецепт

bash
#!/usr/bin/env bash
# /etc/cron.d/pvc-pending
# */5 * * * * root /opt/pvc-pending.sh

CONTEXT=${KUBE_CONTEXT:-prod}
MAX_MIN=${MAX_MIN:-10}

NOW=$(date -u +%s)
STUCK=$(kubectl --context "$CONTEXT" get pvc -A -o json | jq --argjson now "$NOW" --argjson max "$MAX_MIN" '
  [.items[] | select(.status.phase == "Pending") |
   {
     ns: .metadata.namespace,
     name: .metadata.name,
     age_min: ($now - (.metadata.creationTimestamp | fromdateiso8601)) / 60
   } |
   select(.age_min > $max)]')

COUNT=$(echo "$STUCK" | jq 'length')

if [ "${COUNT:-0}" -gt 0 ]; then
  EXAMPLES=$(echo "$STUCK" | jq -r '.[] | "\(.ns)/\(.name)"' | head -5 | tr '\n' ',')
  curl -fsS "$HEARTBEAT_URL" --data "pvc_pending=$COUNT,examples=$EXAMPLES"
  exit 2
fi
echo "OK (no PVC pending > ${MAX_MIN}m)"

То же самое в Enterno.io

Заверните в Enterno heartbeat — узнаете «pvc-X висит 15 мин» и фиксанёте storageclass / quota раньше, чем deploy-команда разбудит вас.

Настроить HTTP monitor → ← Все рецепты

Похожие рецепты

Readiness-probe внутри пода есть, но никто не видит, что LB отказался роутить трафик на новый deploy.

Cron бэкапа тихо упал, никто не заметил, через неделю обнаружится при инциденте. Нужен алерт, если последний backup-файл старше 30 часов.