etcd — алерт при частой смене лидера
etcd в кластере K8s переизбирает лидера каждые 30 сек — kube-apiserver лагает, controller-manager не успевает применять reconcile. Это видно только в etcd-метриках.
Рецепт
#!/usr/bin/env bash
# /etc/cron.d/etcd-flap
# */5 * * * * root /opt/etcd-flap.sh
ENDPOINTS=${ETCD_ENDPOINTS:-https://127.0.0.1:2379}
CACERT=${ETCD_CACERT:-/etc/etcd/ca.crt}
CERT=${ETCD_CERT:-/etc/etcd/etcd.crt}
KEY=${ETCD_KEY:-/etc/etcd/etcd.key}
# Use the metrics endpoint — Prometheus exposition format
TOTAL=$(curl -s --cacert "$CACERT" --cert "$CERT" --key "$KEY" \
"${ENDPOINTS%,*}/metrics" | awk '/^etcd_server_leader_changes_seen_total/ {print $2}')
STATE=/var/lib/etcd-flap.state
PREV=$(cat "$STATE" 2>/dev/null || echo 0)
echo "$TOTAL" > "$STATE"
DELTA=$((${TOTAL%.*} - ${PREV%.*}))
THRESH=${THRESH:-3} # > 3 elections / 5 min = flapping
if [ "$DELTA" -gt "$THRESH" ]; then
curl -fsS "$HEARTBEAT_URL" --data "leader_changes=$DELTA,window=5m"
exit 2
fi
echo "OK ($DELTA leader changes / 5m)"
То же самое в Enterno.io
Подключите Enterno heartbeat — корреляция flap-эпизодов с deploy-окнами и подсветка "в день релиза etcd flap-нул 12 раз" вместо разрозненных метрик.
Похожие рецепты
Readiness-probe внутри пода есть, но никто не видит, что LB отказался роутить трафик на новый deploy.
CrashLoopBackOff в одном пространстве имён — kubectl показывает restart-count = 47, но никто не видит. Хочется endpoint, который вернёт high когда счётчик прыгает.
Node ушла в NotReady (kubelet не пингует apiserver, runtime болен) — поды на ней живут как зомби пока taint не выгонит. Kubernetes-events не уйдут в Slack по умолчанию.