47 lines
2.8 KiB
Markdown
47 lines
2.8 KiB
Markdown
# Opus request: loadtest upload > 48KB fails — FULL ANALYSIS
|
||
|
||
## СУТЬ
|
||
Flask-сервис loadtest на Shturval k8s v2.12.1. POST /upload с телом > 48KB — случайные обрывы.
|
||
|
||
## ДОКАЗАННЫЕ ТЕСТЫ
|
||
|
||
| # | Тест | Результат |
|
||
|---|------|-----------|
|
||
| 1 | pod → pod:5000 (внутри кластера) | ✅ 100% (102400 байт, 4ms) |
|
||
| 2 | pod → ingress HTTPS (внутри кластера) | ✅ 100% (102400 байт, 2ms) |
|
||
| 3 | Снаружи → 185.247.187.151:443 (новый TCP каждый раз) | ❌ ~30-50% Timeout |
|
||
| 4 | Снаружи (HTTP/1.1 keep-alive, одно соединение) | ✅ 80% (первые 2 таймаут, остальные OK) |
|
||
| 5 | VM-хост → pod IP:5000 (GET /health) | ❌ 0% (connection timeout) |
|
||
| 6 | VM-хост → k8s service IP:80 | ❌ 0% |
|
||
| 7 | VM-хост → native nginx → k8s service | ❌ 0% |
|
||
|
||
## КЛЮЧЕВОЕ ОТКРЫТИЕ
|
||
**VM-хост вообще не может общаться с pod-сетью напрямую** (тест #5-7).
|
||
Трафик снаружи идёт через **hostPort** (443 на ноде), который использует iptables DNAT для проброса в ingress-под. Это kernel-level проксирование, а не обычная маршрутизация.
|
||
|
||
## ИНФРАСТРУКТУРА
|
||
```
|
||
Edge LB (NUBES LLC, 185.247.187.151)
|
||
→ VM (5.172.178.213/10.10.102.21, ens192 MTU 1500)
|
||
→ hostPort:443 → iptables DNAT → ingress pod (172.16.x.x)
|
||
→ nginx (Shturval, ModSecurity DetectionOnly, http2 on)
|
||
→ k8s service (10.106.36.241:80)
|
||
→ app pod (172.16.x.x:5000, Flask dev-server)
|
||
```
|
||
- CNI: Cilium (подтверждено namespace cilium-secrets)
|
||
- Pod MTU: 1500, Host MTU: 1500
|
||
- ModSecurity: SecRuleEngine DetectionOnly, SecRequestBodyNoFilesLimit 131072
|
||
|
||
## ЧТО УЖЕ СДЕЛАНО
|
||
- proxy-request-buffering: off (ingress annotation) — улучшило с 3/10 до 5/10
|
||
- keep-alive 10→75 — УХУДШИЛО (0/10), откачено
|
||
- Ретраи на клиенте — КОСТЫЛЬ, не принимается
|
||
- Dockerfile Gunicorn limits — бесполезно (Shturval запускает python app.py)
|
||
|
||
## ГИПОТЕЗА
|
||
iptables DNAT (hostPort) + conntrack + большое тело = часть TCP-сегментов теряется при трансляции. После установки соединения (keep-alive) — стабильно. Новые соединения дропаются случайно.
|
||
|
||
## ВОПРОС
|
||
Как добиться 100% надёжности загрузки без ретраев?
|
||
Варианты: WebSocket? gRPC? Убрать hostPort, использовать NodePort/LoadBalancer? Тюнинг conntrack?
|