Kubernetes — алерт когда PVC висит в Pending
PVC создан, но провайдер не выделил volume (StorageClass типа? capacity exhausted? CSI driver? upstream cloud quota?). Pod ждёт PVC и не запустится — но deployment-status не покажет почему.
Рецепт
#!/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-команда разбудит вас.
Похожие рецепты
Readiness-probe внутри пода есть, но никто не видит, что LB отказался роутить трафик на новый deploy.
Cron бэкапа тихо упал, никто не заметил, через неделю обнаружится при инциденте. Нужен алерт, если последний backup-файл старше 30 часов.
CrashLoopBackOff в одном пространстве имён — kubectl показывает restart-count = 47, но никто не видит. Хочется endpoint, который вернёт high когда счётчик прыгает.