Un articolo pubblicato sul blog di ebpf.io illustra in dettaglio gli ostacoli tecnici e le innovazioni ingegneristiche affrontate da Cloudflare nel corso del suo percorso di otto anni volto alla riorganizzazione della propria rete globale con eBPF.
Per superare i limiti trentennali dell’API dei socket BSD (che faticava a gestire milioni di indirizzi IP distribuiti su migliaia di server), Cloudflare ha creato il tipo di programma (program type) BPF sk_lookup. Per integrarlo nel kernel Linux principale (Linux 5.9) ci sono voluti 13 mesi, durante i quali è stato necessario superare numerose resistenze da parte della comunità, implementare il supporto SOCKMAP per UDP, adattarsi al nuovo modello di collegamento bpf_link e far evolvere la semantica dell’API attraverso oltre 10 serie di patch. Ciò ha infine reso possibile l’uso di Tubular, il loro control plane dinamico dei socket.
Il team ha individuato un raro crash in produzione, che si verificava una volta al giorno in flowtrackd, causato dal troncamento o dal danneggiamento di pacchetti TCP validi. Utilizzando ftrace e kprobes come “registratore di volo” integrato nel kernel, hanno scoperto una condizione di competizione (race condition) nel driver veth di Linux, in cui i buffer venivano riutilizzati prima che l’applicazione avesse terminato di leggerli. Hanno applicato una patch al kernel per risolvere il problema a monte.
Tubular & sk_lookup: estensione della logica di ricerca dei socket del kernel per associare i servizi a milioni di prefissi IP dinamici senza riavviare le applicazioni.
Soft-Unicast: Disaccoppiamento degli indirizzi IP dai server fisici utilizzando il bilanciatore di carico Unimog (XDP) per suddividere un singolo indirizzo IPv4 su più macchine tramite intervalli di porte.
l4drop: Gestione degli attacchi DDoS volumetrici scartando oltre 8 milioni di pacchetti al secondo su hardware standard con un overhead minimo della CPU.
udpgrm (UDP Graceful Restart Marshal): Raggiunto l’obiettivo di eseguire riavvii UDP a tempo di inattività zero collegandosi simultaneamente a sei punti di attacco BPF per gestire la generazione di più socket e l’instradamento dei cookie compatibile con QUIC.
ebpf_exporter: Collegamento tra il tracciamento dei pacchetti a livello di kernel e il tracciamento a livello di applicazione (sonde USDT di nginx) per generare span OpenTelemetry unificati in Jaeger/Tempo.
Riferimenti: https://ebpf.io/blog/cloudflare-replatforming-3/

Lascia un commento