Files
loadtest/History/opus-question-final.md
T
naeel 91d717585a
Deploy loadtest / validate (push) Waiting to run
fix: debug=False, force read body, bump 1.0.6→1.0.7
2026-07-10 22:59:56 +04:00

47 lines
2.8 KiB
Markdown
Raw 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.
# 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?