2.8 KiB
2.8 KiB
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?