eBPFは何が嬉しいのか?
by
Yutaro Hayakawa
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
eBPFは何が嬉しいのか? Yutaro Hayakawa Isovalent
Slide 2
Slide 2 text
Self Introduction ● 早川侑太朗 (@YutaroHayakawa) ● Isovalent (2022 ~) ○ Ciliumの開発 (Datapathチーム) ○ マルチクラスタ (ClusterMesh), BGP, SRv6, etc… ● LINE Corporation (2019 ~ 2021) ○ 内製ロードバランサの開発・運用 ○ 大規模LBaaSの成長期に体験した二つの問題
Slide 3
Slide 3 text
No content
Slide 4
Slide 4 text
ユーザが使いたいもの なぜか話題になるやつ 実装
Slide 5
Slide 5 text
eBPFで作られていることは誰にとってどう重要か?
Slide 6
Slide 6 text
eBPFで作られていることは誰にとってどう重要か? ↓ 結局開発者にとってもユーザにとっても重要 *ポジショントーク
Slide 7
Slide 7 text
eBPFとは? Linuxカーネル拡張を書くためのプログラミングフレームワーク https://ebpf.io/what-is-ebpf
Slide 8
Slide 8 text
eBPFとは? Linuxカーネル拡張を書くためのプログラミングフレームワーク https://ebpf.io/what-is-ebpf
Slide 9
Slide 9 text
eBPFプログラミング C言語で書く (mainとかはない見慣れないC), ClangにeBPFバイトコードを吐くモードが ある
Slide 10
Slide 10 text
eBPFプログラミング ファイルが消えるたびに消されたファイルの名前と消したプロセスのPIDを出力するプロ グラム
Slide 11
Slide 11 text
eBPFとは? Linuxカーネル拡張を書くためのプログラミングフレームワーク https://ebpf.io/what-is-ebpf
Slide 12
Slide 12 text
Load コンパイラから吐かれた「ELFファイル」をbpfシステムコールに渡せる形にする工程 詳しく知りたい方は => きっと明日から役立つeBPFのしくみ 主要なローダライブラリ => libbpf (C) , cilium/ebpf (Go), libbpf-rs (Rust)
Slide 13
Slide 13 text
eBPFとは? Linuxカーネル拡張を書くためのプログラミングフレームワーク https://ebpf.io/what-is-ebpf
Slide 14
Slide 14 text
VerifierとJIT Compiler bpfシステムコールでロードされたプログラムはVerifierによって「検証」される =>「安全」でなければ実行できない 検証が通ったらほとんどの場合JITコンパイルされる => 実行前に全部ネイティブマシン命令に変換 (JSなどの動的JITとはちょっと違う) 検証が共通化できるのがeBPFバイトコードがアーキテクチャ非依存な理由
Slide 15
Slide 15 text
eBPFとは? Linuxカーネル拡張を書くためのプログラミングフレームワーク https://ebpf.io/what-is-ebpf
Slide 16
Slide 16 text
Hook / Event カーネルの中でeBPFを実行できる場所 何かしらのイベントを契機にeBPFが実行される 代表的なフック - Socket => socketに対するデータの入出力をフィルタする - Syscall => システムコールの呼び出しをトレース・フィルタ - kprobe / ftrace => カーネルの関数呼び出しなどをトレース - TC / XDP => NIC入ったパケットを書き換え・ドロップ - TCPの輻輳制御, スケジューラ, etc
Slide 17
Slide 17 text
eBPFとは? Linuxカーネル拡張を書くためのプログラミングフレームワーク https://ebpf.io/what-is-ebpf
Slide 18
Slide 18 text
eBPF Map eBPFプログラムとユーザ空間から読み書きできるデータ構造 => Hash, Array, Trie, Per-CPU Array, etc… ユーザ空間とeBPFの情報のやりとりに使える (例えるならRedisのようなもの?)
Slide 19
Slide 19 text
eBPFは何が嬉しいのか? 何か新しいことができるようになったから嬉しい? そもそも誰にとって嬉しい? ユーザにとってプロダクトがeBPFで作られているのって重要?
Slide 20
Slide 20 text
eBPFによって何か新しいことができるようになった? 技術的にはなっていない Linuxには元々「カーネルモジュール」がある カーネルモジュールもeBPFもカーネル空間で動くプログラム eBPFで実装できる機能は基本的にカーネルモジュールで作れる機能のサブセット Ciliumをカーネルモジュールベースで作ることは理論的には可能 => でもやらない
Slide 21
Slide 21 text
eBPFはそもそも誰がなんのために作ったのか? カーネル開発者にとってカーネルの開発があまりにも辛かったから必要だった
Slide 22
Slide 22 text
eBPFのオリジナルの作者 Alexei Starovoitov 現Meta, 元PRUMgridのエンジニア IOVisorというプロダクトの一部だった 開発秘話的なプレゼン: The untold story of BPF
Slide 23
Slide 23 text
カーネル (モジュール) 開発の4つのつらみ プログラミングのつらみ メンテナンスのつらみ アップストリームのつらみ デリバリのつらみ
Slide 24
Slide 24 text
カーネル開発のつらみ - プログラミング - カーネル空間は色んな意味で「安全」ではない Cプログラミングそのものの辛み (メモリ管理等) メモリアクセス違反 => マシンそのものが停止 ハング (デッドロック、無限ループ) => マシンそのものが停止 メモリリーク => 誰もリークしたメモリを回収しない セキュリティホールを作る => 権限Maxな状態で攻撃に晒される
Slide 25
Slide 25 text
カーネル開発のつらみ - メンテナンス - Linuxカーネルはカーネルモジュールに対して互換性を一切担保しない あるバージョンで動いていたモジュールは次のバージョンで動く保証がない Linuxの開発はかなり早い (9 - 10週ごとにリリース)
Slide 26
Slide 26 text
カーネル開発のつらみ - アップストリーム - パッチをアップストリームすればバージョンアップで壊れるのは防げる Linuxの開発者との交渉が必要 + レビューは厳しい あまりにも特定の会社のビジネスに拠った変更は受け入れられないケースもある
Slide 27
Slide 27 text
カーネル開発のつらみ - デリバリ - Masterに入った変更がディストリビューションカーネルに降りてくるのはいつ? ディストリビューションによっては3 - 5年かかるケースもある
Slide 28
Slide 28 text
eBPFはカーネル開発のつらみをどう解決したか? プログラミング: Verifierによる検証でプログラマのミスを未然に防ぐ メンテナンス: eBPFのプログラムに対しては後方互換性が担保されるようにした* アップストリーム: 互換性が担保されるということはアップストリームは不要 デリバリ: アップストリームしなくていいということはデリバリも即座にできる
Slide 29
Slide 29 text
カーネル開発のつらみが解消された結果どうなったか? 一般的な現場でもカーネル開発に手を出せるようになった 一般的な現場でもカーネル拡張の保守が現実的なコストでできるようになった 一般的なエンジニアから見て新しいこと(カーネル開発)ができるようになった => これが昨今の盛り上がりの一因?
Slide 30
Slide 30 text
eBPFは何が嬉しいのか? 何か新しいことができるようになったから嬉しい? => 技術的にはNoだが、一般的なエンジニアでもカーネル開発ができるようになったという 意味ではYes そもそも誰にとって嬉しい? => カーネル開発者にとっては辛いところが解消されて嬉しい ユーザにとってプロダクトがeBPFで作られているのって重要?
Slide 31
Slide 31 text
eBPFで作られているのはユーザにとって重要か? 重要だと言える カーネル開発のつらみと結局は関係している ● プログラミングの難易度が高い => バグや脆弱性が紛れ込みやすい ● 互換性が担保されない => カーネルのアップデートがリスク、メンテされなくなれば 短い期間ですぐ使えなくなってしまう ● デリバリが遅い => 欲しい機能がすぐ手に入らない
Slide 32
Slide 32 text
ケーススタディ - Falco - FalcoはなぜカーネルモジュールからeBPFベースの 実装に移行しているのか? ● Falcoのイベントコレクタはカーネールモジュー ルベースだった ● ユーザからのフィードバックとして安定性、セ キュリティ、互換性への懸念が示された ● Sysdig and Falco now powered by eBPF
Slide 33
Slide 33 text
まとめ eBPFは何が嬉しいのか? 開発者目線 ● 安全なカーネル開発ができるようになる ● カーネル拡張の保守が楽になる ● 開発・デリバリのスピードが上がる エンドユーザ目線 ● カーネル拡張の導入がより「安全」になる ● 互換性やプロダクトの持続性に対する懸念が軽減される ● 欲しい機能が素早く手に入る