65 lines
2.3 KiB
Markdown
65 lines
2.3 KiB
Markdown
# Корневое решение: 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).
|