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