docs: final fix summary — externalTrafficPolicy Local
Deploy loadtest / validate (push) Waiting to run

This commit is contained in:
2026-07-11 11:02:05 +04:00
parent a146e71500
commit df52916be9
@@ -0,0 +1,58 @@
# 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