eBPF ist ein Programmierframework, das es uns ermöglicht, Sandbox-Programme sicher im Linux-Kernel auszuführen, ohne den Kernel-Code zu ändern. eBPF-Programme sind von Natur aus äußerst effizient und sicher – sie werden vom Kernel überprüft, um sicherzustellen, dass sie die Stabilität oder Sicherheit des Betriebssystems nicht gefährden. Es wurde ursprünglich für Linux entwickelt (und dort ist die Technologie auch heute noch am ausgereiftesten)
Dekodierung der eBPF-Beobachtbarkeit:
In den letzten zwei Jahren wurde in Cloud-nativen Communities viel über eBPF geredet. eBPF war eine auf der KubeCon, und erfreuen sich immer größerer Beliebtheit, Unternehmen wie Google und Netflix seit Jahren und es entstehen ständig neue Anwendungsfälle. Insbesondere im Bereich der Beobachtbarkeit wird erwartet, dass eBPF bahnbrechend sein wird.
Schauen wir uns also eBPF an – was ist die Technologie, wie wirkt sie sich auf die Beobachtbarkeit aus, wie schneidet sie im Vergleich zu bestehenden Beobachtbarkeitspraktiken ab und was könnte die Zukunft bringen?
Was ist eBPF wirklich?
eBPF ist ein Programmierframework, das es uns ermöglicht, Sandbox-Programme sicher im Linux-Kernel auszuführen, ohne den Kernel-Code zu ändern.
Es wurde ursprünglich für Linux entwickelt (und dort ist die Technologie auch heute noch am ausgereiftesten), aber Microsoft entwickelt die rasant weiter.
eBPF-Programme sind von Natur aus äußerst effizient und sicher – sie werden vom Kernel überprüft, um sicherzustellen, dass sie die Stabilität oder Sicherheit des Betriebssystems nicht gefährden.
Warum ist eBPF also eine große Sache?
Um dies zu verstehen, müssen wir den Benutzerraum und den Kernelraum verstehen.
Im Benutzerbereich werden alle Anwendungen ausgeführt. Der Kernel-Space liegt zwischen dem User-Space und der physischen Hardware. Anwendungen im Benutzerbereich können nicht direkt auf Hardware zugreifen. Stattdessen führen sie Systemaufrufe an den Kernel durch, der dann auf die Hardware zugreift.
Der gesamte Speicherzugriff, das Lesen/Schreiben von Dateien und der Netzwerkverkehr laufen über den Kernel. Der Kernel verwaltet auch gleichzeitige Prozesse.
Grundsätzlich läuft alles über den Kernel (siehe Abbildung unten). Und eBPF bietet eine sichere Möglichkeit, die Kernel-Funktionalität zu erweitern.
Historisch gesehen war es aus offensichtlichen Gründen sehr schwierig, irgendetwas im Kernel-Quellcode oder auf der Betriebssystemebene zu ändern.
Der Linux-Kernel verfügt über und es dauert mehrere Jahre, bis eine Änderung von der Idee zur breiten Verfügbarkeit gelangt. Zunächst muss die Linux-Community dem zustimmen. Dann muss es Teil der offiziellen Linux-Version werden. Dann, nach ein paar Monaten, wird es von Distributionen wie Red Hat und Ubuntu aufgegriffen, die es einem breiteren Publikum zugänglich machen.
Technisch gesehen könnte man Kernel-Module in den eigenen Kernel laden und direkt Änderungen vornehmen, aber das birgt ein sehr hohes Risiko und erfordert eine komplexe Programmierung auf Kernel-Ebene und wird daher fast überall vermieden.
eBPF löst dieses Problem und bietet einen sicheren und effizienten Mechanismus zum Anhängen und Ausführen von Programmen im Kernel.
Schauen wir uns an, wie eBPF sowohl Sicherheit als auch Leistung gewährleistet.
Hochsicher
Strenge Überprüfung – Bevor ein eBPF-Programm in einen Kernel geladen werden kann, wird es durch den eBPF-Verifizierer überprüft, der sicherstellt, dass der Code absolut sicher ist – z. B. keine harten Schleifen, ungültigen Speicherzugriff, unsichere Vorgänge.
Sandboxed – eBPF-Programme werden in einer speicherisolierten Sandbox innerhalb des Kernels ausgeführt, getrennt von anderen Kernelkomponenten. Dies verhindert unbefugten Zugriff auf den Kernel-Speicher, die Datenstrukturen und den Kernel-Quellcode.
Begrenzte Operationen – eBPF-Programme müssen normalerweise in einer kleinen Teilmenge der C-Sprache geschrieben werden – einem eingeschränkten Befehlssatz. Dies schränkt die Vorgänge ein, die eBPF-Programme ausführen können, und verringert so das Risiko von Sicherheitslücken.
Leistungsstark / leicht
Als nativen Maschinencode ausführen – eBPF-Programme werden als native Maschinenanweisungen auf der CPU ausgeführt. Dies führt zu einer schnelleren Ausführung und einer besseren Leistung.
Keine Kontextwechsel – Eine reguläre Anwendung wechselt regelmäßig zwischen User-Space und Kernel-Space, was ressourcenintensiv ist. eBPF-Programme können, da sie in der Kernel-Schicht ausgeführt werden, direkt auf Kernel-Datenstrukturen und -Ressourcen zugreifen.
Ereignisgesteuert – eBPF-Programme werden normalerweise nur als Reaktion auf bestimmte Kernel-Ereignisse ausgeführt und sind nicht ständig aktiv. Dadurch wird der Overhead minimiert.
Optimiert für Hardware – eBPF-Programme werden vom JIT-Compiler (Just-In-Time) des Kernels unmittelbar vor der Ausführung in Maschinencode kompiliert, sodass der Code für die spezifische Hardware optimiert ist, auf der er ausgeführt wird.
Daher bietet eBPF einen sicheren und effizienten Einstieg in den Kernel für die Programmierung. Und da alles über den Kernel läuft, eröffnet dies mehrere neue Möglichkeiten, die bisher nicht möglich waren.
Warum ist das erst jetzt eine große Sache?
Die Technologie rund um eBPF hat sich über einen langen Zeitraum hinweg weiterentwickelt und ist seit etwa 30 Jahren in der Entwicklung.
In den letzten 7 bis 8 Jahren wurde eBPF in großem Umfang von mehreren großen Unternehmen eingesetzt, und jetzt treten wir in eine Ära ein, in der der Einsatz von eBPF zum Mainstream wird. Sehen Sie sich , dem Mitschöpfer von Linux und Mitbetreuer von eBPF, über die Entwicklung von eBPF an.
eBPF – eine kurze Geschichte
1993 – In einem des Lawrence Berkeley National Lab wird die Verwendung eines Kernel-Agenten zur Paketfilterung untersucht. Daher kommt auch der Name BPF („Berkeley Packet Filter“).
1997 – BPF wird offiziell als Teil des Linux-Kernels eingeführt (Version 2.1.75).
1997–2014 – Mehrere Funktionen werden hinzugefügt, um die BPF-Funktionen zu verbessern, zu stabilisieren und zu erweitern.
2014 – Ein bedeutendes Update namens „Extended Berkeley Packet Filter“ (eBPF) wird eingeführt. Diese Version nimmt große Änderungen an der BPF-Technologie vor und macht sie breiter einsetzbar – daher das Wort „erweitert“.
Der Grund für die große Größe dieser Version war, dass sie die Erweiterung der Kernel-Funktionalität vereinfachte .
Ein Programmierer könnte mehr oder weniger wie eine normale Anwendung programmieren – und die umgebende eBPF-Infrastruktur kümmert sich um die Überprüfung, Sicherheit und Effizienz auf niedriger Ebene. Ein komplettes unterstützendes Ökosystem und ein Gerüst rund um eBPF machen dies möglich (siehe Abbildung unten).
Quelle: Noch besser: eBPF-Programme konnten ohne Neustarts aus dem Kernel geladen und entladen werden. All dies ermöglichte plötzlich eine weitverbreitete Übernahme und Anwendung.
Weit verbreitete Übernahme in Produktionssystemen
Die Beliebtheit von eBPF ist in den letzten 7 bis 8 Jahren explosionsartig gestiegen, da mehrere große Unternehmen es in Massenproduktionssystemen einsetzen.
Bis 2016 nutzte Netflix eBPF in großem Umfang zur Nachverfolgung. , der es implementiert hat, wurde in Infrastruktur- und Betriebskreisen weithin als Experte für eBPF bekannt.
2017 – Facebook stellt , seinen eBPF-basierten Load Balancer, als Open-Source-Lösung zur Verfügung. Jedes einzelne Paket an seit 2017 hat eBPF durchlaufen.
2020 – Google hat eBPF zu einem Teil seines Kubernetes-Angebots gemacht. eBPF unterstützt jetzt die von GKE. Mittlerweile gibt es auch eine breite Unternehmensakzeptanz bei Unternehmen wie und .
2021 – Facebook, Google, Netflix, Microsoft und Isovalent haben sich zusammengeschlossen, um die anzukündigen, um das Wachstum der eBPF-Technologie zu verwalten.
Mittlerweile nutzen Tausende von Unternehmen eBPF und jedes Jahr entstehen Hunderte von eBPF-Projekten, die verschiedene Anwendungsfälle untersuchen.
eBPF ist jetzt ein separates Subsystem innerhalb des Linux-Kernels und wird von einer breiten Community unterstützt. Die Technologie selbst wurde durch mehrere Neuzugänge erheblich erweitert.
Was können wir also mit eBPF machen?
Die häufigsten Anwendungsfälle für eBPF liegen in drei Bereichen:
Vernetzung
Sicherheit
Beobachtbarkeit
Sicherheit und Netzwerke haben eine breitere Akzeptanz und Anwendung erfahren, vorangetrieben durch Projekte wie . Im Vergleich dazu befinden sich eBPF-basierte Observability-Angebote in einem frühen Entwicklungsstadium und stehen gerade erst am Anfang.
Schauen wir uns zunächst die Anwendungsfälle in den Bereichen Sicherheit und Netzwerk an.
Sicherheit
Sicherheit ist ein sehr beliebter Anwendungsfall für eBPF. Mit eBPF können Programme alles beobachten, was auf Kernel-Ebene passiert, Ereignisse mit hoher Geschwindigkeit verarbeiten, um auf unerwartetes Verhalten zu prüfen, und Warnungen viel schneller auslösen als sonst.
Zum Beispiel -
verwendet eBPF zur Erkennung von Eindringlingen in großem Maßstab
verwendet eBPF, um Containersicherheit zu implementieren
Mehrere verwenden mittlerweile eBPF zur Datenerfassung und -überwachung.
Vernetzung
Vernetzung ist ein weiterer weit verbreiteter Anwendungsfall. Die Lage auf der eBPF-Ebene ermöglicht eine umfassende Beobachtbarkeit des Netzwerks, z. B. Einblick in den gesamten Netzwerkpfad einschließlich aller Hops sowie der Quell- und Ziel-IP. Mit eBPF-Programmen kann man umfangreiche Netzwerkereignisse verarbeiten und Netzwerkpakete direkt im Kernel mit sehr geringem Overhead manipulieren.
Dies ermöglicht verschiedene Netzwerkanwendungsfälle wie Lastausgleich, DDoS-Prävention, Traffic Shaping und Quality of Service (QoS).
nutzt eBPF, um DDoS-Angriffe zu erkennen und zu verhindern, und verarbeitet , ohne die Netzwerkleistung zu beeinträchtigen.
Metas eBPF-basierter übernimmt den Lastausgleich für ganz Facebook
Beobachtbarkeit
Jetzt muss klar sein, wie eBPF für die Observability nützlich sein kann.
Alles läuft durch den Kernel. Und eBPF bietet eine hochleistungsfähige und sichere Möglichkeit, alles vom Kernel aus zu beobachten.
Lassen Sie uns tiefer in die Beobachtbarkeit eintauchen und die Auswirkungen dieser Technologie betrachten.
Wie genau wirkt sich eBPF auf die Beobachtbarkeit aus?
Um dies zu untersuchen, verlassen wir das eBPF-Universum und betreten das Observability-Universum und schauen uns an, was unsere Standard-Observability-Lösung ausmacht.
Jede Observability-Lösung besteht aus vier Hauptkomponenten:
Datenerfassung – Abrufen von Telemetriedaten aus Anwendungen und Infrastruktur
Datenverarbeitung – Filtern, Indizieren und Durchführen von Berechnungen für die gesammelten Daten
Datenspeicherung – Kurz- und Langzeitspeicherung von Daten
Benutzererfahrungsschicht – Bestimmen, wie Daten vom Benutzer verbraucht werden
Davon hat eBPF (Stand heute) eigentlich nur die Datenerfassungsschicht betroffen – das einfache Sammeln von Telemetriedaten direkt vom Kernel mithilfe von eBPF.
Wenn wir heute von „eBPF-Beobachtbarkeit“ sprechen, meinen wir also die Verwendung von eBPF als Instrumentierungsmechanismus zum Sammeln von Telemetriedaten, anstatt andere Instrumentierungsmethoden zu verwenden. Andere Komponenten einer Observability-Lösung bleiben davon unberührt.
Wie eBPF Observability funktioniert
Um die zugrunde liegenden Mechanismen der eBPF-Beobachtbarkeit vollständig zu verstehen, müssen wir das Konzept der Hooks verstehen.
Wie wir bereits gesehen haben, sind eBPF-Programme in erster Linie ereignisgesteuert – das heißt, sie werden immer dann ausgelöst, wenn ein bestimmtes Ereignis eintritt. Beispielsweise kann jedes Mal, wenn ein Funktionsaufruf erfolgt, ein eBPF-Programm aufgerufen werden, um einige Daten für Beobachtbarkeitszwecke zu erfassen.
Erstens können sich diese Hooks im Kernel-Space oder im User-Space befinden. Daher kann eBPF zur Überwachung sowohl von User-Space-Anwendungen als auch von Ereignissen auf Kernel-Ebene verwendet werden.
Zweitens können diese Hooks entweder vorab festgelegt/statisch sein oder dynamisch in ein laufendes System eingefügt werden (ohne Neustarts!)
Vier unterschiedliche eBPF-Mechanismen ermöglichen dies jeweils (siehe Abbildung unten).
Vorgegeben/manuell
Dynamisch
Kernel
Kernel-Tracepoints
kprobes
Benutzerbereich
USDT
Uroben
Statisches und dynamisches eBPF bindet sich in den User-Space und den Kernel-Space ein
Kernel-Tracepoints – werden zum Einbinden in von Kernel-Entwicklern vordefinierte Ereignisse verwendet (mit TRACE_EVENT-Makros)
USDT – wird zum Einbinden in vordefinierte Tracepoints verwendet, die von Entwicklern im Anwendungscode festgelegt wurden
Kprobes (Kernel Probes) – werden zur dynamischen Einbindung in beliebige Teile des Kernel-Codes zur Laufzeit verwendet
Uprobes (User Probes) – werden zur dynamischen Einbindung in jeden Teil einer User-Space-Anwendung zur Laufzeit verwendet
Es gibt mehrere vordefinierte Hooks im Kernel-Bereich, an die man problemlos ein eBPF-Programm anhängen kann (z. B. Systemaufrufe, Funktionseintritt/-ausgang, Netzwerkereignisse, Kernel-Tracepoints). Ebenso stellen im Benutzerbereich viele Sprachlaufzeiten, Datenbanksysteme und Software-Stacks vordefinierte Hooks für Linux-BCC-Tools bereit, in die sich eBPF-Programme einklinken können.
Aber was noch interessanter ist, sind kprobes und uprobes. Was passiert, wenn in der Produktion etwas kaputt geht und ich nicht über ausreichende Informationen verfüge und Instrumentierung zur Laufzeit dynamisch hinzufügen möchte? Hier ermöglichen kprobes und uprobes eine leistungsstarke Beobachtbarkeit.
Mithilfe von Uprobes kann man sich beispielsweise zur Laufzeit in eine bestimmte Funktion innerhalb einer Anwendung einklinken, ohne den Code der Anwendung zu ändern. Immer wenn die Funktion ausgeführt wird, kann ein eBPF-Programm ausgelöst werden, um die erforderlichen Daten zu erfassen. Dies ermöglicht spannende Möglichkeiten wie Debugging.
Nachdem wir nun wissen, wie Beobachtbarkeit mit eBPF funktioniert, schauen wir uns Anwendungsfälle an.
Anwendungsfälle für eBPF-Beobachtbarkeit
eBPF kann für nahezu alle gängigen Observability-Anwendungsfälle eingesetzt werden und eröffnet darüber hinaus neue Möglichkeiten.
System- und Infrastrukturüberwachung: eBPF ermöglicht eine umfassende Überwachung von Ereignissen auf Systemebene wie CPU-Auslastung, Speicherzuweisung, Festplatten-E/A und Netzwerkverkehr. .
Container- und Kubernetes-Überwachung: Einblick in Kubernetes-spezifische Metriken, Ressourcennutzung und Zustand einzelner Container und Pods.
Application Performance Monitoring (APM): Detaillierte Beobachtbarkeit von User-Space-Anwendungen und Einblick in Anwendungsdurchsatz, Fehlerraten, Latenz und Traces.
Benutzerdefinierte Beobachtbarkeit: Einblick in benutzerdefinierte Metriken, die für Anwendungen oder Infrastruktur spezifisch sind und ohne das Schreiben von benutzerdefiniertem Code möglicherweise nicht einfach verfügbar sind.
Erweiterte Observability: eBPF kann für erweiterte Observability-Anwendungsfälle wie , und verwendet werden.
Täglich entstehen neue Anwendungen von eBPF im Bereich Observability.
Was bedeutet das für die heutige Beobachtbarkeit? Wird eBPF wahrscheinlich bestehende Formen der Instrumentierung ersetzen? Vergleichen wir mit bestehenden Optionen.
eBPF im Vergleich zu bestehenden Instrumentierungsmethoden
Heutzutage gibt es neben eBPF vor allem zwei Möglichkeiten, Anwendungen und Infrastruktur für Observability zu instrumentieren.
Agentenbasierte Instrumentierung: Unabhängige Software-SDKs/-Bibliotheken, die in Anwendungscode oder Infrastrukturknoten integriert sind, um Telemetriedaten zu sammeln.
Sidecar-Proxy-basierte Instrumentierung : Sidecars sind leichte, unabhängige Prozesse, die neben einer Anwendung oder einem Dienst ausgeführt werden. Sie sind in Microservices und Container-basierten Architekturen wie Kubernetes beliebt.
Einen detaillierten Vergleich der eBPF-basierten Instrumentierung im Vergleich zu Agenten und Sidecars . Nachfolgend finden Sie eine zusammenfassende Ansicht:
eBPF
Agenten
Beiwagen
1. Datensichtbarkeit/Granualität
Hoch (aber einige Lücken)
Hoch
Niedrig
2. Aufdringlichkeit
Niedrig (außerhalb des Bandes)
Hoch (inline)
Hoch (inline)
3. Leistungsaufwand
Niedrig
Mittel
Hoch
4. Sicherheit und Schutz
Hoch
Mittel
Mittel
5. Einfache Implementierung
Hoch
Niedrig
Mittel
6. Einfache Wartung und Updates
Hoch
Niedrig
Mittel
7. Skalierbarkeit
Hoch
Mittel
Niedrig
Wie wir sehen können, übertrifft eBPF bestehende Instrumentierungsmethoden in nahezu allen Parametern. Es gibt mehrere Vorteile –
Kann alles auf einmal abdecken (Infrastruktur, Anwendungen)
Weniger aufdringlich – eBPF ist nicht in laufende Arbeitslasten integriert, wie Code-Agenten, die jedes Mal ausgeführt werden, wenn die Arbeitslast ausgeführt wird. Die Datenerfassung erfolgt Out-of-Band und Sandboxing, sodass es keine Auswirkungen auf ein laufendes System gibt.
Geringer Leistungsaufwand – eBPF wird als nativer Maschinencode ausgeführt und es findet kein Kontextwechsel statt.
Sicherer – aufgrund integrierter Sicherheitsmaßnahmen wie der Verifizierung.
Einfach zu installieren – kann ohne Code-Änderung oder Neustart eingesetzt werden.
Einfache Wartung und Aktualisierung – auch hier keine Codeänderung und Neustarts.
Besser skalierbar – dank einfacher Implementierung und Wartung sowie geringem Leistungsaufwand
Was die Nachteile betrifft, besteht die größte Lücke bei der heutigen eBPF-Beobachtbarkeit in der verteilten Ablaufverfolgung ( , aber der Anwendungsfall befindet sich noch in einem frühen Stadium).
Insgesamt können wir angesichts der erheblichen Vorteile, die eBPF gegenüber bestehenden Instrumentierungsmethoden bietet, vernünftigerweise davon ausgehen, dass eBPF zur Standard-Instrumentierungsplattform der nächsten Generation werden wird.
Implikationen für die Beobachtbarkeit
Was bedeutet das für die Observability-Branche? Was ändert sich? Stellen Sie sich eine Observability-Lösung vor:
dass Sie in 5 Minuten in den Kernel einsteigen können
Keine Codeänderung oder Neustarts
deckt alles auf einmal ab – Infrastruktur, Anwendungen, alles
hat einen Overhead von nahezu Null
ist sehr sicher
Genau das macht eBPF möglich. Und das ist der Grund, warum die Technologie so viel Aufregung hervorruft.
Wir können davon ausgehen, dass die nächste Generation von Observability-Lösungen alle mit eBPF statt mit Code-Agenten ausgestattet sein wird.
Traditionelle Akteure wie Datadog und NewRelic investieren bereits in den Aufbau einer eBPF-basierten Instrumentierung, um ihr codebasiertes Agentenportfolio zu erweitern. Mittlerweile gibt es mehrere Anbieter der nächsten Generation, die auf eBPF basieren und sowohl als auch lösen.
Während herkömmliche Anbieter über mehrere Jahre hinweg einzelne Code-Agenten Sprache für Sprache und für jede Infrastrukturkomponente erstellen mussten, können neue Anbieter mit eBPF in wenigen Monaten den gleichen Abdeckungsgrad erreichen. Dadurch können sie sich auch auf Innovationen weiter oben in der Wertschöpfungskette konzentrieren, wie z. B. Datenverarbeitung, Benutzererfahrung und sogar . Darüber hinaus sind ihre Datenverarbeitungs- und Benutzererfahrungsebenen ebenfalls von Grund auf aufgebaut, um die neuen Anwendungsfälle, Volumina und Häufigkeiten zu unterstützen.
All dies dürfte eine große Menge an Innovationen in diesem Bereich vorantreiben und Observability in den kommenden Jahren nahtloser, sicherer und einfacher umsetzbar machen.
Wer sollte eBPF-Observability nutzen?
Erstens: Wenn Sie sich in einer modernen Cloud-nativen Umgebung (Kubernetes, Microservices) befinden, sind die Unterschiede zwischen eBPF-basierten und agentenbasierten Ansätzen am deutlichsten sichtbar (Leistungsaufwand, Sicherheit, einfache Installation usw.).
Zweitens: Wenn Sie in großem Maßstab tätig sind, werden eBPF-basierte, leichtgewichtige Agenten zu dramatischen Verbesserungen gegenüber dem Status Quo führen. Dies ist wahrscheinlich einer der Gründe, warum die eBPF-Akzeptanz bei Technologieunternehmen mit großer Präsenz wie LinkedIn, Netflix und Meta am höchsten ist.
Drittens, wenn Ihnen die Technik fehlt. Kapazität haben und nach einer Observability-Lösung suchen, deren Installation und Wartung nahezu keinen Aufwand erfordert, dann entscheiden Sie sich direkt für eine eBPF-basierte Lösung.
Zusammenfassung
Zusammenfassend lässt sich sagen, dass eBPF durch die Bereitstellung eines deutlich besseren Instrumentierungsmechanismus das Potenzial hat, unseren Ansatz zur Beobachtbarkeit in den kommenden Jahren grundlegend zu verändern.
Während wir in diesem Artikel hauptsächlich die Anwendung von eBPF in der Datenerfassung/-instrumentierung untersucht haben, könnte eBPF in zukünftigen Anwendungen in Datenverarbeitungs- oder sogar Datenspeicherungsebenen zum Einsatz kommen. Die Möglichkeiten sind vielfältig und noch unerforscht.