init
This commit is contained in:
Executable
+41
@@ -0,0 +1,41 @@
|
||||
#!/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"
|
||||
Reference in New Issue
Block a user