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

86 lines
4.1 KiB
Markdown
Raw 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-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. Делать.