Salta al contenuto principale

09 - eBPF Instrumentation - Low-Overhead Observability Without Code Changes

eBPF fundamentals, kernel-level tracing, zero-code instrumentation, Pixie, CO-RE, performance benefits, Kubernetes integration.

Cosa ne pensi di questo articolo?

09 - eBPF Instrumentation - Low-Overhead Observability Without Code Changes
ObservabilityFoto:Erik McleanPexels

In Breve

eBPF fundamentals, kernel-level tracing, zero-code instrumentation, Pixie, CO-RE, performance benefits, Kubernetes integration.

eBPF Instrumentation: Observability a Livello Kernel

eBPF (extended Berkeley Packet Filter) e una tecnologia del kernel Linux che permette di eseguire programmi sandbox all'interno del kernel, senza modificare il codice sorgente del kernel stesso o caricare moduli kernel. Applicata all'observability, eBPF consente di ottenere tracce distribuite, metriche di performance e visibilità di rete senza modificare il codice applicativo e senza agenti.

Mentre l'auto-instrumentation di OpenTelemetry opera a livello applicativo (intercettando le chiamate alle librerie), eBPF opera a livello kernel, intercettando le syscall, i pacchetti di rete e le operazioni su file system. Questo approccio offre un overhead inferiore e una copertura più ampia, includendo servizi che non possono essere instrumentati tradizionalmente.

Cosa Imparerai in Questo Articolo

  • I fondamenti di eBPF e come funziona nel kernel Linux
  • Come eBPF abilita l'observability zero-instrumentation
  • Pixie: observability Kubernetes basata su eBPF
  • Cilium e Hubble: networking observability con eBPF
  • Confronto tra eBPF e auto-instrumentation tradizionale
  • Limiti attuali e scenari di adozione

Come Funziona eBPF

eBPF permette di caricare piccoli programmi nel kernel Linux che vengono eseguiti in risposta a eventi specifici: syscall, arrivo di pacchetti di rete, context switch tra processi, operazioni su file system. Questi programmi sono verificati dal kernel per garantire sicurezza (nessun crash, nessun loop infinito) e vengono compilati in bytecode efficiente.

Architettura eBPF per l'Observability

Applicazione esegue una syscall (es. connect(), write()) → Kernel attiva il probe eBPF associato → Programma eBPF cattura metadata (PID, timestamp, parametri) → User-space collector legge i dati dal buffer eBPF → OTel Collector riceve e esporta verso il backend

Tipi di Probe eBPF

I programmi eBPF possono essere attaccati a diversi punti del kernel, ognuno utile per un aspetto diverso dell'observability:


// Esempio concettuale: probe eBPF per catturare connessioni TCP
// Questo programma si attacca alla syscall connect()

#include <linux/bpf.h>
#include <bpf/bpf_helpers.h>

struct connection_event {
    __u32 pid;
    __u32 tid;
    __u64 timestamp_ns;
    __u32 src_addr;
    __u32 dst_addr;
    __u16 dst_port;
    char comm[16];  // nome del processo
};

// Buffer per inviare eventi allo user-space
struct {
    __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY);
    __uint(key_size, sizeof(int));
    __uint(value_size, sizeof(int));
} events SEC(".maps");

// Probe attaccato a tcp_connect
SEC("kprobe/tcp_connect")
int trace_tcp_connect(struct pt_regs *ctx) {
    struct connection_event event = {};

    event.pid = bpf_get_current_pid_tgid() >> 32;
    event.tid = bpf_get_current_pid_tgid();
    event.timestamp_ns = bpf_ktime_get_ns();
    bpf_get_current_comm(&event.comm, sizeof(event.comm));

    // Estrarre indirizzo e porta di destinazione
    // ... (accesso alle strutture del kernel)

    // Inviare l'evento allo user-space
    bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU,
                          &event, sizeof(event));
    return 0;
}
      

Tipi di Probe per l'Observability

Tipo di Probe Punto di Attacco Uso nell'Observability
kprobe/kretprobe Funzioni del kernel Tracciare syscall (connect, read, write)
uprobe/uretprobe Funzioni user-space Tracciare chiamate a librerie (SSL, HTTP parser)
tracepoint Punti stabili del kernel Scheduling, I/O, networking
XDP Driver di rete (pre-stack) Analisi traffico ad alte prestazioni
TC (Traffic Control) Stack di rete Monitoring traffico L3/L4

Pixie: Observability Kubernetes con eBPF

Pixie (ora parte del progetto CNCF) e una piattaforma di observability per Kubernetes che usa eBPF per fornire visibilità automatica su applicazioni, rete e infrastruttura senza richiedere modifiche al codice, agent applicativi o sidecar.


# Installare Pixie su un cluster Kubernetes
# Prerequisiti: Kubernetes 1.21+, kernel Linux 4.14+

# 1. Installare la CLI di Pixie
bash -c "$(curl -fsSL https://withpixie.ai/install.sh)"

# 2. Deploy di Pixie nel cluster
px deploy

# 3. Verificare lo stato
px get viziers

# 4. Eseguire query dal terminale
# Visualizzare le connessioni HTTP tra servizi
px run px/http_data

# Latenza per endpoint
px run px/service_stats

# Traffico DNS
px run px/dns_data

# Profiling CPU (flame graph)
px run px/perf_flamegraph -- --pod=order-service
      

Pixie cattura automaticamente il traffico HTTP, gRPC, MySQL, PostgreSQL, Redis, Kafka e DNS a livello kernel, ricostruendo le richieste e calcolando latenze senza alcuna instrumentazione applicativa.

Cilium e Hubble: Network Observability

Cilium e un progetto CNCF che usa eBPF per il networking e la sicurezza in Kubernetes. Hubble, il componente di observability di Cilium, fornisce visibilità completa sul traffico di rete tra pod, incluse metriche L3/L4/L7, policy di rete e service map automatiche.


