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

4.6 KiB
Raw Blame History

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 по числу нод.