59 lines
2.4 KiB
Markdown
59 lines
2.4 KiB
Markdown
# 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
|