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