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