# Installare Cilium con Hubble abilitato
# helm install cilium cilium/cilium --version 1.15.0

# Configurazione Cilium con Hubble
apiVersion: v1
kind: ConfigMap
metadata:
  name: cilium-config
  namespace: kube-system
data:
  # Abilitare Hubble per observability
  enable-hubble: "true"
  hubble-listen-address: ":4244"
  hubble-metrics-server: ":9965"

  # Metriche L7 per HTTP
  hubble-metrics: >-
    dns
    drop
    tcp
    flow
    icmp
    http
    httpV2:sourceContext=workload-name|reserved-identity;destinationContext=workload-name|reserved-identity

  # Esportazione verso OpenTelemetry
  hubble-export-file-max-size-mb: "10"
  hubble-export-file-max-backups: "5"

  # Abilitare il relay per la UI
  hubble-relay-enabled: "true"
  hubble-ui-enabled: "true"
      

# Comandi Hubble per network observability

# Osservare il traffico in tempo reale
hubble observe --namespace ecommerce

# Filtrare per protocollo HTTP
hubble observe --namespace ecommerce --protocol http

# Visualizzare solo gli errori (4xx, 5xx)
hubble observe --namespace ecommerce --http-status 400-599

# Traffico tra servizi specifici
hubble observe --from-pod ecommerce/order-service \
               --to-pod ecommerce/payment-service

# Metriche per Prometheus
# Le metriche Hubble sono esposte su :9965/metrics
# e possono essere scrappate da Prometheus
      

eBPF vs Auto-Instrumentation: Confronto

eBPF e auto-instrumentation sono approcci complementari, non alternativi. Ciascuno ha punti di forza e limiti specifici che li rendono adatti a scenari diversi.

Confronto Dettagliato

Aspetto eBPF Auto-Instrumentation OTel
Modifica codice Nessuna Nessuna (agent/flag JVM)
Overhead Molto basso (kernel-level) Basso-medio (user-space)
Copertura protocolli HTTP, gRPC, DNS, SQL, Redis 100+ librerie per linguaggio
Attributi custom Limitati (solo dati di rete) Completi (span, attributi, eventi)
Contesto di business Non disponibile Disponibile con SDK manuale
Supporto OS Solo Linux (kernel 4.14+) Cross-platform
Linguaggio applicativo Agnostico (qualsiasi linguaggio) Specifico per linguaggio

Quando Usare eBPF per l'Observability

  • Visibilità di rete: monitorare traffico L3/L4/L7 tra tutti i pod di un cluster Kubernetes
  • Servizi legacy: ottenere tracce da applicazioni che non possono essere instrumentate (binari, C/C++)
  • Security monitoring: rilevare connessioni anomale, DNS tunneling, lateral movement
  • Performance profiling: CPU flame graph, I/O profiling senza overhead significativo
  • Complemento a OTel: usare eBPF per la rete e OTel per il contesto applicativo

Limiti Attuali di eBPF

Nonostante il potenziale rivoluzionario, eBPF ha limiti importanti che ne condizionano l'adozione:

  • Solo Linux: eBPF e una tecnologia del kernel Linux, non disponibile su Windows o macOS (in produzione)
  • Versione kernel: richiede kernel 4.14+ (5.8+ per le feature avanzate), limitando i sistemi legacy
  • Traffico TLS: eBPF vede i dati dopo la decryption solo con uprobe su librerie SSL, con complessità aggiuntiva
  • Nessun contesto di business: eBPF vede pacchetti e syscall, non order ID o customer tier
  • Complessità di sviluppo: scrivere programmi eBPF personalizzati richiede conoscenze del kernel

Conclusioni e Prossimi Passi

eBPF rappresenta il futuro dell'observability a basso overhead. La capacità di ottenere tracce distribuite, metriche di rete e profiling senza modificare il codice applicativo e rivoluzionaria, specialmente per cluster Kubernetes con centinaia di servizi.

L'approccio ottimale combina eBPF (per la visibilità di rete e infrastruttura) con OpenTelemetry (per il contesto applicativo e di business). Strumenti come Pixie e Cilium/Hubble rendono eBPF accessibile anche a team senza esperienza kernel.

Nel prossimo articolo esploreremo le strategie di sampling, analizzando come ridurre il volume di telemetria e i costi associati senza perdere visibilità sugli eventi critici.

Domande frequenti

Come funziona la tecnologia eBPF?

La tecnologia eBPF permette di caricare piccoli programmi nel kernel Linux che vengono eseguiti in risposta a eventi specifici, come syscall, arrivo di pacchetti di rete o operazioni su file system.

Qual è il vantaggio dell'utilizzo di eBPF rispetto all'auto-instrumentation?

L'utilizzo di eBPF offre un overhead inferiore e una copertura più ampia, inclusi servizi che non possono essere instrumentati tradizionalmente.

Come funziona la piattaforma Pixie per l'observability in Kubernetes?

La piattaforma Pixie utilizza eBPF per fornire visibilità automatica su applicazioni, rete e infrastruttura senza richiedere modifiche al codice, agenti applicativi o sidecar.

Qual è il limite principale dell'utilizzo di eBPF?

Il limite principale dell'utilizzo di eBPF è la necessità di avere esperienza kernel per configurare e utilizzare correttamente i programmi eBPF.

Fonti e approfondimenti

Commenti

Caricamento commenti...

Accedi per commentare

Discuti questo articolo nella community

Unisciti al gruppo Telegram per discutere con altri sviluppatori, fare domande e condividere le tue esperienze.

Ti è piaciuto questo articolo?

Esplora altri contenuti sul blog o scopri i miei progetti