From f38ba4ca378e044424e271357f5c2b618467e310 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Mon, 13 Jul 2026 21:57:25 +0400 Subject: [PATCH] =?UTF-8?q?docs:=20=D1=84=D0=B8=D0=BD=D0=B0=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9=20=D0=BE=D0=B1=D0=B7=D0=BE=D1=80=20=D0=9E?= =?UTF-8?q?=D0=BF=D1=83=D1=81=D0=B0=20+=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA?= =?UTF-8?q?=D0=B8=20(Ethernet,=2051=D1=81)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2026-07-13-opus-response-final-review.md | 31 +++++++++++++++++++ PROBLEM-AND-SOLUTION.md | 4 +-- 2 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 History/2026-07-13-opus-response-final-review.md diff --git a/History/2026-07-13-opus-response-final-review.md b/History/2026-07-13-opus-response-final-review.md new file mode 100644 index 0000000..9e37f85 --- /dev/null +++ b/History/2026-07-13-opus-response-final-review.md @@ -0,0 +1,31 @@ +# Opus: финальная проверка PROBLEM-AND-SOLUTION.md + +**Дата:** 2026-07-13 + +--- + +## Вердикт + +Документ технически добротный. Диагноз и корневое решение (`mtu: 1450` + `Cluster` + `replicaCount: 2`) — правильные. + +## Исправлено + +1. **Ethernet 14** — уточнено: «инкапсулируемый L2-кадр 14» (внутренний Ethernet, не внешний) +2. **51с = прикладной таймаут** — смягчено: «браузер/curl разрывает ожидание» вместо «соединение разрывается» + +## Что подтверждено как верное + +- PMTU blackhole как причина — классический сценарий +- Cilium: `mtu` в configmap = underlay девайса, pod MTU = mtu − overhead +- Geneve overhead = 50 байт (внешний IP 20 + UDP 8 + Geneve 8 + L2 14) +- Решение: `mtu: 1450` → pod 1400 → Geneve-пакет 1450 → влазит в path 1450 +- `rollout restart ds/cilium` обязателен +- `externalTrafficPolicy: Local` → `Cluster` после фикса MTU +- DSR решает только обратный путь, stall на inbound +- iptables может не работать с eBPF dataplane + +## Мелкие замечания (не исправлены, допустимы) + +- 200ms RTO — корректно для сценария (уже установленное TCP-соединение) +- Тип туннеля (Geneve vs VXLAN) — overhead одинаков (50), математика не меняется +- Замеры из таблицы результатов — эмпирические, из кода не подтвердить diff --git a/PROBLEM-AND-SOLUTION.md b/PROBLEM-AND-SOLUTION.md index 2be9e5e..e89b007 100644 --- a/PROBLEM-AND-SOLUTION.md +++ b/PROBLEM-AND-SOLUTION.md @@ -31,7 +31,7 @@ flowchart LR > **1450** (данные) + **50** (Geneve) = **1500** → underlay **1450** → не проходит → TCP stall **51 секунда**. - Cilium соединяет ноды через **Geneve-туннель** -- Geneve добавляет к каждому пакету **+50 байт** заголовков (Ethernet 14 + IP 20 + UDP 8 + Geneve 8) +- Geneve добавляет к каждому пакету **+50 байт** заголовков (внешний IP 20 + UDP 8 + Geneve 8 + инкапсулируемый L2-кадр 14) - Cilium ожидает что underlay (физический канал между нодами) = **1500 байт** > *Стандартный Ethernet MTU — 1500. Все сетевые интерфейсы, драйверы и протоколы по умолчанию исходят из этого. Cilium опрашивает интерфейс ноды, видит 1500 и принимает за истину. Почему реальный underlay оказался 1450 — может быть связано с инфраструктурой хостинг-провайдера, промежуточным сетевым оборудованием или инкапсуляцией на уровне виртуализации. Без диагностики на стороне провайдера точная причина неизвестна. Факт установлен замером: 1500 не проходит, 1450 проходит.* - Cilium считает: **1500 − 50 = 1450** — такой MTU назначает туннелю и подам @@ -42,7 +42,7 @@ flowchart LR - Роутер пытается отправить ICMP «fragmentation needed», но ICMP заблокирован - Отправитель не знает что пакет не дошёл, ждёт подтверждения - TCP включает exponential backoff от начального RTO 200ms: **0.2с → 0.4с → 0.8с → 1.6с → 3.2с → 6.4с → 12.8с → 25.6с = 51 секунда** -- Через 51 секунду соединение разрывается → `ERR_TIMED_OUT` +- Через 51 секунду прикладной таймаут (браузер/curl) разрывает ожидание → `ERR_TIMED_OUT` ### Почему не всегда