Files
drhider/docs/MSS-CLAMPING-PLAN.md
T
2026-07-13 13:12:55 +04:00

2.3 KiB
Raw Blame History

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

# ConfigMap cilium-config
mtu: 1450

Cilium режет MSS (Maximum Segment Size) у TCP SYN-пакетов так, чтобы итоговый пакет с Geneve-заголовком всегда влазил в MTU.

Эффект: никаких stall, никаких cross-node проблем.

Что сделать девопсу

Шаг 1: MSS clamping

kubectl edit configmap -n kube-system cilium-config
# mtu: 1450

Или iptables (если Cilium не управляет MTU):

iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

Шаг 2: Вернуть Cluster policy

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).