# Корневое решение: MSS clamping через Cilium **Дата:** 2026-07-13 (обновлено после валидации Opus) **Статус:** План для девопса **Валидация:** [Opus response](../History/2026-07-13-opus-response-mss-clamping.md) --- ## Текущий костыль `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 ``` ## Что сделать девопсу ## Замер (выполнен 2026-07-13) ```bash kubectl run mtu-test --rm -it --restart=Never --image=nicolaka/netshoot -- ping -c 2 -M do -s 1472 172.16.0.9 # → Message too large (1500 не проходит) kubectl run mtu-test --rm -it --restart=Never --image=nicolaka/netshoot -- ping -c 2 -M do -s 1422 172.16.0.9 # → 1430 bytes from 172.16.0.9 (1450 проходит) **Результат:** underlay MTU = **1450**, туннель = **1400**. ### Шаг 1: Выставить MTU в Cilium ```bash kubectl edit configmap -n kube-system cilium-config # mtu: <измеренное значение> ``` ### Шаг 2: Применить изменения ```bash # Перезапустить агенты 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 ```bash kubectl patch svc -n ingress shturval-ingress-controller-controller \ -p '{"spec":{"externalTrafficPolicy":"Cluster"}}' ``` ### Шаг 4: Верификация ```bash # Проверить что 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 не нужен.