Files
drhider/docs/MSS-CLAMPING-PLAN.md
T

3.8 KiB
Raw Blame History

Корневое решение: MSS clamping через Cilium

Дата: 2026-07-13 (обновлено после валидации Opus)
Статус: План для девопса
Валидация: Opus response


Текущий костыль

externalTrafficPolicy: Local + kubectl scale replicas=4 (сбрасывается Штурвалом каждые ~час).

Корень проблемы

Geneve-туннель добавляет ~50 байт → превышение underlay MTU → ICMP Frag Needed блокируется → TCP stall 51с.

Решение

Выставить корректный MTU в Cilium, чтобы пакеты с Geneve-заголовком всегда влазили.

Важно: mtu в cilium-config — это MTU underlay-сети (физической/VM-сети между нодами). Cilium сам вычитает 50 байт на Geneve:

mtu: X  →  туннель = X − 50  →  поды = X  50

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

Шаг 0: Измерить реальный underlay MTU

# С одной ноды на IP другой ноды (DF-бит, подбираем размер)
ping -M do -s 1472 <ip_другой_ноды>   # 1472+28=1500; если не проходит — уменьшать
tracepath <ip_другой_ноды>            # покажет pmtu на пути

Если 1500 не проходит — уменьшать шагами по 50 (1450, 1400...) пока не пройдёт. Результат = значение для mtu.

Шаг 1: Выставить MTU в Cilium

kubectl edit configmap -n kube-system cilium-config
# mtu: <измеренное значение>

Шаг 2: Применить изменения

# Перезапустить агенты Cilium (ConfigMap сам не применяется)
kubectl rollout restart ds/cilium -n kube-system

# Пересоздать поды приложения (ingress, drhider — чтобы veth получили новый MTU)
kubectl rollout restart deploy -n ingress shturval-ingress-controller-controller

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

kubectl patch svc -n ingress shturval-ingress-controller-controller \
  -p '{"spec":{"externalTrafficPolicy":"Cluster"}}'

Шаг 4: Верификация

# Проверить что Cilium применил MTU
kubectl -n kube-system exec ds/cilium -- cilium-dbg status | grep -i mtu
ip link show | grep -E 'cilium|geneve'

# Проверить MSS в SYN-пакетах
tcpdump -ni any 'tcp[tcpflags] & tcp-syn != 0' -vv | grep mss

Функционально:

  • Загрузить файл > 5 MB через drhider — без паузы 51с
  • F5 несколько раз — без ERR_TIMED_OUT
  • Проверить Keycloak и другие сервисы

Почему это грамотно

  • Решает корневую причину (PMTU blackhole), не симптомы
  • Не трогает логику Штурвала (ingress остаётся на 2 репликах)
  • Работает для всего кластера
  • Стандартная практика для туннельного CNI

Примечания

  • iptables как fallback ненадёжен: Cilium с eBPF может обходить netfilter FORWARD. Если нужно — правило на всех 4 нодах, но лучше через cilium-config.
  • Понижение MTU безопасно (меньше = консервативнее). Максимум — микро-потеря throughput.
  • Не смешивать с проблемой реплик. При Cluster 2 реплик достаточно — ручной scale не нужен.