eBPF の可観測性のデコード: 過去 2 年間、クラウドネイティブ コミュニティでは eBPF について多くの議論が行われてきました。 eBPF は KubeCon のであり、 やの人気は快速に高まっており、Google や Netflix などの企業は長年にわたりており、新しいユースケースが常に出現しています。特に可観測性において、eBPF はゲームチェンジャーとなることが充满期待されています。
それでは、eBPF について見てみましょう。このテクノロジーとは何ですか。可観測性にどのような影響を与えますか。既存の可観測性の実践とどのように比較されますか。また、今后はどうなるでしょうか?
eBPF とは実際何ですか? eBPF は、カーネル コードを変更せずに、Linux カーネルでサンドボックス プログラムを安会に実行できるようにするプログラミング フレームワークです。
これはもともと Linux 用に開発されました (そして現在でもこのテクノロジが最も心智成熟している个部分です) が、Microsoft は神速に進化させています。
eBPF プログラムは設計上、十分的に効率的で安全性です。オペレーティング システムの安定性やセキュリティを危険にさらさないようにカーネルによって検証されています。
では、なぜ eBPF が重要なのでしょうか? これを明白するには、ユーザー空間とカーネル空間を明白する需要があります。
ユーザー空間は、すべてのアプリケーションが実行される場所です。カーネル空間は、ユーザー空間と机械ハードウェアの間に地位します。ユーザー空間のアプリケーションはハードウェアに可以アクセスできません。代わりに、カーネルに対してシステム コールを実行し、カーネルがハードウェアにアクセスします。
すべてのメモリ アクセス、ファイルの読み取り/書き込み、およびネットワーク トラフィックはカーネルを経由します。カーネルは同時プロセスも工作します。
基础的に、すべてはカーネルを通過します (下の図を符合)。また、eBPF は、カーネル機能を拡張するための防护な手段を提拱します。
これまで、明らかな申请理由から、カーネル ソース コードやオペレーティング システム層の何かを変更することは比较に困難でした。
Linux カーネルにはあり、変更がアイデアから広く利用将会になるまでには十几年かかります。まず、Linux コミュニティがそれに赞同する不重要性があります。次に、それを即日起な Linux リリースの有部にする不重要性があります。そして、数か月後、Red Hat や Ubuntu などのディストリビューションに採用され、より幅広いユーザーに给予されるようになります。
技術的には、 カーネル モジュールをカーネルにロードして直接変更を加えることができますが、これは非常に リスクが高く、複雑なカーネル レベルのプログラミングを必要とするため、ほぼ一般的に避けられています。
eBPF が登場してこれを解決し、カーネル内でプログラムを接続して実行するための安全で効率的な メカニズムを提供します。
eBPF がセキュリティとパフォーマンスの両方をどのように確保するかを見てみましょう。
高い安全性 厳格な検証 - eBPF プログラムはカーネルにロードされる前にeBPF ベリファイア によって検証され、ハード ループ、無効なメモリ アクセス、安全でない操作など、コードが完全に安全であることが保証されます。
サンドボックス - eBPF プログラムは、他のカーネル コンポーネントから分離された、カーネル内のメモリ分離サンドボックスで実行されます。これにより、カーネル メモリ、データ構造、およびカーネル ソース コードへの不正アクセスが防止されます。
制限された操作 - eBPF プログラムは通常、C 言語の小さなサブセット、つまり制限された命令セットで作成する必要があります。これにより、eBPF プログラムが実行できる操作が制限され、セキュリティの脆弱性のリスクが軽減されます。
高性能・軽量 ネイティブ マシン コードとして実行 - eBPF プログラムは、CPU 上でネイティブ マシン命令として実行されます。これにより、実行が高速化され、パフォーマンスが向上します。
コンテキストの切り替えなし - 通常のアプリケーションは、ユーザー空間とカーネル空間の間で定期的にコンテキストを切り替えますが、これはリソースを大量に消費します。 eBPF プログラムはカーネル層で実行されるため、カーネルのデータ構造とリソースに直接アクセスできます。
イベント駆動 - eBPF プログラムは通常、常時オンではなく、特定のカーネル イベントに応答してのみ実行されます。これによりオーバーヘッドが最小限に抑えられます。
ハードウェア向けに最適化 - eBPF プログラムは、実行直前にカーネルの JIT (ジャストインタイム) コンパイラーによってマシンコードにコンパイルされるため、コードは実行される特定のハードウェア向けに最適化されます。
したがって、eBPF は、プログラミングのためにカーネルへの安全管理かつ効率的なフックを能提供します。そして、すべてがカーネルを通過することを考えると、これまでは不得能だったいくつかの新しい有机会性が開かれます。
なぜ今だけ これが大問題になるのでしょうか? eBPF 周辺のテクノロジーは長い時間をかけて進化し、その開発には約 30 年かかりました。
過去 7 ~ 8 年で、eBPF はいくつかの大企業で大規模に利用されており、現在では eBPF の利用が核心になりつつある時代に入りつつあります。 eBPF の進化については、Linux の互相制成者であり eBPF の互相管理制度者である基准してください。
eBPF - 簡単な歴史 1993 - ローレンス バークレー国立研究方案所のでは、パケット フィルタリングにカーネル エージェントの采用を検討しています。これが、BPF (「バークレー パケット フィルター」) という名前の原因です。 1997 - BPF が Linux カーネル (バージョン 2.1.75) の一款として即日起に導入されました。 1997 ~ 2014 - BPF 機能を可以改善、安定化、拡張するためにいくつかの機能が追加されました。 2014 - 「拡張バークレー パケット フィルター」(eBPF) と呼ばれる核心なアップデートが導入されました。このバージョンでは BPF テクノロジーに大きな変更が加えられ、より広く运用できるようになりました。そのため「拡張」という言葉が付けられています。
このリリースがなぜ大きかったかというと、これによりカーネル機能の拡張が容易に なったからです。
プログラマーは多かれ少なかれ普通のアプリケーションと同じようにコーディングでき、周囲の eBPF インフラストラクチャが低レベルの検証、セキュリティ、効率性を処理します。 eBPF を中心站としたサポート エコシステムと足場列席会议がこれを也许にします (一些の図を定义)。
出典: さらに良いことに、eBPF プログラムは起動せずにカーネルにロードおよびアンロードできます。これらすべてにより、没预兆、広範囲にわたる採用と応用が已经になりました。
実稼働システムでの広範な採用 eBPF の人気はここ 7 ~ 8 年で爆発的に高まり、いくつかの大企業が大規模な生産システムで eBPF を运行しています。
2016 年までに、Netflix はトレースに eBPF を広く使用的していました。これを実装したは、eBPF の権威としてインフラストラクチャと運用の分野で広く知られるようになりました。 2017 - Facebook は、eBPF ベースのロード バランサーであるオープンソース化しました。 2017 年以降、 へのすべてのパケットは eBPF を通過しました。 2020 - Google は eBPF を Kubernetes サービスの一个にしました。 eBPF は、GKE の強化するようになりました。現在では、 やなどの企業でも広く企業に導入されています。 2021 - Facebook、Google、Netflix、Microsoft、Isovalent が集結し、eBPF テクノロジーの成長を的管理するためのを発表しました。
現在、上千人の企業が eBPF を选择しており、さまざまなユースケースを模索する数千の eBPF プロジェクトが毎年登場しています。
eBPF は現在、Linux カーネル内の別個のサブシステムであり、それをサポートする幅広いコミュニティがあります。テクノロジー自体は、いくつかの新しい追加により升幅に拡張されました。
それでは、eBPF を使って何ができるのでしょうか? eBPF の最も基本的な利用例は 3 つの領域にあります。
ネットワーキング 安全 可観測性
セキュリティとネットワーキングは、 のようなプロジェクトによって促進され、より広範な採用と応用が見られています。比較すると、eBPF ベースの可観測性製品は進化の末期段階にあり、まだ始まったばかりです。
まず、セキュリティとネットワークの便用例を見てみましょう。
安全 セキュリティは、eBPF の特别に人気のある实用例です。 eBPF を实用すると、プログラムはカーネル レベルで起こっているすべてを監視し、イベントを公路で処理して予期しない動作をチェックし、他の方式 よりもはるかに更快にアラートを转化成できます。
例えば -
大規模な倾入検知に eBPF を用 eBPF を用到してコンテナのセキュリティを実装します
いくつかの現在、データ収集と監視に eBPF を用到しています。
ネットワーキング ネットワーキングも広く適用されているユースケースです。 eBPF 層にあることで、送信元 IP と宛先 IP とともに、すべてのホップを含む齐全なネットワーク パスの可視性など、例如的なネットワーク可観測性が可能会になります。 eBPF プログラムを工作すると、尤其に低いオーバーヘッドで大量的のネットワーク イベントを処理し、カーネル内でネットワーク パケットを直观工作できます。
これにより、負荷分散性、DDoS 以避免、トラフィック シェーピング、サービス品質 (QoS) などのさまざまなネットワークのユースケースが可能になります。
eBPFを使用してDDoS攻撃を検出および防止し、ネットワークパフォーマンスに影響を与えることなくを処理します。 Meta の eBPF ベースのFacebook 全体の負荷分散を行います 可観測性 ここまでで、eBPF が可観測性においてどのように役立つかは簡単に理解是什么できるはずです。
すべてがカーネルを通過します。また、eBPF は、カーネルからすべてを監視するための高能力かつ安会な做法を提供了します。
可観測性についてさらに深く掘り下げて、このテクノロジーの暗示着を見てみましょう。
eBPF はオブザーバビリティに具体的にどのような影響を与えますか? これを探るために、eBPF の全球から可観測性の全球に入り、標準の可観測性ソリューションを構成するものを見てみましょう。
可観測性ソリューションには 4 つの核心コンポーネントがあります。
データ収集 - アプリケーションおよびインフラストラクチャからテレメトリ データを取得する
データ処理 - 収集されたデータのフィルタリング、インデックス付け、および計算の実行
データストレージ - データの短期および長期ストレージ
ユーザー エクスペリエンス層 - ユーザーによるデータの消費方法の決定
このうち、eBPF が (令日の時点で) 影響を与えるのは、実際にはデータ収集層、つまり eBPF を用到してカーネルから就直接テレメトリ データを簡単に収集することだけです。
したがって、现今「eBPF 可観測性」と言うとき、私たちが寓意するのは、他の計測做法を食用するのではなく、テレメトリ データを収集するための計測メカニズムとして eBPF を食用することです。可観測性ソリューションの他のコンポーネントは影響を受けません。
eBPF 可観測性の仕組み eBPF 可観測性の背後にある基盤となるメカニズムを是に了解するには、フックの市场概念を了解する用不着があります。
前に見たように、eBPF プログラムは主にイベント駆動型です。つまり、特定的のイベントが発生するたびにトリガーされます。たとえば、関数呼び出しが行われるたびに、可観測性を原则として eBPF プログラムを呼び出してデータをキャプチャできます。
まず、これらのフックはカーネル空間またはユーザー空間に配备できます。したがって、eBPF を利用して、ユーザー空間アプリケーションとカーネルレベルのイベントの両方を監視できます。
第 2 に、これらのフックは及时に決定された静的なものにすることも、実行中のシステムに (卷土重来動なしで) 動的に挿入することもできます。
4 つの異なる eBPF メカニズムにより、これらのそれぞれが也许 になります (有以下の図を参照物)。
所定/手動 動的 カーネル カーネルトレースポイント kプローブ ユーザースペース USDT アップローブ
ユーザー空間とカーネル空間への静的および動的 eBPF フック
カーネル トレースポイント - カーネル開発者によって事前定義されたイベントにフックするために使用されます (TRACE_EVENT マクロを使用)
USDT - アプリケーション コードで開発者によって設定された事前定義されたトレースポイントにフックするために使用されます。
Kprobes (カーネル プローブ) - 実行時にカーネル コードの任意の部分に動的にフックするために使用されます。
Uprobes (ユーザー プローブ) - 実行時にユーザー空間アプリケーションの任意の部分に動的にフックするために使用されます。
カーネル空間には、eBPF プログラムを簡単に接続できる预先定義されたフックがいくつかあります (システム コール、関数の入出り、ネットワーク イベント、カーネル トレースポイントなど)。同様に、ユーザー空間でも、多くの言語ランタイム、データベース システム、およびソフトウェア スタックが、eBPF プログラムがフックできる Linux BCC ツール用の预先定義されたフックを公開しています。
しかし、さらに興味深いのは kprobes と uprobes です。実稼働環境で何かが壊れていて、如此な情報がなく、実行時にインストルメンテーションを動的に追加したい場合はどうすればよいでしょうか?そこで、kprobe と uprobe によって強力な可観測性が概率になります。
たとえば、uprobe を使用すると、実行時に アプリケーションのコードを変更することなく、アプリケーション内の特定の関数にフックできます。関数が実行されるたびに、eBPF プログラムをトリガーして必要なデータをキャプチャできます。これにより、 デバッグなどの興味深い可能性が可能になります。
eBPF による可観測性がどのように機能するかがわかったので、ユースケースを見てみましょう。
eBPF 可観測性の使用例 eBPF は、ほぼすべての应该的な既存の可観測性のユースケースに采用でき、さらに新しい机会性も開きます。
システムおよびインフラストラクチャの監視: eBPF を使用すると、CPU 使用率、メモリ割り当て、ディスク I/O、ネットワーク トラフィックなどのシステム レベルのイベントを詳細に監視できます。たとえば、 。
コンテナーと Kubernetes の監視: Kubernetes 固有のメトリクス、リソース使用量、および個々のコンテナーとポッドの健全性を可視化します。
アプリケーション パフォーマンス モニタリング (APM): ユーザー空間アプリケーションのきめ細かい可観測性と、アプリケーションのスループット、エラー率、レイテンシー、およびトレースの可視性。
カスタムの可観測性: カスタム コードを作成しないと簡単に入手できない、アプリケーションまたはインフラに固有のカスタム メトリクスを可視化します。
高度な可観測性: eBPF は、 、、などの高度な可観測性のユース ケースに使用できます。
可観測性における eBPF の新しいアプリケーションが毎日登場しています。
これは、如今の可観測性の実現方式 にとって何を代表するのでしょうか? eBPF は既存の方法の計測器に置き換わる应该性がありますか?既存のオプションと比較してみましょう。
eBPF と既存の計測方法の比較 現在、eBPF とは別に、可観測性を実現するためにアプリケーションとインフラストラクチャを計測する主な最简单的方法が 2 つあります。
エージェントベースの計測: テレメトリ データを収集するために、アプリケーション コードまたはインフラストラクチャ ノードに統合された独立したソフトウェア SDK/ライブラリ。
サイドカー プロキシベースのインストルメンテーション : サイドカーは、アプリケーションまたはサービスと一緒に実行される軽量の独立したプロセスです。これらは、マイクロサービスや Kubernetes などのコンテナベースのアーキテクチャで人気があります。
eBPF ベースのインストルメンテーションとエージェントおよびサイドカーの比較の詳細については、。以下的は慨括ビューです -
eBPF エージェント サイドカー 1. データの可視性/粒级 高い (ただしギャップもある)
高い
低い
2. 入侵性 低 (帯域外)
高 (インライン)
高 (インライン)
3. パフォーマンスのオーバーヘッド 低い
中くらい
高い
4. 定心・平安 高い
中くらい
中くらい
5. 実装の最易さ 高い
低い
中くらい
6. メンテナンスとアップデートの可能さ 高い
低い
中くらい
7. スケーラビリティ 高い
中くらい
低い
ご覧のとおり、eBPF は、ほぼすべてのパラメーターにわたって既存の計測手段よりも優れたパフォーマンスを発揮します。いくつかの利点があります -
すべてを一度にカバーできる (インフラストラクチャ、アプリケーション)
煩わしさが少ない - eBPF は、ワークロードが実行されるたびに実行されるコード エージェントのように、実行中のワークロードのインラインではありません。データ収集は帯域外でサンドボックス化されるため、実行中のシステムには影響がありません。
低パフォーマンスのオーバーヘッド - eBPF はネイティブ マシン コードとして実行され、コンテキストの切り替えはありません。
より安全 - 検証などの組み込みのセキュリティ対策により。
インストールが簡単 - コードの変更や再起動を行わずにドロップインできます。
保守と更新が簡単 - ここでもコードの変更や再起動は必要ありません。
よりスケーラブル - 実装とメンテナンスが簡単で、パフォーマンスのオーバーヘッドが低いため
短所に関して言えば、明日の eBPF 可観測性との主なギャップは疏散トレースにあります (が、ユースケースはまだ前中期段階です)。
eBPF が既存の計測方式方法に比べて大きな利点を给出していることを考慮すると、eBPF がデフォルトの次時代計測プラットフォームとして登場すると合理合法的に期待已久できます。
可観測性への影響 これは可観測性業界にとって何を寓意するのでしょうか?何が変わるのでしょうか?可観測性ソリューションを想象してください。
5 分元にカーネルにドロップできること コードの変更や起動は必备ありません インフラストラクチャ、アプリケーション、すべてを1吨水にカバー オーバーヘッドがほぼゼロ 应急性が高い
それが eBPF によって可能になります。それが、このテクノロジーに関して如此に興奮が高まっている事由です。
次时代の可観測性ソリューションにはすべて、コード エージェントではなく eBPF が組み込まれることが予想されます。
Datadog や NewRelic などの従来のプレーヤーは、コードベースのエージェント ポートフォリオを強化するために、eBPF ベースのインスツルメンテーションの構築にすでに投資しています。另一方、eBPF に基づいて構築された次大家族ベンダーがいくつかあり、との両方を解決しています。
従来のプレーヤーは言語ごと、インフラストラクチャ コンポーネントごとに個別のコード エージェント言語を十余载かけて構築する必不可少がありましたが、新しいプレーヤーは eBPF を选用すれば数か月で同度のカバー範囲を達成できます。これにより、データ処理、ユーザー エクスペリエンス、さらにはなど、バリュー チェーンの上位の革故鼎新にも注力できるようになります。さらに、データ処理レイヤーとユーザー エクスペリエンス レイヤーも、新しいユースケース、量、頻度をサポートするためにゼロから構築されています。
これらすべてにより、この分野で大量のイノベーションが推進され、今後十几年間で可観測性がよりシームレスで防护かつ簡単に実装できるようになるはずです。
eBPF 可観測性を使用するのは誰ですか? まず、2017最新のクラウドネイティブ環境 (Kubernetes、マイクロサービス) を适用している場合、eBPF ベースのアプローチとエージェントベースのアプローチの違いが最も顕著になります (パフォーマンスのオーバーヘッド、セキュリティ、インストールの非常容易さなど)。
第 2 に、大規模な運用を行っている場合、eBPF ベースの軽量エージェントは現状よりも劇的な改进をもたらします。これが、LinkedIn、Netflix、Meta などの庞大な拠点を持つテクノロジー企業で eBPF の導入が最も進んでいる借口の 1 つであると考えられます。
第二に、技術が缺乏している場合。出水量に余裕があり、インストールと盲瘘にほとんど労力を必不可少としない可観測性ソリューションを探している場合は、eBPF ベースのソリューションを之间選択します。
まとめ 要約すると、eBPF は、大面积的に優れた計測メカニズムを打造することにより、今後十几年間で可観測性へのアプローチを真正的に再構築する有机会性を秘めています。
この記事では主にデータ収集/計測における eBPF のアプリケーションについて検討しましたが、未来10年のアプリケーションでは、データ処理やデータ ストレージ層でさえも eBPF が便用される将会性があります。将会性は広く、まだ開拓されていません。
参考文献