From 68571fbbcd1ae11b68d4f00b7e24e03c2e2d03a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Mon, 13 Jul 2026 17:45:36 +0400 Subject: [PATCH] =?UTF-8?q?docs:=20PROBLEM-AND-SOLUTION=20=E2=80=94=20?= =?UTF-8?q?=D0=BA=D0=BE=D1=80=D0=BD=D0=B5=D0=B2=D0=BE=D0=B9=20.md=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=B4=D0=B5=D0=B2=D0=BE=D0=BF=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PROBLEM-AND-SOLUTION.md | 85 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 PROBLEM-AND-SOLUTION.md diff --git a/PROBLEM-AND-SOLUTION.md b/PROBLEM-AND-SOLUTION.md new file mode 100644 index 0000000..00d27f6 --- /dev/null +++ b/PROBLEM-AND-SOLUTION.md @@ -0,0 +1,85 @@ +# Проблема загрузки файлов: диагностика и решение + +**Дата:** 2026-07-13 + +--- + +## В чём проблема + +При загрузке файлов через веб-интерфейс drhider периодически возникает пауза 51 секунда. Размер файла не важен — даже 100 KB могут «залипнуть». + +### Причина (технически) + +Кластер использует Cilium CNI с Geneve-туннелем между нодами. Geneve добавляет 50 байт к каждому пакету. При underlay MTU = 1450 (подтверждено замером) пакет с Geneve-заголовком не влазит → роутер не может фрагментировать (ICMP заблокирован) → TCP ждёт таймаут 51 секунду. + +### Почему не всегда + +Проблема только при **cross-node**-форвардинге (kube-vip направляет трафик на ingress-под на другой ноде). При попадании на ту же ноду — всё мгновенно. + +--- + +## Текущий временный обход + +`externalTrafficPolicy: Local` запрещает cross-node-форвардинг. Но требует ingress-под на **каждой** ноде (4 шт.). Штурвал управляет ingress через Helm с `replicaCount: 2` и периодически сбрасывает ручной scale на 4 обратно на 2. Результат: 50% запросов падают с `ERR_TIMED_OUT`. + +--- + +## Корневое решение + +Выставить корректный MTU в Cilium: + +```bash +kubectl edit configmap -n kube-system cilium-config +# mtu: 1450 + +kubectl rollout restart ds/cilium -n kube-system +kubectl rollout restart deploy -n ingress shturval-ingress-controller-controller + +# Вернуть Cluster +kubectl patch svc -n ingress shturval-ingress-controller-controller \ + -p '{"spec":{"externalTrafficPolicy":"Cluster"}}' +``` + +После этого: +- Cross-node-форвардинг работает без stall +- Ingress остаётся на 2 репликах (стоковое значение Штурвала) +- `Local` не нужен +- Ручной scale не нужен + +### Почему 1450 + +Замер выполнен 2026-07-13: + +``` +ping -M do -s 1472 → Message too large (1500 не проходит) +ping -M do -s 1422 → ok (1450 проходит) +``` + +Underlay MTU = 1450 → Geneve-туннель = 1400 → поды = 1400. + +### Почему это безопасно + +- Понижение MTU консервативно: меньше пакет → меньше проблем +- Влияет на весь кластер одинаково (не ломает отдельные сервисы) +- Стандартная практика для туннельных CNI (Geneve, VXLAN, GRE) +- Не трогает логику Штурвала + +--- + +## Что сказал Opus (краткий пересказ) + +**Подтвердил:** направление правильное — чинить корень (PMTU blackhole), а не симптом (Local + 4 реплики). + +**Уточнил:** + +1. `mtu` в cilium-config — это underlay-MTU. Cilium сам вычитает 50 байт. `mtu: 1450` → туннель 1400. +2. ConfigMap сам не применяется — нужен `rollout restart ds/cilium`. +3. iptables как fallback ненадёжен с Cilium (eBPF обходит netfilter FORWARD). +4. Понижение MTU безопасно, но число надо измерять, а не гадать. +5. Итоговое состояние `Cluster` + корректный MTU + `replicaCount: 2` — чистое и согласованное. + +--- + +## Моё мнение + +Замер сделан, число подтверждено. План готов к передаче девопсу. Это одно изменение — не костыль, а исправление конфигурации кластера под реальный underlay MTU. Делать.