Skip to content

etcd — алерт при частой смене лидера

etcd в кластере K8s переизбирает лидера каждые 30 сек — kube-apiserver лагает, controller-manager не успевает применять reconcile. Это видно только в etcd-метриках.

Рецепт

bash
#!/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 раз" вместо разрозненных метрик.

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

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

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