2.4 KiB
2.4 KiB
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=truehostNetworkна python подеnodeSelectorkeepalive=0к upstreamproxy-request-buffering on/offuse-http2=false- MSS clamping
- Gunicorn gthread/gevent
- HTTP POST (raw body / base64 / multipart)
- 8KB чанки + ACK
bufferedAmountflow control