docs: финальный обзор Опуса + правки (Ethernet, 51с)
Deploy drhider / validate (push) Waiting to run

This commit is contained in:
2026-07-13 21:57:25 +04:00
parent 82b5cb4402
commit f38ba4ca37
2 changed files with 33 additions and 2 deletions
@@ -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), математика не меняется
- Замеры из таблицы результатов — эмпирические, из кода не подтвердить
+2 -2
View File
@@ -31,7 +31,7 @@ flowchart LR
> **1450** (данные) + **50** (Geneve) = **1500** → underlay **1450** → не проходит → TCP stall **51 секунда**. > **1450** (данные) + **50** (Geneve) = **1500** → underlay **1450** → не проходит → TCP stall **51 секунда**.
- Cilium соединяет ноды через **Geneve-туннель** - 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 байт** - Cilium ожидает что underlay (физический канал между нодами) = **1500 байт**
> *Стандартный Ethernet MTU — 1500. Все сетевые интерфейсы, драйверы и протоколы по умолчанию исходят из этого. Cilium опрашивает интерфейс ноды, видит 1500 и принимает за истину. Почему реальный underlay оказался 1450 — может быть связано с инфраструктурой хостинг-провайдера, промежуточным сетевым оборудованием или инкапсуляцией на уровне виртуализации. Без диагностики на стороне провайдера точная причина неизвестна. Факт установлен замером: 1500 не проходит, 1450 проходит.* > *Стандартный Ethernet MTU — 1500. Все сетевые интерфейсы, драйверы и протоколы по умолчанию исходят из этого. Cilium опрашивает интерфейс ноды, видит 1500 и принимает за истину. Почему реальный underlay оказался 1450 — может быть связано с инфраструктурой хостинг-провайдера, промежуточным сетевым оборудованием или инкапсуляцией на уровне виртуализации. Без диагностики на стороне провайдера точная причина неизвестна. Факт установлен замером: 1500 не проходит, 1450 проходит.*
- Cilium считает: **1500 50 = 1450** — такой MTU назначает туннелю и подам - Cilium считает: **1500 50 = 1450** — такой MTU назначает туннелю и подам
@@ -42,7 +42,7 @@ flowchart LR
- Роутер пытается отправить ICMP «fragmentation needed», но ICMP заблокирован - Роутер пытается отправить 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 секунда** - 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`
### Почему не всегда ### Почему не всегда