Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
How is Cilium Tested?
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Yutaro Hayakawa
December 07, 2024
Technology
640
6
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
How is Cilium Tested?
Yutaro Hayakawa
December 07, 2024
More Decks by Yutaro Hayakawa
See All by Yutaro Hayakawa
Ciliumはどうテストされているのか
yutarohayakawa
1
390
eBPFのこれまでとこれから
yutarohayakawa
31
8.3k
NetKit Device
yutarohayakawa
6
2.2k
eBPFは何が嬉しいのか?
yutarohayakawa
3
2.2k
BufferbloatとLinux
yutarohayakawa
6
2.8k
Prism: Proxies without the Pain
yutarohayakawa
0
350
ipftrace: A Linux Function Tracer for Network People
yutarohayakawa
4
6k
きっと明日から役立つeBPFのしくみ
yutarohayakawa
10
4.8k
eBPFをFreeBSDにポーティングしようとしている話
yutarohayakawa
4
3.4k
Other Decks in Technology
See All in Technology
SQL文一行も書けない人事がCortexもろもろを使って人事業務を楽にしてみる
ponponmikankan
1
240
AIネイティブプロダクトで顧客価値を最大化するプロダクトエンジニアとFDEの協働
righttouch
PRO
0
280
Spring BootからQuarkusへの移行
tatsuya1bm
2
110
The Agent Builder Loop from Daily Work to OSS
minorun365
PRO
3
180
[2026-09-11]SREは誰のもの?運用エンジニアが始める 「SRE領域への越境」とチームの進化の軌跡 〜Road to NEXT CRE
tosite
0
220
ユーザー価値を届け続けるためにウォンテッドリーが大切にしている文化
kotaminato
0
140
Microsoft 365 Copilot chat -tekoälypalvelun tietosuojaongelmat
hponka
0
900
AIエージェントの自己改善をどう設計するか / How to Design Self-Improvement for AI Agents
22mi
23
14k
Reactの設計論
uhyo
22
12k
Genieを崇めよ
kameitomohiro
0
120
目の前の楽しいが人生を変える - コミュニティの螺旋の歩き方と楽しむコツ / change your life
soudai
PRO
4
560
20260912_スクフェス三河
kgnkhkr
0
350
Featured
See All Featured
30 Presentation Tips
portentint
PRO
1
390
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
240
Accessibility Awareness
sabderemane
1
210
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
520
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.2k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.4k
Typedesign – Prime Four
hannesfritz
42
3.2k
Are puppies a ranking factor?
jonoalderson
2
3.9k
A Soul's Torment
seathinner
7
3.6k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
460
Amusing Abliteration
ianozsvald
1
300
Transcript
How is Cilium Tested? Yutaro Hayakawa 1
Overview • Ciliumにおけるテストの手法 ・ ツール ・ インフラ • Ciliumのテストの難しさとその対処方法 2
Ciliumのアーキテクチャおさらい 3 Node (Linux) Agent Node (Linux) Agent External Network
Node (Linux) Agent Data Path (Linux/eBPF) Data Path (Linux/eBPF) Data Path (Linux/eBPF) Operator
Ciliumのアーキテクチャおさらい 4 Node (Linux) Agent Node (Linux) Agent External Network
Node (Linux) Agent Data Path (Linux/eBPF) Data Path (Linux/eBPF) Data Path (Linux/eBPF) Operator Cilium Agent 各ノードに常駐. Node-Localな処理 を担うコンポーネント. Data Path (Linux/eBPF) の設定, BGP, DNS Interception, L7 Proxy等.
Ciliumのアーキテクチャおさらい 5 Node (Linux) Agent Node (Linux) Agent External Network
Node (Linux) Agent Data Path (Linux/eBPF) Data Path (Linux/eBPF) Data Path (Linux/eBPF) Operator Data Path eBPFだけでやっていると思われがち だが実際にはLinuxのNetwork Stack (IP routing, iptables, etc) も組み合わせて機能を作り込ん でいる.
Ciliumのアーキテクチャおさらい 6 Node (Linux) Agent Node (Linux) Agent External Network
Node (Linux) Agent Data Path (Linux/eBPF) Data Path (Linux/eBPF) Data Path (Linux/eBPF) Operator Cilium Operator Clusterで1つ (HAできるがリーダ選出で1つに見 える). Cluster-Wideな処理を担う (IPAM, Cluster-wideなリソースの生成等)
Ciliumのテスト • CiliumのコードはCPlaneはGo, eBPFの部分だけC • テストの粒度 ◦ Unit Test ◦
E2E Test ◦ (Integration Test) ◦ (Performance Test / Scale Test) 7
Unit Test • 数秒 - 1,2分以内に終わるくらいの小規模なテスト ◦ フィードバックループの速さが大事 • Goのパッケージごとのテスト
◦ 普通のGoの単体テスト ◦ eBPFのユーザスペースコードやNetlinkを叩くコードのテストはどうする? ▪ Privileged Testと呼ばれていて特権がなければスキップされる ◦ Kubernetes Controllerのテストはどうする? ▪ クラスタを立てて本物のAPIサーバを使ってテストするのはなるべく避けたい • eBPFのテスト ◦ どうやってeBPFを単体テストする? ◦ Ciliumを丸ごと立ち上げてパケットを通すテストは避けたい ▪ セットアップが難しく, 実行に時間がかかるため 8
BPF_PROG_TEST_RUN • bpf(2)の機能でLoadしたeBPFのプログラム をAttachせずに実行できる (ref) ◦ まさにeBPFの単体テストのために作られた機能 • そのままでも使えるが, ちょっとテスト走らせるま
での手続きが面倒くさい ◦ Goでパケット作ったりパースしたり ◦ eBPFプログラムをロードしたり ◦ もう少しテストを書くのに専念したい 9 eBPF Program Test Runner In Pkt Out Pkt bpf(BPF_PROG_TEST_RUN) User Kernel
eBPF Unit Test Framework • eBPFの単体テストを書くための自作フレームワーク (ref) • PKGENのコードの中でパケット (skb)
を作る • SETUPで実際のコードにskbを通す • CHECKで出力が意図通りか確認する ◦ ちゃんとNATされたか, 返り値 (PASS, DROP, REDIRECT) が意図通りか等 • eBPFのコードのみでテストを書き切ることができる 10 PKTGEN Program Test Runner Empty InPkt SETUP Program InPkt OutPkt CHECK Program OutPkt Result bpf(BPF_PROG_TEST_RUN)
Coverbee • eBPFのテストカバレッジが計測できるツール (ref) • ロード前にコード書き換えで動的に収集コードを書き込む • 自分でカバレッジ収集のコードを書かずに計測ができる 11
Kubernetes Controllerのテストどうする? • 実際のクラスタにデプロイするところまではやりたくない ◦ Unit Testはフィードバックループの速さが大事 ◦ Kindを使ってもデプロイには2-3分かかる ◦
依存するコンポーネントだけを動かしてテストを書きたい ◦ Kubernetes APIは本物を使わない. でもClientのコードはそのまま使いたい. 12
Hive/Cell Dependency Injection Framework • DIフレームワーク (cilium/hive) ◦ Go向けのいわゆるConstructor Injection
◦ Hive == DIコンテナ, Cell == Constructor (蜂の巣のイメージ) ◦ Cilium AgentやOperatorはHiveを中心にしたモジュラーモノリス構造 • モジュール間の依存解決や初期化をDI任せにできる ◦ Ciliumの機能の必要なSubsetだけを集めて動かすことができる ◦ FakeClient (本物のClientと同じIfaceを実装している) もDIで本物とすげかえられる ◦ 本物のAPIサーバがなくてもControllerのテストができる • Demo 13
E2E Test • k8sクラスタも含めた実環境に近い環境でのテスト ◦ 実行に30分くらいかかる大きなテスト ◦ ユーザが実際にCiliumを使う時と同じようなシナリオ ◦ 本物のKubernetes環境を作って実際にトラフィックも作ってテストしたい
◦ DPlaneのテストは実際にカーネルに設定を入れてパケットを通してテストしたい ◦ k8sのRBACやCRDのバリデーションのルールなどを本物を使ってテストしたい ◦ 三大クラウドのAPIに依存した機能は本物のクラウドでなければテストできない • (余談) Kubernetesの標準APIを正しく実装しているかどうかもテストされる ◦ NetworkPolicy, Service, Ingress, GatewayAPI等 ◦ Conformance Testなどと呼ばれている 14
Connectivity Test • Ciliumが動いているクラスタでCiliumの機能 を一通り動かして疎通確認するテストを走らせら れる ◦ 新しい機能を作ったらここにシナリオを増やす ◦ どんなk8sクラスタでも動かせる
◦ ユーザがプロダクションで動かしてもOK • CiliumのE2Eテストの基本的な構成はGHAで 環境構築をしてConnectivity Testを走らせ るという流れ • Demo 15
LinuxカーネルバージョンごとのE2Eテスト • E2Eテストでは複数のLinuxカーネルでテストをしている ◦ CiliumはRHELカーネルとアップストリームのLTSカーネルで動作確認をしている ◦ 基本的にLinuxは互換性を壊さないのになぜテストするのか? ▪ 新しいカーネルのバージョンにしかない機能を使うことがある ▪
Verifierへの変更等によってLoadできていたプログラムができなくなることがたまにある ▪ Network Stackのバグを引くこともたまにある ◦ カーネルがリリースされる前に問題を発見するためにbpf-nextツリーのカーネルもテストしている • どうやって複数バージョンのカーネルをテストする? 16
Little VM Helper (LVH) • CIに使うためだけの最小構成のVMを動かすQEMUラッパー (ref) ◦ OCIフォーマットのイメージに入ったQCoWイメージを動かせる ◦
コンテナレジストリにVMイメージをPushして配布できる ◦ Dockerのような使用感でVMが動く • カーネルを自動ビルドしてレジストリにPushするパイプラインが常に動いている (ref) • Demo 17
E2Eテストの課題: テストケースの組み合わせ爆発 • Ciliumは多機能な上にサポートしている動作環境が多い ◦ 機能の組み合わせ * 動作環境 • クラウド環境
◦ GCP, AWS, Azure, etc… • Linuxカーネルのバージョン ◦ ディストリビューション固有カーネル (RHELカーネルなど), LTSカーネル数バージョン • Kubernetesのバージョン ◦ アップストリームのバージョン3つ ◦ クラウドの固有環境 (GKE, EKS, AKS, etc...) • Cilium自身のバージョン ◦ Upgrade/Downgradeテスト • 最新のUpgrade/DowngradeテストはMatrixの数が25 ◦ もちろん並列実行されるが1 Matrix当たり平均25分前後かかる • 時間的にも経済的にも (CloudやGHAの使用料) コストが高い 18
E2Eテストの課題: Flakyなテスト • テストがFlakyになりがち ◦ E2Eテストは様々な要因で失敗する ▪ CI環境の問題 ▪ 確率的に発現するバグ
▪ テストコードそのものの不備 ◦ 動いているものが多いので失敗の原因を突き止めるのが非常に難しい ▪ Ciliumは非常にたくさんのgoroutine (手元では381あった) が並行・並列に動く ▪ 動きは全く決定的ではないのでRace Conditionなどは起きやすいし見逃しやすい 19
Flakyなテストの弊害 • PRを出した時は `Required` とタグされたテストは全て通さなくてはマージできない • Flakyなテストがあるとそのテストの失敗が自分の変更が原因でなのかそうでないのかわからない ◦ 他の開発者が作ってしまったFlakeを自分がたまたま引いているだけかも ◦
逆も然りで, 自分がFlakeを作ってもたまたまテストが成功してマージしてしまうかもしれない • 現状PRでテストを走らせるとほぼ毎回何かのテストが失敗する ◦ テストの失敗はリトライする前にGitHubのIssueで報告することになっている (ref) ◦ リトライにも30分以上かかるのでCIを通すのがPRの時間の中で支配的になることも ◦ テストを信頼できないと皆がテストの失敗に無頓着になってしまうので本物のエラーが発見しづらくなる 20
Flakyテストに対する取り組み • CI Health Manager ◦ Flakyなテストを直すローテーションワーク (ref) ◦ テスト実行の統計情報を見て失敗率の高いテストを直す
◦ 現状はIsovalentの人がやっている ▪ (コミュニティの中でやる人がいてもいいなと個人的には思う) • E2Eテストの削減 ◦ 一般的な話としてE2Eテストは減らした方がいい ◦ E2Eテストが充実しているのは安心感があるが, 時間がかかり, Flakyになりやすく金銭的なコ ストも高い ◦ なるべくUnit TestやIntegration Testでカバーできるケースを増やす 21
おわり 22