Files
SQS-service/doc/thinking/nubes-ticket.md
T

67 lines
5.1 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.
# Тикет в Nubes: периодические сетевые таймауты внешнего пути (shared-sqs)
**Дата:** 2026-08-15
**Сервис:** shared-sqs (SQS-очередь, Go), инстанс iot-naeel,
ns f1ffb134-7d16-45bd-8bef-69f6ec8ab33c, deployment containerk8s.
**Внешний адрес:** 185.247.187.151:443 (домен sqs.containerk8s.dev.nubes.ru,
NodePort 32391), kube-vip, ingress shturval-ingress-controller.
## Явление A: большие POST (~51с зависания)
- MSS, анонсируемый шлюзом = 1448 (проверено на живом соединении), MTU пода
1400, underlay MTU 1450. Сегменты 1488 байт превышают underlay → дроп при DF.
- PMTUD не работает: ICMP Type 3 Code 4 до клиента не доходит.
- Воспроизводится POST с телом >~1.4KB: зависание ~51с (экспонента ретрасмитов
1-2-4-8-16с).
- Просьба: исправить MSS анонса на шлюзе (или включить MSS clamping /
PMTUD на внешнем шлюзе).
## Явление B: периодические таймауты на МАЛЫХ телах (512 байт) — ГЛАВНОЕ
**Симптом:** с внешней машины SQS-операции с телом 512 байт получают
ReadTimeout 30с с периодом **31.232.9с** (внутри прогона стабилен до 0.1с;
18+9+8 интервалов измерены в трёх прогонах). Параллельный канал Yandex YMQ с
той же машины — 1 ошибка на 959 запросов.
**Доказательства (все — в HISTORY/2026-08-14-session-log.md):**
1. **nginx access-log** за 30-мин тест: 862×200, **max request_time 68мс,
499=0**. nginx все запросы обрабатывает за миллисекунды.
2. **Серверный tcpdump** (ephemeral-контейнер в поде shared-sqs, eth0:4100):
в момент каждого таймаута — «дыра» 29.5с БЕЗ единого пакета: ни SYN, ни
данных, ни ретрансмитов. Зависший запрос **не доходит до пода** (иначе был
бы виден). 8 дыр на 8 сбоев, период 31.2с.
3. **cilium monitor --type drop** на ноде пода во время теста — **0 дропов**.
4. **kubectl port-forward** (в обход шлюза) — тот же клиент, та же нагрузка:
**24977 раундов, 0 сбоев**. Приложение невиновно.
5. С ВМ (внутренняя сеть): таймаутов нет вообще (p50 6–8мс).
6. **kube-vip в ошибках**: все 4 vip-пода каждую ~1с не могут создать leader
election record (namespaces "0a42bef3-7ce1-42b7-aa80-4274c4d9568f" not found),
provider — «failed to ensure load balancer: no address pools could be found»
(ретраи с backoff до 5 мин). vipHost закреплён за control-plane нодой.
**Вывод:** запросы периодически теряются на участке внешний клиент → ingress
(шлюз/VIP/kube-vip/NodePort платформы). Внутри кластера потерь нет. Период
31–33с указывает на платформенный таймер/цикл (сессионный таймер шлюза,
kube-vip announce, conntrack GC).
**Просьба:**
1. Проверить конфигурацию kube-vip (leader election в несуществующем
namespace, address pools) и внешний шлюз 185.247.187.151.
2. Объяснить/устранить периодический сбой каждые ~31с.
3. Исправить MSS анонс (1448 → ≤1410) для явления A.
**Дополнение (полный read-only обзор кластера 2026-08-15):**
- Внутри кластера цикла с периодом 31–33с НЕТ нигде: kube-vip пишет ошибки
каждые 1с, provider/services-controller — каждые 5 мин. Таймер 31с — на
внешнем шлюзе (вне кластера), что совпадает с потерей на участке
клиент→ingress.
- kube-vip поды 34 дня без рестарта: leader election бьётся в namespace
удалённого инстанса (0a42bef3-...) — вероятно, кэш удалённого LB-сервиса;
перезапуск DaemonSet убрал бы этот шум.
- ConfigMap kubevip в ns kube-vip отсутствует полностью — пулы LB никогда не
были настроены; VIP держится только аннотацией vipHost.
**Как воспроизвести:** приложить tests/ (long_compare_local.py, tcp_mtu_probe.py)
или: цикл send/receive/delete 512б с retries=0 и read_timeout=30 с внешней
машины → сбой каждые ~31с.