docs: MSS-CLAMPING-PLAN — корневое решение вместо Local+4реплики
Deploy drhider / validate (push) Waiting to run

This commit is contained in:
2026-07-13 13:12:55 +04:00
parent 0cdef67c1f
commit 29e2d08cdb
8 changed files with 64 additions and 515 deletions
+64
View File
@@ -0,0 +1,64 @@
# Корневое решение: MSS clamping вместо externalTrafficPolicy: Local
**Дата:** 2026-07-13
**Статус:** План для девопса
---
## Текущий костыль
`externalTrafficPolicy: Local` + `kubectl scale replicas=4` (сбрасывается Штурвалом каждые ~час).
## Корень проблемы
Geneve-туннель добавляет ~50 байт к пакету → превышение MTU (1500) → ICMP Frag Needed блокируется → TCP stall 51 секунда при передаче больших файлов.
## Решение: MSS clamping через Cilium
```yaml
# ConfigMap cilium-config
mtu: 1450
```
Cilium режет MSS (Maximum Segment Size) у TCP SYN-пакетов так, чтобы итоговый пакет с Geneve-заголовком всегда влазил в MTU.
**Эффект:** никаких stall, никаких cross-node проблем.
## Что сделать девопсу
### Шаг 1: MSS clamping
```bash
kubectl edit configmap -n kube-system cilium-config
# mtu: 1450
```
Или iptables (если Cilium не управляет MTU):
```bash
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
```
### Шаг 2: Вернуть Cluster policy
```bash
kubectl patch svc -n ingress shturval-ingress-controller-controller \
-p '{"spec":{"externalTrafficPolicy":"Cluster"}}'
```
### Шаг 3: Верификация
- Загрузить файл > 5 MB через drhider — должно быть без 51-сек паузы
- F5 несколько раз — без ERR_TIMED_OUT
- Проверить другие сервисы (Keycloak, etc.) — без регрессий
## Почему это грамотно
- Стандартная практика для любого туннельного CNI
- Решает корневую причину, не симптомы
- Не трогает логику Штурвала
- Не требует DaemonSet, 4 реплик, cron-скриптов
- Работает для всего кластера, не только drhider
## Если MSS clamping невозможен
План Б: DaemonSet для ingress через Штурвал (`controller.kind: DaemonSet` в Helm values).