# 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. ## Решение ```bash 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