Диагностический runbook
Эта страница — не список общих советов, а порядок проверки живой KnotRoute-сети. Идите сверху вниз: каждый слой должен быть исправен до перехода к следующему.
/healthz Beacon не означает, что открыт 7447/tcp, а работающий sidecar не означает, что app:8080 доступен из его Docker network.
0. Соберите исходные данные
Заголовок раздела «0. Соберите исходные данные»Перед диагностикой выпишите:
Network ID kn_...Beacon HTTP URL https://beacon.example.netRelay endpoint relay.example.net:7447Client version ...Beacon version ...Sidecar version ...Service .knot ...Не смешивайте два адреса Beacon:
| Назначение | Пример | Протокол |
|---|---|---|
| discovery API | https://beacon.example.net | HTTPS |
| bundled relay | relay.example.net:7447 | KnotRoute TCP |
Нельзя указывать http://beacon.example.net:7447 в discovery.beacons: порт 7447 не говорит HTTP.
1. Проверка Control
Заголовок раздела «1. Проверка Control»Control опционален для data plane. Если Control недоступен, уже запущенные Beacon, relay и sidecar должны продолжить работу.
Проверка контейнера:
docker compose ps controldocker compose logs --tail=200 controlcurl -fsS https://control.example.net/healthzОжидается JSON с ok: true и версией.
Control требует Beacon, который уже развёрнут вручную
Заголовок раздела «Control требует Beacon, который уже развёрнут вручную»Не разворачивайте второй Beacon. Откройте Сети → Изменить и добавьте URL уже существующего HTTP API:
https://beacon.example.netКнопка Проверить Beacon выполняет /healthz с Control-host. Это проверяет именно доступность discovery endpoint для Control, а не relay 7447.
Network profile может быть сохранён вообще без Beacon. Beacon нужен sidecar deployment только потому, что managed sidecar должен получить хотя бы один bootstrap discovery path. Если discovery организован иначе, sidecar можно разворачивать вручную с соответствующим config.
Непонятная ошибка из UI
Заголовок раздела «Непонятная ошибка из UI»Сначала откройте DevTools → Network и найдите запрос /api/v1/.... Control возвращает JSON error с сообщением и, для известных validation failures, подсказкой.
После обновления Control сделайте один hard refresh. Новые версии отдают app.js с Cache-Control: no-cache, поэтому браузер не должен держать старый frontend часами.
2. Проверка Beacon HTTP
Заголовок раздела «2. Проверка Beacon HTTP»С внешней машины:
curl -v https://beacon.example.net/healthzНормальный ответ:
{"ok":true}Если здесь проблема:
- DNS должен вести на нужный host;
- reverse proxy должен маршрутизировать HTTP(S) на container
:8080; - TLS certificate должен быть валидным;
- не проксируйте HTTP API на
:7447.
На сервере полезно проверить backend в обход reverse proxy:
curl -v http://127.0.0.1:18080/healthzКонкретный host-port зависит от compose.
3. Проверка relay 7447
Заголовок раздела «3. Проверка relay 7447»HTTP health Beacon и raw relay — разные endpoints.
С внешней машины проверьте TCP reachability:
nc -vz relay.example.net 7447или PowerShell:
Test-NetConnection relay.example.net -Port 7447Если HTTP health работает, а TCP нет:
- откройте
7447/tcpв host firewall/security group; - проверьте Docker
ports:; - проверьте
KNOTROUTE_BEACON_RELAY_ADVERTISE; - убедитесь, что hostname advertise доступен клиентам извне.
curl http://host:7447. Это не HTTP endpoint.
4. Проверка Network ID
Заголовок раздела «4. Проверка Network ID»На всех участниках одной overlay должен быть один и тот же kn_...:
clientBeacon relayadditional relaysservice sidecarsembedded applicationsРазные Network ID специально не соединяются.
network_id при этом не является паролем или admission credential.
5. Проверка клиента
Заголовок раздела «5. Проверка клиента»Windows
Заголовок раздела «Windows»Откройте Dashboard и проверьте:
- Network ID;
- Beacon URL;
- peers;
- routes;
- последние события.
CLI:
knotroute doctor --config knotroute.json --probeknotroute address --config knotroute.jsonЕсли desktop сообщает, что node process упал, откройте каталог данных из tray menu и приложите knotroute.log. Desktop автоматически пытается поднять внезапно завершившийся node несколько раз, но постоянный crash loop нужно разбирать по логу, а не маскировать restart’ами.
Android
Заголовок раздела «Android»Проверьте:
- foreground notification KnotRoute;
- Network profile;
- Beacon URL;
- экран
Диагностика; Последняя ошибка;- что после изменения профиля core действительно завершил restart.
Android-клиент ждёт новую runtime generation после restart, поэтому старый ещё работающий core не должен ошибочно считаться уже перезапущенным.
6. Проверка peer discovery
Заголовок раздела «6. Проверка peer discovery»Типичные признаки исправного bootstrap:
- в client logs нет повторяющегося
Beacon ... EOF; - появляется хотя бы один connected peer;
- после PEX список peers может расширяться;
- peer cache заполняется.
Ошибка вида:
Post "http://beacon.example.net:7447/v1/peers": EOFпочти всегда означает, что relay port ошибочно записали как Beacon HTTP URL. Исправьте на:
https://beacon.example.net7. Проверка sidecar
Заголовок раздела «7. Проверка sidecar»docker ps --filter label=io.knotroute.component=sidecardocker logs --tail=200 <container>При старте ожидаются строки с node и опубликованным service address.
Health:
curl -fsS http://127.0.0.1:9090/healthzесли health port опубликован на host.
Managed sidecar не применяет новый Beacon/target
Заголовок раздела «Managed sidecar не применяет новый Beacon/target»У sidecar, развёрнутого Agent’ом, должен быть:
KNOTROUTE_CONFIG_FROM_ENV=trueВ этом режиме knotroute.json пересоздаётся из текущих environment values при старте. Service identity при этом остаётся в persistent /data, поэтому .knot address не меняется.
Если вы используете старый образ без этого режима, persistent knotroute.json может сохранить прежние Beacon/target после redeploy.
8. Проверка Docker target
Заголовок раздела «8. Проверка Docker target»Из network namespace sidecar приложение должно быть доступно именно по тому имени, которое указано как target.
Пример:
app:8080Проверьте временным контейнером в той же сети:
docker run --rm --network my_stack_private curlimages/curl:latest \ -v http://app:8080/127.0.0.1:8080 внутри sidecar — это сам sidecar, а не соседний container.
9. Проверка service identity
Заголовок раздела «9. Проверка service identity»У опубликованного сервиса должен появиться стабильный адрес:
<service-id>.knotПроверьте, что /data persistent. Никогда не используйте docker compose down -v для production sidecar, если хотите сохранить адрес.
После redeploy .knot должен остаться прежним. Если изменился — почти наверняка была потеряна service identity.
10. Проверка descriptor / introduction / rendezvous
Заголовок раздела «10. Проверка descriptor / introduction / rendezvous»Если target жив, sidecar connected, но удалённый client не открывает .knot, проблема уже в overlay service path.
Порядок:
- sidecar подключён к overlay;
- есть reachable introduction points;
- signed descriptor опубликован;
- client находит descriptor;
- client строит rendezvous circuit;
- service строит вторую половину rendezvous;
- service identity handshake проходит;
- после этого байты идут к local target.
Для воспроизводимой диагностики полезно одновременно смотреть client и sidecar logs.
11. Собственный .knot на том же node
Заголовок раздела «11. Собственный .knot на том же node»Современный core поддерживает local fast-path. Если node сам публикует service, открытие его canonical .knot не должно завершаться ошибкой:
opening a local service through the overlay is not supportedЕсли видите это сообщение — запущен старый клиент/core. Обновите binary/image и перезапустите процесс.
12. Проверка browser HTTPS
Заголовок раздела «12. Проверка browser HTTPS»Если overlay соединение есть, но браузер показывает certificate error:
- проверьте, что установлен локальный CA именно этого клиента;
- убедитесь, что браузер использует системный user trust store;
- проверьте PAC/HTTP proxy;
- не импортируйте Root CA другого пользователя;
- не нажимайте «продолжить несмотря на ошибку».
Для разделения проблем сначала попробуйте .knot через HTTP proxy/SDK без browser TLS, затем отдельно разбирайте CA.
13. Что приложить к bug report
Заголовок раздела «13. Что приложить к bug report»Минимальный полезный набор:
KnotRoute version каждого компонентаOS / architectureNetwork ID (можно показать: он не secret)Beacon HTTP URLrelay endpointclient logssidecar logsControl job error/resultDocker compose relevant servicesточный .knot request, который не работаетНе публикуйте:
- identity private keys;
- Control password;
- Agent enrollment token;
- private CA key;
- application secrets.