Zpět na domů

eBPF NetFlow monitorování provozu bare metal K8s

Článek popisuje implementaci systému sběru statistiky NetFlow s eBPF/XDP pro bare metal, virtualizaci a Kubernetes. Jsou prozkoumány výběr BPF map (PERCPU_HASH), šardování, vzorkování s časovači. Uvedeny benchmarky a kód.

eBPF + NetFlow: telemetrie od serverů po Kubernetes
Advertisement 728x90

eBPF a NetFlow pro monitorování provozu: od bare metal až po Kubernetes

Systém založený na eBPF/XDP a NetFlow poskytuje podrobnou telemetrii síťového provozu na všech úrovních – od fyzických serverů až po Kubernetes klustery. Řeší omezení tradičních protokolů sFlow/NetFlow, jako je vysoká zátěž zařízení, vzorkování a absence vlastních polí. Provoz se zpracovává prostřednictvím jediného rozhraní v režimu router-on-a-stick, což umožňuje XDP zachytávat přicházející pakety bez úprav jádra.

eBPF spouští programy v jádře operačního systému bezpečně a s minimálními latencemi – ideálně vhodné pro monitorování v reálném čase. Statistiky se sbírají podle 5-tuple (IP adresy, porty, protokol), bajtů a paketů a exportují do formátu NetFlow pro kolektory.

Volba typu BPF map pro vysoký výkon

BPF mapy ukládají statistiku jako tabulky klíč-hodnota: klíč je 5-tuple, hodnota jsou čítače. Testování odhalilo problémy s BPF_MAP_TYPE_HASH:

Google AdInline article slot
  • Konflikty zámku při vícevláknovém přístupu z různých jader.
  • Race conditions vedou k nepřesným čítačům.

Atomické operace (__sync_fetch_and_add) odstraňují chyby, ale snižují výkon kvůli synchronizaci.

Přechod na BPF_MAP_TYPE_PERCPU_HASH vytváří samostatnou mapu pro každé jádro, eliminuje zámky. Součet probíhá v uživatelském prostoru. Benchmark na 100 jadrech s různou zátěží potvrdil převahu PERCPU map.

Při přetečení (600 tis. 5-tuple na mapu 60 tis.) použije BPF_MAP_TYPE_LRU_PERCPU_HASH starší záznamy, ale s náklady. Standardní PERCPU_HASH je preferovaný pro rychlé jednorázové čtení.

Google AdInline article slot
// Určení, do které mapy zapisovat
#define SHARD_COUNT 25 // počet shardů
map_hash_idx = ctx->rx_queue_index % SHARD_COUNT + shard_offset;

Shardování map a vícevláknový export

Jedna mapa s 10 miliony záznamů byla omezena jednovláknovým exportérem. Shardování na 25 map (podle rx_queue_index přes RSS) umožnilo paralelní čtení a zrychlilo zpracování třikrát.

Výhody shardování:

  • Měřítko: přidání map bez restartu.
  • Paralelismus: senzor čte několik map najednou.
  • Efektivita mezipaměti: malé mapy se vejdou do L1/L2 cache.

Senzor napsaný v Go (s knihovnami Cilium) využívá BPF_MAP_LOOKUP_AND_DELETE_BATCH k čtení a vyčištění map každou minutu. Minimalizuje tak ztráty dat při přetečení.

Google AdInline article slot

Vzorkování a dynamická adaptace zátěže

Pro vyvážení mezi přeposíláním a sběrem statistiky bylo implementováno vzorkování. Doplňková stats_map (BPF_MAP_TYPE_HASH, max_entries=128) počítá pakety podle shardů:

struct {
    __uint(type, BPF_MAP_TYPE_HASH);
    __uint(max_entries, 128);  // Maximální počet shardů
    __type(key, __u32);        // Číslo shardu
    __type(value, __u64);      // Čítače paketů/bajtů
    __uint(pinning, LIBBPF_PIN_BY_NAME);
} stats_map SEC(".maps");

eBPF časovače pravidelně vypočítávají rychlost (pakety/s) a aktivují vzorkování při překročení prahu na shardu. Časovače provádějí pozadí mimo kontext paketů: agregaci, reset čítačů.

Zajišťuje stabilní chování i při špičkách (DDoS) a zachovává telemetrii relací.

Přizpůsobení virtualizaci a Kubernetes

Na bare metal se schéma škáluje na virtualizaci a K8s. V klusterech se eBPF/XDP nasazuje jako DaemonSet, zachytává provoz podů přes CNI. Shardování se přizpůsobí node affinity, PERCPU_HASH se přizpůsobí vCPU.

Export NetFlow agreguje metadatové informace (namespace, IP podu), což zvyšuje viditelnost mikroservisů.

Důležité:

  • PERCPU_HASH odstraní konflikty zámku a zvýší propustnost o 2–3× oproti HASH.
  • Shardování zrychlí export třikrát díky paralelismu.
  • eBPF časovače + vzorkování vyváží zátěž bez ztráty přeposílání.
  • LRU verze vhodná pro dynamické scénáře s přetečením.
  • Go senzor s knihovnami Cilium je optimální pro vysokou zátěž při zpracování.

— Editorial Team

Advertisement 728x90

Číst dál