docs: MSS-CLAMPING-PLAN — корневое решение вместо Local+4реплики
Deploy drhider / validate (push) Waiting to run
Deploy drhider / validate (push) Waiting to run
This commit is contained in:
@@ -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).
|
||||
Reference in New Issue
Block a user