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

2.8 KiB
Raw Blame History

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?