Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Ciliumはどうテストされているのか
Search
Yutaro Hayakawa
May 30, 2025
1
140
Ciliumはどうテストされているのか
eBPF Japan Meetup #4 2025/05/30
Yutaro Hayakawa
May 30, 2025
Tweet
Share
More Decks by Yutaro Hayakawa
See All by Yutaro Hayakawa
How is Cilium Tested?
yutarohayakawa
5
490
eBPFのこれまでとこれから
yutarohayakawa
25
6.7k
NetKit Device
yutarohayakawa
4
1.1k
eBPFは何が嬉しいのか?
yutarohayakawa
3
2k
BufferbloatとLinux
yutarohayakawa
5
1.4k
Prism: Proxies without the Pain
yutarohayakawa
0
250
ipftrace: A Linux Function Tracer for Network People
yutarohayakawa
4
5.9k
きっと明日から役立つeBPFのしくみ
yutarohayakawa
9
4.4k
eBPFをFreeBSDにポーティングしようとしている話
yutarohayakawa
4
3.2k
Featured
See All Featured
Side Projects
sachag
455
42k
Code Reviewing Like a Champion
maltzj
524
40k
Art, The Web, and Tiny UX
lynnandtonic
299
21k
Designing for humans not robots
tammielis
253
25k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.9k
Producing Creativity
orderedlist
PRO
346
40k
Building Flexible Design Systems
yeseniaperezcruz
328
39k
Mobile First: as difficult as doing things right
swwweet
223
9.7k
A Modern Web Designer's Workflow
chriscoyier
695
190k
Music & Morning Musume
bryan
46
6.6k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.5k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
960
Transcript
Ciliumはどうテストされているのか? Isovalent at Cisco 早川侑太朗 (@YutaroHayakawa) @eBPF Japan Meetup 2025/05/30
1
発表の主旨 • Ciliumを例にeBPFを使った (ネットワーク系の) プロダクトのテストの考え方, 苦労話, ノウハウを共有する • eBPF固有のテストの難しさに焦点を当てていきたい 2
Ciliumとは? 3 • Kubernetesのネットワークプラグイン (CNI) • Pod間通信, LB (Service), FW
(NetworkPolicy) • Data Plane部分の実装にeBPFを使っている
Ciliumがやっていること 4 Node (Linux) Agent Node (Linux) Agent Node (Linux)
Agent Data Plane (Linux/eBPF) Data Plane (Linux/eBPF) Data Plane (Linux/eBPF) 1. K8s APIにある設定をとってくる 2. APIの設定に応じたData Planeの設定をする 3. パケットが通る 4. 1. に戻る
どうテストする? • K8s API -> Agentのテスト ◦ AgentはGoで書かれているので一般的なGoのテスト ◦ K8s
APIのモック等の問題はあるが概ねテストの方法論が 確立された分野 ◦ 今回はスコープ外 5 Node (Linux) Agent Data Plane (Linux/eBPF)
どうテストする? • Agent -> Linux Kernelの部分のテスト ◦ 依然としてGoだが、Linuxカーネルとのやりとりあり ◦ 特権テストのためのツール整備
◦ テスト環境の分離 (e.g. netns) 6 Node (Linux) Agent Data Plane (Linux/eBPF)
どうテストする? • Data Planeのテストの難しいところ ◦ eBPF (CGroup, TC, XDP), Linuxカーネルスタック,
ユーザスペースの透過プロキシの組み合わせで作られている ◦ これらが一気通貫で動いて初めて 「正しい」 • これに対して単体テストをあまり書かずにE2Eに頼ってきた ◦ K8sクラスタを立てて実際にトラフィックを流す ◦ ユーザの動きに近いので安心感がある ◦ なるべく数を減らす努力をしているがなかなか無くせない 7 Node (Linux) Agent Data Plane (Linux/eBPF)
E2Eテストの問題点: Flakyなテストができがち • テストがFlakyになりがち ◦ E2Eテストは動いているものが多いので様々な要因で失敗する ▪ CI環境の問題 ▪ 確率的に発現するバグ
◦ 失敗の原因を突き止めるのが非常に難しい ▪ Ciliumは非常にたくさんのgoroutine (手元では381あった) が並行・並列に動く ▪ 動きは全く決定的ではないのでRace Conditionなどは起きやすいし見逃しやすい 8
なぜE2Eテストのケースが減らせないのか • Ciliumは多機能な上にサポートしている動作環境が多い ◦ 機能の組み合わせ * 動作環境 • Linuxカーネルのバージョン ◦
ディストリビューション固有カーネル (RHELカーネルなど), LTSカーネル数バージョン • Kubernetesのバージョン ◦ アップストリームのバージョン3つ ◦ クラウドの固有環境 (GKE, EKS, AKS, etc...) • Cilium自身のバージョン ◦ Upgrade/Downgradeテスト • 最新のUpgrade/DowngradeテストはMatrixの数が33 • 時間的にも経済的にも (CloudやGHAの使用料) コストが高い 9
Linuxカーネルバージョンごとのテストはなぜ必要なのか? • 基本的にLinuxは互換性を壊さない(?)のになぜテストするのか? ◦ 新しいカーネルのバージョンにしかない機能を使う場合は新旧カーネルでテストしたいこともある • Linuxのリグレッションは普通に起こる ◦ Verifierへの変更等によってLoadできていたプログラムができなくなることがたまにある ◦
Network Stack側のリグレッションもありえる ▪ 過去にはデバイスドライバやNetfilterのリグレッションもあった • カーネルコミュニティに対してフィードバックをすることも大事 ◦ カーネルがリリースされる前に問題を発見するためにbpf-nextツリーのカーネルもテストしている ◦ 発見した問題はカーネルチームが直接修正するかフィードバックする ◦ 場合によってはディストリビューションカーネルにバックポートを依頼することも 10
テスト改善の取り組み: Unit Testの拡充 • 一般的なテストの原則に忠実に ◦ Unit Testなどの小規模で早いテストを充実させてそこでバグを拾えるようにする ◦ 開発者がテストを積極的に書きやすくするような工夫も必要
11
BPF_PROG_TEST_RUN • bpf(2)の機能でLoadしたeBPFのプログラム をAttachせずに実行できる (ref) ◦ まさにeBPFの単体テストのために作られた機能 • そのままでも使えるが, ちょっとテスト走らせるま
での手続きが面倒くさい ◦ Goでパケット作ったりパースしたり ◦ eBPFプログラムをロードしたり ◦ もう少しテストを書くのに専念したい 12 eBPF Program Test Runner In Pkt Out Pkt bpf(BPF_PROG_TEST_RUN) User Kernel
eBPF Unit Test Framework • eBPFの単体テストを書くための自作フレームワーク (ref) • BPF_PROG_TEST_RUNを使うが、eBPFのコードのみで テストを書き切ることができる
• PKGENのコードの中でパケット (skb) を作る • SETUPで実際のコードにskbを通す • CHECKで出力が意図通りか確認する ◦ ちゃんとNATされたか, 返り値 (PASS, DROP, REDIRECT) が意図通りか等 13 PKTGEN Program Test Runner Empty InPkt SETUP Program InPkt OutPkt CHECK Program OutPkt Result bpf(BPF_PROG_TEST_RUN) 開発者が書くところ
テスト改善の取り組み: Ciliumのモジュール化 • Ciliumの必要なSubsetだけを切り出してテストしたりできるようにする ◦ モジュール間の依存関係をなるべく減らす ◦ モックのしやすさなども含めたコードの改善 14
Hive/Cell Dependency Injection Framework • DIフレームワーク (cilium/hive) ◦ Go向けのいわゆるConstructor Injection
◦ Hive == DIコンテナ, Cell == Constructor (蜂の巣) ◦ Cilium AgentはHiveを中心にしたモジュラーモノリス構造 • モジュール間の依存解決や初期化をDI任せにできる ◦ テストに必要なCiliumのSubsetだけを集めてテストすることが比較的 容易にできる ◦ K8s APIやLinux Kernelのモックなども容易に 15 https://en.wikipedia.org/wiki/Beehive
テスト改善の取り組み: E2Eテストの改善 • E2Eテストを完全になくすのは難しいので数を減らしつつ改善にも取り組む ◦ なるべく実行を速くするための工夫をする ◦ Flakyなテストを放置せずなるべく迅速に直せるような組織的な取り組み 16
Little VM Helper (LVH) • 起動が非常に早い最小構成のVMを動かすQEMUラッパー (ref) ◦ OCIフォーマットのイメージに入ったQCoWイメージを動かせる ◦
コンテナレジストリにVMイメージをPushして配布できる ◦ Dockerのような使用感でVMが動く • カーネルを自動ビルドしてレジストリにPushするパイプラインが常に動いている (ref) ◦ 気軽に任意のカーネルバージョンでテストを走らせることができる 17
Flakyテストに対する取り組み • CI Health Manager ◦ Flakyなテストを直すローテーションワーク (ref) ◦ テスト実行の統計情報を見て失敗率の高いテストを直す
◦ 現状はIsovalentの人がやっている ▪ (コミュニティの中でやる人がいてもいいなと個人的には思う) 18
Q&A 19