docs: PROBLEM-AND-SOLUTION — корневой .md для девопса
Deploy drhider / validate (push) Waiting to run
Deploy drhider / validate (push) Waiting to run
This commit is contained in:
@@ -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. Делать.
|
||||||
Reference in New Issue
Block a user