Files
loadtest/History/2026-08-21-root-cause-found.md

63 lines
4.6 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.
# 2026-08-21 — НАЙДЕНО: что править кубером, чтобы закачки шли (вне аннотаций)
_Дата: 2026-08-21. Кластер: example-timasbxz (свой, kubectl-admin). Инстанс: http-13.containerk8s.dev.nubes.ru._
_Ответ на вопрос: «что мы вручную кубером меняли на iot-naeel, чего нет в аннотациях, и закачки начинали работать»._
## ДВЕ правки, после которых закачки пошли (проверено по одной)
### 1. ConfigMap ingress: `client-body-timeout: 10 → 60` (ГЛАВНЫЙ виновник обрыва ~10с)
```
kubectl -n ingress patch cm shturval-ingress-controller-controller \
--type merge -p '{"data":{"client-body-timeout":"60"}}'
```
- До: `client-body-timeout: 10` → POST >~64КБ обрывался РОВНО через ~10.2с (HTTP 000, TTFB=0).
- После: обрыв на 10с исчез, тело принимается (соединение держится до таймаута).
- НЕ переопределяется аннотациями ingress-ресурса (аннотации для client-body-timeout НЕТ).
- Совпадает с iot-naeel: там стояло 60 → задержка ~51с (не обрыв); на общих кластерах 10 → обрыв 10с.
### 2. Ingress replicas: 2 → 3 (по поду на ноду) — убрало дропы при externalTrafficPolicy: Local
```
kubectl -n ingress scale deploy shturval-ingress-controller-controller --replicas=3
```
- Кластер: 3 ноды (control-plane + 2 workers), ingress было 2 пода, `externalTrafficPolicy: Local`.
- При Local трафик на ноду БЕЗ ingress-пода дропается/зависает → нестабильность (часть POST зависала).
- После scale до 3 (под на каждой ноде) — закачки стабильны.
## Результат (внешний путь, https://IP:443 -k, Host http-13)
| Тест | До правок | После правок |
|---|---|---|
| 100КБ | обрыв ровно 10.2с | 200 (0.06-0.1с) ×3 |
| 1МБ | случайно 200/000 | 200 (0.2-0.4с) |
| 10МБ | обрыв ~10-16с | 200 (1.9-2.1с) ×3 |
| /upload 1МБ | случайно | 200 (0.4с) |
## Итог (ответ на вопрос)
На iot-naeel «лечили закачки» именно этими правками кубером (вне аннотаций):
1. **client-body-timeout** в глобальном ConfigMap контроллера (60) — лечит обрыв ~10с.
2. **реплики ingress = число нод** (при externalTrafficPolicy: Local) — лечит дропы/зависания.
Дополнительно на iot-naeel: keep-alive 75, proxy-body-size 1024m (ConfigMap), MTU Cilium 1400, MSS clamping.
## Важно
- Через UI-аннотации эти параметры НЕ задаются (client-body-timeout и реплики — не аннотации).
- На обычном/чужом кластере (без kubectl) их может поменять только платформа.
- Аннотации (proxy-body-size и пр.) на входной обрыв >64КБ не влияли — влиял именно client-body-timeout.
## ДОПОЛНЕНИЕ: аннотации НЕ НУЖНЫ (проверено)
Эксперимент: удалил ВСЕ nginx-аннотации с ingress-ресурса (фактических: []),
оставил только ConfigMap (client-body-timeout 60, proxy-body-size 1024m) + replicas 3.
Закачки работают:
| Тест (без аннотаций) | Результат |
|---|---|
| 100КБ | 200 (0.07с) |
| 1МБ | 200 (0.16с) |
| 10МБ | 200 (1.44с) |
ВЫВОД: для закачек нужен ТОЛЬКО ConfigMap контроллера (client-body-timeout, proxy-body-size)
и реплики по числу нод при Local. Per-ingress аннотации (proxy-body-size и пр.) НЕ влияют и не нужны.
## ПОДТВЕРЖДЕНИЕ передеплоем (2-й раз)
Снова удалил аннотации ([]), сделал `kubectl -n NS rollout restart deploy/containerk8s`.
После передеплоя без аннотаций закачки работают: health 200, 100КБ 200 (0.06с),
1МБ 200 (0.25с), 10МБ 200 (1.4с), /upload 1МБ 200 (0.2с).
ВЫВОД подтверждён: аннотации не влияют; решают ConfigMap + replicas по числу нод.