Files
loadtest/History/2026-07-11-fix-externalTrafficPolicy.md
T
naeel df52916be9
Deploy loadtest / validate (push) Waiting to run
docs: final fix summary — externalTrafficPolicy Local
2026-07-11 11:02:05 +04:00

2.4 KiB
Raw Blame History

2026-07-11 — FIX: externalTrafficPolicy Local

Проблема

WebSocket и HTTP POST (>50 KB) через VIP (185.247.187.151) — 51-секундная пауза в ~80% соединений. Внутри кластера всё мгновенно.

Диагностика (12 часов)

Тест Результат
Pod → ingress pod IP (та же нода) 5/5 FAST
Pod → ingress pod IP (другая нода) 5/5 FAST
Pod → ingress ClusterIP (10.105.13.158) 5/5 FAST
Pod → ClusterIP сервис (без ingress) 3/3 FAST
SSH-хост → VIP 2/5 FAST
Внешняя машина → VIP ~15% FAST
Минимальный Flask (тестовый pod) Тот же паттерн
HTTP POST (raw body) Таймаут >120s
4 ingress реплики + externalTrafficPolicy: Cluster 3/10 FAST

Проблема изолирована: kube-vip ARP mode + externalTrafficPolicy: Cluster.

Корень

externalTrafficPolicy: Cluster (дефолт) позволяет kube-vip/Cilium форвардить трафик на ЛЮБУЮ ноду кластера. Если нода не имеет локального ingress-пода, трафик форвардится через cross-node (Geneve), вызывая TCP stall.

Решение

kubectl patch svc -n ingress shturval-ingress-controller-controller \
  -p '{"spec":{"externalTrafficPolicy":"Local"}}'

С Local трафик идёт только на ноды с локальными ingress-подами. Cross-node форвардинг исключён.

Результат

5/5 FAST (2 MB WebSocket через VIP). Проблема устранена.

Состояние кластера после фикса

  • externalTrafficPolicy: Local на сервисе shturval-ingress-controller-controller
  • 4 ingress реплики (по одной на ноду)
  • Код приложения: v1.0.25 (baseline WS + Gunicorn gevent)

Что НЕ помогло (полный список)

  • vip_leaderelection=true
  • hostNetwork на python поде
  • nodeSelector
  • keepalive=0 к upstream
  • proxy-request-buffering on/off
  • use-http2=false
  • MSS clamping
  • Gunicorn gthread/gevent
  • HTTP POST (raw body / base64 / multipart)
  • 8KB чанки + ACK
  • bufferedAmount flow control