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
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
610
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
330
eBPFのこれまでとこれから
yutarohayakawa
32
8.1k
NetKit Device
yutarohayakawa
6
2.1k
eBPFは何が嬉しいのか?
yutarohayakawa
3
2.2k
BufferbloatとLinux
yutarohayakawa
6
2.5k
Prism: Proxies without the Pain
yutarohayakawa
0
330
ipftrace: A Linux Function Tracer for Network People
yutarohayakawa
4
6k
きっと明日から役立つeBPFのしくみ
yutarohayakawa
10
4.8k
eBPFをFreeBSDにポーティングしようとしている話
yutarohayakawa
4
3.3k
Other Decks in Technology
See All in Technology
AIネイティブな開発のサプライチェーンリスク対策 〜激動の開発現場でリスクに立ち向かう〜【ZennFes】
cscengineer
PRO
2
140
[AWS Summit Japan 2026]迷っているあなたへ_小さな一歩が、やがて自分を助けてくれる
sh_fk2
1
140
SONiCで構築・運用する生成AI向けパブリッククラウドネットワーク ~実装編~
sonic
0
280
エラーバジェットのアラートのタイミングを考える.pdf
kairim0
0
170
データサイエンスを価値につなげるプロジェクト設計 〜 DS一年目が現場で得た気づき 〜
ysd113
1
280
小さく始める AI 活用推進 ― 日経電子版 Web チームの事例/nikkei-tech-talk47
nikkei_engineer_recruiting
0
300
【NRUG vol.18】なぜ多くのオブザーバビリティ導入は失敗するのか
nrug_member
0
190
Agent Skills設計で柔軟性と硬さのバランスが難しい話
nassy20
0
140
iAEONの段階的リアーキテクト戦略 / iAEON's_Gradual_Re-architecture_Strategy
aeonpeople
0
230
【Cyber-sec+】経営層を"動かす"ための考え方
hssh2_bin
0
190
徹底討論!ECS vs EKS!
daitak
0
150
2026 TECHFRESH 畢業分享會 - AI-Native 重塑軟體工程與虛擬講師
line_developers_tw
PRO
0
1.3k
Featured
See All Featured
How to build a perfect <img>
jonoalderson
1
5.7k
Tell your own story through comics
letsgokoyo
1
960
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.5k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
490
Accessibility Awareness
sabderemane
1
140
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
250
Un-Boring Meetings
codingconduct
0
320
Designing Powerful Visuals for Engaging Learning
tmiket
1
420
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
750
Building Applications with DynamoDB
mza
96
7.1k
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