2.7 KiB
2.7 KiB
Вопрос 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) — стабильно.
Что пробовали
- Dockerfile: --limit-request-field_size 0 — бесполезно (Gunicorn не используется)
- Ingress annotation: proxy-request-buffering off — улучшило с 3/10 до 5/10
- HTTP/1.1 keep-alive — 8/10
Ограничения
- Менять можно ТОЛЬКО внутри k8s (ingress, поды, деплойменты)
- Edge LB хостера — не наш, не контролируем
- Base64 должен остаться (требование)
Вопрос
Как сделать загрузку 100% надёжной? Идеи по обходу проблемы с edge LB? Может WebSocket? Может gRPC? Может HTTP/2 multiplexing? Может что-то на уровне ingress?