#!/bin/bash # Сколько запросов прошло через временные прокси на исходном кубе: два снимка счётчиков ingress-контроллеров с паузой. # loopctl proxy traffic loop-2 [300] # 0 за интервал = трафика нет, прокси можно снимать. Счётчик растёт = кто-то ещё ходит по старому адресу (кэш DNS, прибитый IP). # Редкие запросы (webhook раз в сутки) короткий интервал не поймает: для уверенности сравнить снимки за сутки (state/proxy-counters-*). set -euo pipefail . "$(dirname "$0")/../lib/common.sh" SRC=${1:?исходный куб, например loop-2}; GAP=${2:-300} metrics() { # $1 ns, $2 под, $3 порт; не прочитались = стоп (частичный снимок дал бы ложные дельты) kubectl --context "$SRC" get --raw "/api/v1/namespaces/$1/pods/$2:$3/proxy/metrics" || { echo "метрики $1/$2 не прочитались" >&2; return 1; } } snap() { # "<прокси> <счётчик>" по всем подам traefik (:9100) и ingress-nginx (:10254) local ns p m for ns in $(kubectl --context "$SRC" get pods -A -l app.kubernetes.io/name=traefik -o jsonpath='{.items[*].metadata.namespace}' | tr ' ' '\n' | sort -u); do for p in $(kubectl --context "$SRC" -n "$ns" get pods -l app.kubernetes.io/name=traefik --field-selector=status.phase=Running -o name | cut -d/ -f2); do m=$(metrics "$ns" "$p" 9100) || return 1 grep '^traefik_service_requests_total' <<<"$m" | grep -- '-proxy-443@' \ | sed -E 's/.*service="loop-([^"]+)-proxy-443@kubernetes".* ([0-9.e+]+)$/\1 \2/' done done for ns in $(kubectl --context "$SRC" get pods -A -l app.kubernetes.io/name=ingress-nginx -o jsonpath='{.items[*].metadata.namespace}' | tr ' ' '\n' | sort -u); do for p in $(kubectl --context "$SRC" -n "$ns" get pods -l app.kubernetes.io/name=ingress-nginx --field-selector=status.phase=Running -o name | cut -d/ -f2); do m=$(metrics "$ns" "$p" 10254) || return 1 grep '^nginx_ingress_controller_requests{' <<<"$m" | grep -- 'ingress="[a-z0-9-]*-proxy"' \ | sed -E 's/.*ingress="([a-z0-9-]+)-proxy".* ([0-9.e+]+)$/\1 \2/' done done return 0 } sum() { awk '{t[$1]+=$2} END{for(k in t) printf "%s %d\n",k,t[k]}' | sort; } A=$(snap | sum); [ -n "$A" ] || { echo "на $SRC не нашёл прокси в метриках"; exit 1; } F=$STATE/proxy-counters-$SRC-$(date +%Y%m%d-%H%M).txt; echo "$A" > "$F" echo "снимок 1: $(wc -l <<<"$A" | tr -d ' ') прокси, жду $GAP с..."; sleep "$GAP" B=$(snap | sum); [ -n "$B" ] || { echo "второй снимок пустой (поды ingress перезапустились?), повтори"; exit 1; } join -a2 -e0 -o 0,1.2,2.2 <(echo "$A") <(echo "$B") | awk -v g="$GAP" '{d=$3-$2; printf "%8d %s\n", d, $1}' | sort -rn > "$STATE/.delta" echo "запросов за $GAP с (прокси):"; awk '$1>0' "$STATE/.delta" echo "без трафика: $(awk '$1==0' "$STATE/.delta" | wc -l | tr -d ' ') прокси -> $STATE/proxy-zero-$SRC.txt" awk '$1==0{print $2}' "$STATE/.delta" > "$STATE/proxy-zero-$SRC.txt" echo "снимок для сравнения через сутки: $F"