From 69bc33eab84ce28b7f5e6fa2cde7cbec87d5d4fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Sat, 15 Aug 2026 15:03:33 +0400 Subject: [PATCH] =?UTF-8?q?doc:=20=D0=BF=D0=BB=D0=B0=D0=BD=20v4=20=D0=BE?= =?UTF-8?q?=D1=82=20=D0=9E=D0=BF=D1=83=D1=81=D0=B0=204.8=20+=20=D0=BE?= =?UTF-8?q?=D1=82=D0=B2=D0=B5=D1=82=D1=8B=20=D0=BD=D0=B0=20=D1=83=D1=82?= =?UTF-8?q?=D0=BE=D1=87=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20(=D0=BD=D0=B5?= =?UTF-8?q?=D1=82=20=D0=B2=D1=82=D0=BE=D1=80=D0=BE=D0=B3=D0=BE=20ISP,=20NE?= =?UTF-8?q?T=5FRAW=20=D0=B2=D1=80=D1=8F=D0=B4=20=D0=BB=D0=B8,=20echo=20?= =?UTF-8?q?=D0=BE=D1=82=D0=BB=D0=BE=D0=B6=D0=B8=D1=82=D1=8C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HISTORY/2026-08-14-session-log.md | 16 ++++ .../nubes-network-bug-plan-v4-opus.md | 79 +++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 doc/thinking/nubes-network-bug-plan-v4-opus.md diff --git a/HISTORY/2026-08-14-session-log.md b/HISTORY/2026-08-14-session-log.md index 095bfb2..cc0444e 100644 --- a/HISTORY/2026-08-14-session-log.md +++ b/HISTORY/2026-08-14-session-log.md @@ -1004,3 +1004,19 @@ ISP и контрольный канал YMQ, port-forward идёт через A тестом с timestamp на каждый таймаут. Сравнение: Flash — ошибки и недооценка; Pro — силён, но без явного разделения явлений; Соннет — принять за основу с поправками. + +## 2026-08-15 — план v4 от ОПУС 4.8 + ответы на его уточнения + +Сохранён: `doc/thinking/nubes-network-bug-plan-v4-opus.md` (план + ответы). + +Опус изучил репозиторий и три предыдущих плана; его план согласуется с +Соннетом (разделение A/B, port-forward первым, tcpdump по seq, cilium monitor +на поде). Ответы основного агента на уточнения Опуса: +1) второго ISP нет, полагаемся на контрольный канал YMQ (1 ошибка на 959 +против 49 таймаутов Nubes — локальный интернет исключён); +2) debug-под с NET_RAW скорее всего запрещён, серверный tcpdump не получится — +nginx-логи + cilium monitor + echo А/Б; +3) echo деплоить только если фазы 0–2 не хватят (риск: NodePort на managed). +Поправка: port-forward идёт через API-сервер — доказывает невиновность +приложения, но не вину шлюза. +Все 4 плана сохранены в doc/thinking/: Flash, Pro, Sonnet, Opus. diff --git a/doc/thinking/nubes-network-bug-plan-v4-opus.md b/doc/thinking/nubes-network-bug-plan-v4-opus.md new file mode 100644 index 0000000..9e8c8cf --- /dev/null +++ b/doc/thinking/nubes-network-bug-plan-v4-opus.md @@ -0,0 +1,79 @@ +# План: доказать, что таймауты — в пути/шлюзе Nubes — v4 (ОПУС 4.8) + +> ✅ **ПОМЕТКА: план от Claude Opus 4.8** (пользователь передал ответ Опуса, +> который изучил репозиторий и три предыдущих плана). +> Сохранено 2026-08-15. Ниже — план Опуса + ответы основного агента на его +> уточняющие вопросы. + +## TL;DR + +Доказательство — изоляцией слоёв. «Виновата платформа» = таймауты +воспроизводятся БЕЗ нашего кода (port-forward чист, echo/сырой TCP таймаутит) ++ tcpdump с клиента ловит потерю сегмента, когда nginx/под ответили за +миллисекунды. + +**Два РАЗНЫХ явления — раздельно:** +- **A. Большие POST ~51с** — локализовано: MSS=1448 → пакет 1488 > underlay + 1450 → дроп при DF, PMTUD мёртв. Осталось зафиксировать порог ping-зондом. +- **B. Малые тела 512б, ~1 таймаут/37с** — MTU не объясняет. Регулярность = + таймер (шлюз VIP / ARP-флап kube-vip / conntrack GC). Главная нераскрытая часть. + +## Ответы Опуса на вопросы + +1. **Echo vs сырой TCP.** Сырой TCP недостаточен (только SYN/ACK; потери в + фазе данных). Самое дешёвое доказательство невиновности приложения — + `kubectl port-forward` мимо шлюза, а не echo. Echo — позже, только если + port-forward+логи не закрыли вопрос (он внутри кластера, а подозрение на шлюзе). +2. **Поймать таймаут.** tcpdump на клиенте, корреляция по TCP seq/ack: ретрансмиты + SYN → потеря на установлении; тишина после ACK → потеря после nginx; ICMP + frag-needed → PMTUD; кто и через сколько шлёт RST → чей таймер; интервал + между таймаутами → подтвердить ~37с. +3. **Через kubectl.** nginx access-log request_time/upstream_response_time: + 499+большой request_time = клиент ушёл; 200+малый upstream без ответа клиенту + = потеря nginx↔клиент; записи нет = потеря до nginx. cilium monitor --type + drop — на cilium-ПОДЕ нужной ноды (не operator). externalTrafficPolicy + Cluster/Local. + +## Шаги (дешевле → дороже) + +- **Фаза 0 (бесплатно):** nginx access-log за прошлый тест → логи kube-vip + (флапы) → тикет Nubes (A и B раздельно). +- **Фаза 1 (клиент, ~30 мин):** PMTUD-зонд ping -M do (fallback mtr --tcp) → + tcpdump + повтор теста через long_compare_local.py с логом timestamp каждого + таймаута → контрольный канал YMQ во всех прогонах. +- **Фаза 2 (kubectl, без деплоя):** port-forward ПЕРВЫМ (невиновность приложения) + → cilium monitor drop параллельно → проверка externalTrafficPolicy/nodePort. +- **Фаза 3 (echo, если 0–2 не хватило):** Go echo без ingress на NodePort → + таймаутит → nginx и код исключены → потом echo через ingress (изоляция nginx). +- **Фаза 4 (тикет):** одновременный tcpdump + nginx-log + cilium monitor, + корреляция по seq → pcap+логи+ping в тикет. + +**Что считается доказательством:** echo-NodePort таймаутит тем же паттерном → +nginx+код исключены; nginx 200/upstream<100мс без ответа клиенту → потеря +nginx↔клиент; pcap показывает недоставленный сегмент; ping-порог → MTU; +cilium drop → внутри кластера; port-forward чист + внешний IP таймаутит → +приложение невиновно; стабильный интервал ~37с → таймер шлюза. + +--- + +## Уточнения Опуса и ответы основного агента + +1. **Второй клиент с другого ISP?** НЕТ. В распоряжении только ВМ + (5.172.178.213), но она рядом с платформой — с неё таймаутов нет, как + «второй клиент из другого сегмента» не подходит. Частичная замена уже есть: + контрольный канал YMQ с той же локали — 1 ошибка на 959 при 49 таймаутах на + Nubes (виноват локальный интернет → YMQ страдал бы так же). Полагаемся на + YMQ-канал; второй ISP — если появится доступ к VPS. +2. **Debug-под с NET_RAW?** Не проверяли; платформа managed, ноды недоступны, + привилегии урезаны — с высокой вероятностью запрещено. Под — alpine без + NET_RAW, серверный tcpdump не получится. Ограничиваемся nginx access-log + + cilium monitor + echo А/Б. Возможность kubectl debug проверяется одной + попыткой. +3. **Echo сразу?** НЕТ — только если фазы 0–2 не дадут однозначного ответа. + Доп. риск: новый NodePort для echo на managed может быть недоступен. + +## Поправка основного агента + +port-forward идёт через API-сервер (не тот сетевой путь) — он доказывает +только невиновность приложения, а не вину шлюза. Использовать формулировку +Опуса из таблицы доказательств (она корректна).