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

59 lines
2.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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