diff --git a/HISTORY/2026-08-14-session-log.md b/HISTORY/2026-08-14-session-log.md index 8fb896b..afcac96 100644 --- a/HISTORY/2026-08-14-session-log.md +++ b/HISTORY/2026-08-14-session-log.md @@ -971,3 +971,21 @@ monitor (через cilium-operator — неверно, надо cilium-под), переоценён (проблема между интернетом и внутренней сетью — echo внутри неё), tcpdump на WSL требует sudo/интерфейс, шаг 7 (матрица размеров) слишком дорогой. Рекомендованный старт: nginx-логи → tcpdump → cilium monitor. + +## 2026-08-15 — план v2 от DeepSeek V4 Pro (новый чат, НЕ Соннет) + сравнение + +Сохранён: `doc/thinking/nubes-network-bug-plan-v2-deepseek-pro.md`. + +Оценка: план Pro сильнее Flash. Плюсы: сырые TCP с критерием доставки по TCP +ACK (не HTTP), PMTU-зонд ping -M do с порогами 1372/1422/1460/1472, второй +клиент с другого ISP, kubectl port-forward как изоляция приложения, таблица +«что считается доказательством», верное наблюдение что 51с — прикладной таймер +а не TCP-backoff. Минусы: kube-proxy может отсутствовать (Cilium replacement), +debug-контейнеры на managed скорее всего запрещены (план сам оговаривает), +эхо-NodePort требует открыть NodePort на платформе (проверяемо). + +Сравнение Flash vs Pro: Flash — декомпозиция по nginx-логам, но ошибка +cilium-operator, echo переоценён, нет PMTU/port-forward/второго ISP. +Pro — методологически полнее, грубых ошибок нет. +Рекомендованный синтез-порядок: nginx-логи → PMTU-зонд → сырые TCP → +port-forward → tcpdump клиента → второй ISP → cilium monitor → echo → тикет. diff --git a/doc/thinking/nubes-network-bug-plan-v2-deepseek-pro.md b/doc/thinking/nubes-network-bug-plan-v2-deepseek-pro.md new file mode 100644 index 0000000..7a80c9e --- /dev/null +++ b/doc/thinking/nubes-network-bug-plan-v2-deepseek-pro.md @@ -0,0 +1,137 @@ +# Стратегия доказательства сетевого бага Nubes — v2 + +> ⚠️ **ПОМЕТКА: анализ от DeepSeek V4 Pro (основная модель) в НОВОМ чате — НЕ Соннет.** +> Пользователь задал тот же вопрос в новом чате DeepSeek V4 Pro. +> Сохранено 2026-08-15. Сравнение с планом DeepSeek V4 Flash — в HISTORY +> и в конце этого файла. + +## Стратегия доказательства + +Доказывается изоляцией слоёв. Каждый тест исключает один слой пути: + +``` +клиент (локальная машина) → интернет → шлюз платформы (VIP 185.247.187.151) +→ kube-vip → NodePort 32391 → kube-proxy → nginx-ingress → Cilium → под shared-sqs +``` + +«Виновата платформа» доказано, если ВСЕ три условия: +1. Таймауты воспроизводятся на пути БЕЗ нашего кода (сырой TCP, эхо) с тем же паттерном. +2. tcpdump фиксирует потерю сегмента клиент↔кластер при том, что под/nginx + ответил за миллисекунды (по логам). +3. Потери коррелируют с MTU-порогом (~1448) или платформенным таймером + (conntrack/RST), а не с логикой приложения. + +## 1. Эхо или сырые TCP + +Делать ОБА, в порядке: сырые TCP, потом эхо. + +**Сырые TCP на 185.247.187.151:32391** — бесплатный первый тест. Покрывает +путь до nginx-пода без HTTP и без нашего кода. Отправлять сегменты 512, 1380, +1448, 1488+ байт. Критерий доставки — TCP ACK, не HTTP-ответ (nginx на мусор +ответит 400/RST — нормально). + +**Эхо-сервис** — второй шаг, ~20 строк Go, Deployment + Service с отдельным +NodePort (без ingress). Параметризуемый размер тела ответа (`?bytes=512|1400`) — +большие POST тестируют прямой путь, большие ОТВЕТЫ — обратный. Гонять тем же +клиентом. Таймауты воспроизвелись → nginx-ingress и наше приложение исключены. + +## 2. Как поймать таймаут + +tcpdump на клиенте: `tcpdump -i any -s 0 -w /tmp/cap.pcap host 185.247.187.151 and tcp port 32391` + +| Симптом | Что смотреть | +|---|---| +| 51-с зависание большого POST | ACK на сегмент с полным MSS? ретрасмиты и интервалы? чем сессия завершилась (RST/FIN, кто первый) | +| 30-с ReadTimeout на 512 байт | запрос отправлен полностью? ACK получен? ответ не пришёл? RST после idle (conntrack)? keep-alive пул? | +| MTU-гипотеза | ICMP type 3 code 4 (Fragmentation Needed)? Не приходят → PMTUD сломан → механизм зависаний | + +Замечание: 51 с не похоже на TCP-backoff Linux (tcp_retries2=15 → сотни секунд). +Скорее прикладной таймер (~50–60 с клиента/nginx/шлюза). Точный интервал в pcap +покажет, чей таймер. + +Серверный захват — только через kubectl: `kubectl debug -it --image=` +(нужны NET_RAW/NET_ADMIN — на managed может быть запрещено). Если запрещено — +роль серверного захвата выполняют nginx access log и эхо-А/Б. + +Ключевой приём: двусторонний захват, корреляция по TCP seq/ack (не по времени): +- запрос ушёл с клиента, не появился у пода → потеря на прямом пути; +- ответ ушёл из пода, клиент не получил → потеря на обратном; +- в обоих случаях приложение исключено. + +## 3. kube-vip / NodePort / nginx через kubectl + +nginx access log + `$request_time $upstream_response_time $status $bytes_sent`: + +| В логе | Вывод | +|---|---| +| 499 + большой request_time | клиент ушёл до ответа | +| 200 + малый upstream, клиент без ответа | потеря между nginx и клиентом | +| записи нет | потеря до nginx (kube-vip/NodePort/шлюз) | + +kube-vip: `kubectl get pods -A | grep -i vip`, логи (ARP/BGP-анонсы, флап VIP), +сопоставить ноду-держателя VIP с реально принимающей нодой. + +kube-proxy/NodePort: `kubectl get ds -n kube-system kube-proxy`, логи; +`externalTrafficPolicy: Cluster` → лишний хоп + SNAT; iptables/conntrack ноды +не видны (нет доступа к нодам) — debug-под с hostNetwork+privileged+nodeSelector +или тикет. + +Cilium: `kubectl exec -n kube-system -- cilium monitor --type drop` +(в cilium-под, НЕ в operator). Дроп с причиной — прямое доказательство. + +Ограничение: внешний шлюз (VIP, MSS=1448) из kubectl не виден. Если кластерные +точки чистые, а снаружи потери есть — виноват шлюз/underlay, оформляется тикет. + +## 4. Пошаговый план: дешевле → дороже + +1. Инвентаризация логов: nginx access/error за тестовый период (499, request_time + 30+/51), логи приложения (фактическое время обработки). Параллельно открыть + тикет Nubes. +2. PMTU-зонд с клиента: `ping -M do -s 1372/1422/1460/1472` до VIP (пороги MTU + 1400/1450/1488/1500); при запрете ICMP — `mtr --tcp -P 443`, tcptraceroute. + MSS=1448 → сегменты 1488 при underlay 1450 — шлюз анонсирует неверный MSS. +3. Второй клиент из другого сегмента (VPS/другой ISP): тот же скрипт. + Воспроизвелось → исключены ISP и локальная сеть пользователя. +4. Сырые TCP на 32391 с обеих точек: потери на больших сегментах без HTTP → + исключены HTTP и приложение. +5. kubectl port-forward с ВМ на shared-sqs (localhost:4100): чистый тест → + приложение и под исправны (в обход шлюза через API-туннель). +6. tcpdump на клиенте + сверка с nginx access log: классификация таймаутов. +7. Эхо-сервис NodePort без ingress: А/Б 512/1400 тем же клиентом. Остались + таймауты → nginx и приложение исключены; исчезли → завести эхо через ingress + и повторить (изоляция nginx). +8. Захват в кластере: debug-контейнеры tcpdump, cilium monitor drop, логи + kube-vip/kube-proxy; двусторонняя корреляция по seq. +9. Матрица размеров (опционально): 100–1500 байт на эхо и на 32391. Резкий + порог 1380–1448 → MTU; плавный рост → шлюз/перегрузка. + +## Итог: что считается доказательством + +| Наблюдение | Вывод | +|---|---| +| Таймауты на эхо-NodePort (без ingress) с тем же паттерном | исключены nginx и наш код — виноват kube-vip/NodePort/шлюз/underlay | +| nginx: 200 + upstream <100 мс, клиент без ответа | потеря между nginx и клиентом | +| нет записи в access log | потеря до nginx | +| pcap: сегмент не дошёл до пода / ответ не дошёл до клиента | потеря в сетевом пути | +| ping -M do: резкий порог размера | MTU-дефект пути | +| cilium monitor показывает drop | внутрикластерная потеря | +| port-forward чистый, внешний IP таймаутит | виноват шлюз/NodePort/kube-vip | + +Итоговая цепочка для тикета: pcap с клиента + access log nginx (200/upstream +малый) + воспроизведение на эхо без нашего кода + PMTU-порог ≈1448. + +--- + +## Сравнение с планом DeepSeek V4 Flash (основной агент) + +Flash: силён декомпозицией по nginx-логам, но с ошибкой (cilium monitor через +cilium-operator), переоценён echo, нет PMTU-зонда, нет порога ping -M do, нет +port-forward, нет второго ISP. + +Pro (этот план): сильнее методологически — сырые TCP с критерием ACK, +PMTU-зонд ping -M do, второй клиент, port-forward, таблица «что считается +доказательством». Грубых ошибок нет. + +Синтез (рекомендация): дешёвые тесты обоих планов + финал echo. +Порядок: nginx-логи → PMTU-зонд → сырые TCP → port-forward → tcpdump клиента → +второй ISP (если есть) → cilium monitor → echo → тикет.