BLOG | OFFICE OF THE CTO

eBPF:可観測性がすべてです

James Hendergart サムネール
James Hendergart
Published June 14, 2022


優れたテクノロジが、実際のビジネスニーズとそのテクノロジのセールスポイントが交差する変曲点に到達することがあります。これは、そのテクノロジが単に望みを持てるものであるだけでなく、現実味があることを意味します。Linux開発者の間では、最近、Berkeley Packet Filter(BPF)がこの変曲点に達しました。BPFはLinuxホストにおけるインターセプトポイントおよび処理ポイントとして非常に効率的であり、近いうちにWindowsサーバに拡大すると見込まれています。利用可能なデータの範囲は広大で、サイト・リライアビリティ・エンジニアリング(SRE)の運用タスクに向けたフルスタックの可視性をダイレクトに強化します。当然ながら、セキュリティやトラフィック管理に関する課題の解決にも貢献します。フックの範囲も同様に広大で、BPFアプリケーションに役立つ一連のトリガーポイントが用意されており、可観測性、セキュリティ、およびネットワークの専門家にとって魅力的です。BPFは、多大な資金を費やすことなく可観測性を実現するのに最適なテクノロジです。そもそも、可観測性がなくては何も始まりません。

BPFの基本設計は、コンピューティング処理の方法も同様に効率化します(ワットあたりのコストで換算)。さらにありがたいことに、ツールチェーンがバイトコードを生成するので、低レベルのアセンブリ言語によるプログラミングではなく、望む結果を出すことに集中できます。では、どのようにしてこれを実現するのか?次の2つの設計上の特徴が、BPFを素晴らしいものにしています。

命令セットの設計

BPFのソフトウェア設計は、意図的に新興のCPUアーキテクチャをモデルにしています。実際のところ、プロセッサ用語が使用されているのは、BPFの要素および用途を正確に表現しているためです。BPFにはレジスタと命令があります。これらはCPUによって直接消費されるように設計されています。BPFは、BSD Packet Filter設計(1992年)をベースにしており、現在のレジスタベースのCPUアーキテクチャに適したパケット キャプチャ フィルタ マシンを再設計したものです。この設計は、2014年、Linuxカーネルv3.18でリリースされた「Enhanced Berkeley Packet Filter」(eBPF)によって自然に後押しされました。eBPFは、リリース直後はClassic Berkeley Packet Filter(cBPF)とは大きな区別がありました。現在では、サポートされているすべてのバージョンのカーネルに2014年の機能強化が含まれているため、この区別はそれほどでもなくなっています。注目すべき点は、レジスタ幅の拡大(32ビットから64ビットへ、つまりキャッシュライン / クロックサイクルあたりの処理量が増加)、レジスタ数の増加(2個から10個へ、つまり最新のCPUレジスタとカーネルABI間の1対1マッピングが加速)、およびBPFプログラムをより安全かつ有用なものにする追加の命令セットの機能強化などです。

リンク層

BPFは、ネットワークタップとパケットフィルターで構成されています。このタップは、パケットが回線から所定のネットワーク・インターフェイスに入ってくる際、データリンク層で動作します。BPFは、フィルタが吟味するパケットをコピーします。この挿入ポイントは、Linuxホストのネットワークパスを完全に可視化します。イングレストラフィックの場合、ホストプロセッサがトラフィックの処理を始める前に挿入ポイントを配置します。エグレストラフィックの場合、トラフィックが回線に到達してホストを離れる直前に挿入ポイントを配置します。下の図は、BPFがデータ リンク層でイングレス パケットパスと交差している様子を示しています。

イングレスパス

利用可能なデータ範囲は広大で、SREの運用タスクのフルスタック可視化に直接的に貢献します。この例では、IPv4ヘッダーから最も一般的に使用される一部のフィールドについて取り上げます。

イングレスパス

以上のデータを使用してパケット・フィルタリングをカスタマイズするポリシーを定義できます。次は、特定の宛先IPアドレスを送信先とするTCPパケットをフィルタリングするポリシーです。

イングレスパス

可観測性のためにeBPFを利用すると、BOGO(Buy one, Get one)のメリットがもたらされます。つまり、観測されたデータを観測以外の目的、例えば、トラフィックのルーティングやセキュリティに使用できます。

先ほど取り上げたデータ セットに戻ると、Linuxホストのトラフィック イングレスパスを観測するために使用されたデータ セットの一部は、他の目的にも役立ちます。例えば、送信元IP、宛先IP、宛先ホスト、およびポートは、イングレス トラフィックのルーティングだけでなくアクセス制限にも有用です。

用途にかかわらず、BPFタップによるパケットコピーがないと何も始まりません。一度コピーすると、データをメモリに保存したり(BPFマップで詳細を参照)、テレメトリストリームとしてエクスポートしたり、ポリシーとフィルタリング アクションを指定している他のBPFプログラムで同時活用したりすることができます。これが、可観測性と、トラフィック管理およびセキュリティとの分かれ道です。BPFの優れた効率性を活用するには、どのようなデータが必要で、そのデータをどのように使用するのかを明確にすることが出発点です。このシリーズの次回の投稿では、私の同僚であるMuhammad Waseem Sarwarが、Linuxネットワーク スタックのさまざまな場所におけるBPFプログラミングのためのオプションについて説明します。