Files
drhider/PROBLEM-AND-SOLUTION.md
T
2026-07-13 17:45:36 +04:00

4.1 KiB
Raw Blame History

Проблема загрузки файлов: диагностика и решение

Дата: 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:

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. Делать.