Multi-DC telemetry ingress: edge-collector tier over the Koder VPN
Status
accepted — ratificada 2026-05-29 (owner escolheu o caminho de longo prazo explicitamente e aprovou via /k-go). Primeira instância de rollout = OBS-060 (exportador RSS/FD do kdb-gateway no s.r1.kdb-next-dev).
Summary
Telemetria (OTLP) de qualquer host em qualquer DC Koder chega ao fabric observe central (s.khost1, OBS-061067071) por um tier de collector de borda por DC que forwarda ao central sobre o Koder VPN (overlay WG privado). Não se expõe um endpoint OTLP público pra a frota própria; o ingress central fica bound só na interface do overlay.
Motivation
O fabric observe vive em s.khost1 (Vivver LAN); seus serviços (collector :4317/:4318, kdb-gateway, apm, log) são loopback-bound de propósito (superfície mínima). Mas a Koder é multi-DC: s.r1 (EVEO/Crescer LAN) e regiões futuras precisam empurrar telemetria pro central, e não há rota privada direta entre os DCs. observability-first R7.2 manda tudo em OTLP pro backend self-hosted; falta o "como cruza o DC".
Decision
Adotar a topologia OTel canônica agente → gateway com transporte privado:
- Collector de borda por DC. Cada DC roda um OTel Collector local; todos
os hostsexportadores daquele DC pusham OTLP pra ele via LANloopback (sem exposição pública dentro do DC). O edge dá buffer + retry (resiliência: telemetria sobrevive a queda do central / da rede entre DCs).
- Forward sobre o Koder VPN. O edge forwarda ao collector central por um
único canal cifrado do overlay WG. O ingress central (collector :4317/:4318) escuta só na interface do VPN — zero endpoint OTLP na internet pública.
- Um egress controlado por DC, não N hosts cada um precisando de
reachability. DC novo = +1 edge collector + 1 peer WG (padrão uniforme).
Topologia concreta (confirmada 2026-05-29)
- Hub WG = container
wgems.khost1(10.200.0.1wg0,10.0.1.131eth0;endpoint público
177.93.107.3:51820/udp; peers10.200.0.0/24—flowjá é peer10.200.0.30). Ref:reference_koder_vpn_hub. - Rollout por DC: peer WG novo → rota
10.200.0.0/24→ bridge Incus doobserveno hub.
Restrição dura — colisão de IP entre DCs (achado OBS-073, 2026-05-29): o DC Crescer (EVEO) usa
10.0.0.0/16incluindo10.0.1.0/24— o mesmo range do bridge Incus dos.khost1. Logo o endereço Incus do observe (10.0.1.27) é inalcançável de hosts Crescer (roteia pra LAN local). → O collector central DEVE ser alcançado por um endereço de overlay10.200.0.x(port-forward no containerwg:10.200.0.1:4317 → 10.0.1.27:4317, ou 2ª iface no observe), nunca pelo IP do bridge. Regra geral da arquitetura: edge → central sempre via endereço de overlay WG, nunca via IP de bridge de DC (que pode colidir).
Alternatives considered
- Ingress OTLP público (
otlp.koder.devvia Jet + TLS + mTLS/API-key).Reachability trivial de qualquer lugar, mas superfície pública permanente num dado sensível (telemetria). Rejeitado como default pra a frota própria; reservado como fallback só pra fontes que não podem entrar na VPN (host de cliente/terceiro). Mais fraco em
security.kmd(superfície mínima). - Peer WG por-host. Cada host um peer direto. Imaturo: sem buffer de borda,
N peers por DC, acoplamento à disponibilidade cross-DC. O edge-collector-por- DC é a forma certa.
- Expor o collector central em 0.0.0.0 + firewall. Frágil (depende só de
nft), ainda superfície de rede; o overlay cifrado é superior.
Rollout
Faseado, começando pela necessidade real (OBS-060 / kdb#728 S3/S4):
- s.r1 (Crescer DC) — piloto. Edge collector no container
kdb-next-dev;exportador (
koder-kdb-rssfd-exporter, já pronto) pusha pro edge emlocalhost; edge forwarda ao central via VPN. Extensão da VPN = ticketinfra/net(peer + rota; mudança de produção no hub compartilhado → deliberada, janela própria). - Demais DCs/hosts adotam o mesmo padrão sob demanda.
- Fallback público só se/quando surgir uma fonte fora-da-VPN (RFC adendo).
Consequences
- + Segurança: nenhum endpoint OTLP público pra a frota própria.
- + Resiliência (
always-on): buffer/retry no edge; central pode cair semperder telemetria.
- + Hyperscale: escala por DC, não por host.
- + Reuse/self-hosted: reusa o Koder VPN existente; nada de SaaS/ingress novo.
- − Custo operacional: um edge collector + peer WG por DC (aceito; é o preço
da superfície mínima + resiliência).
- Risco de rollout: editar o hub WG compartilhado afeta todos os peers →
mudança deliberada com verificação (não improvisar).
References
policies/observability-first.kmdR7.2/§7 (OTLP, backend self-hosted)policies/security.kmd(HTTPS-only, superfície mínima) ·policies/always-on.kmd(resiliênciamulti-região) · `policieshyperscale-first.kmd
·reuse-first.kmd·self-hosted-first.kmd`modules/observe-otlp-fabric.md(fabric central) · OBS-060 (piloto) ·reference_koder_vpn_hub