# Проблема загрузки файлов: диагностика и решение **Дата:** 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. Делать.