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

90 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Корневое решение: 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
```
## Что сделать девопсу
### Шаг 0: Измерить реальный underlay MTU
```bash
# С одной ноды на IP другой ноды (DF-бит, подбираем размер)
ping -M do -s 1472 <ip_другой_ноды> # 1472+28=1500; если не проходит — уменьшать
tracepath <ip_другой_ноды> # покажет pmtu на пути
```
Если 1500 не проходит — уменьшать шагами по 50 (1450, 1400...) пока не пройдёт. Результат = значение для `mtu`.
### Шаг 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 не нужен.