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

58 lines
2.7 KiB
Markdown
Raw Permalink 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.
# Вопрос 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?