Files
loadtest/History/sonnet-question-upload.md
T
2026-07-10 21:19:31 +04:00

2.7 KiB
Raw Blame History

Вопрос Sonnet: upload > 64KB падает на k8s-сервисе

Суть

Сервис loadtest (Flask, замер скорости загрузки файлов) на Shturval k8s v2.12.1. Файлы > ~48KB падают случайно при загрузке из интернета.

Инфраструктура

Клиент (интернет)
  → Edge LB хостера (NUBES LLC, 185.247.187.151)
    → hostPort:443 на ноде k8s
      → nginx ingress pod (Shturval, ModSecurity OWASP CRS 4.10 DetectionOnly)
        → pythonk8s pod (Flask dev-сервер, python app.py)

Ingress аннотации:

  • proxy-body-size: 1024m
  • proxy-connect-timeout: 120
  • proxy-read-timeout: 600
  • proxy-send-timeout: 600
  • proxy-request-buffering: off (добавили — помогло частично)

ModSecurity: SecRuleEngine DetectionOnly, SecRequestBodyNoFilesLimit 131072 (128KB)

Тесты (100KB base64 → 136KB POST)

Тест Результат
Изнутри пода → Flask 102400 байт, 4ms
Изнутри кластера → ingress HTTPS 102400 байт, 2ms
Снаружи (новые TCP на каждый запрос) ~50% Timeout
Снаружи (HTTP/1.1 keep-alive, одно соединение) 8/10 (первые 2 таймаут, остальные OK)

Что исключено

  • Flask — работает (тест изнутри)
  • nginx ingress — работает (тест изнутри)
  • ModSecurity — DetectionOnly, внутри работает
  • Gunicorn — не используется (Shturval запускает python app.py)
  • MTU — 1500, ping ок
  • Размер тела — нет жёсткого предела (иногда 100KB проходит, иногда 50KB нет)

Вывод

Edge LB хостера дропает ~50% НОВЫХ TCP-соединений. Установленное соединение (keep-alive) — стабильно.

Что пробовали

  1. Dockerfile: --limit-request-field_size 0 — бесполезно (Gunicorn не используется)
  2. Ingress annotation: proxy-request-buffering off — улучшило с 3/10 до 5/10
  3. HTTP/1.1 keep-alive — 8/10

Ограничения

  • Менять можно ТОЛЬКО внутри k8s (ingress, поды, деплойменты)
  • Edge LB хостера — не наш, не контролируем
  • Base64 должен остаться (требование)

Вопрос

Как сделать загрузку 100% надёжной? Идеи по обходу проблемы с edge LB? Может WebSocket? Может gRPC? Может HTTP/2 multiplexing? Может что-то на уровне ingress?