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:
- 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í.
// 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í.
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
Zatím žádné komentáře.