Tutorial: Using BPF in Cloud Native environments

KubeCon + CloudNativeCon Europe 2020 0日目 のセッションである Tutorial: Using BPF in Cloud Native environments についてです。

00-Getting_Started

minikube 等のインストール作業。

01-Network-Policy-Advisor

Inspektor Gadget *1 を利用して、 各 Pod に着弾した通信を BPF で capture した情報をもとに、 Microservice 間の通信をロギングするコマンド kubectl-gadget network-policy monitor と、そのログファイルをもとに NetworkPolicy リソースを自動生成する kubectl-gadget network-policy report コマンドの紹介でした。

事前にデプロイした Inspektor Gadget DaemonSet が Node の kernel の BPF の情報を取得し、kubectl-gadget コマンドはその Pod を Kubernetes API 経由で叩く CLI になっているそうです。

02-Traceloop

syscall のトレースに ptrace ではなく、 BPF を用いた traceloop *2 というツールを開発したという話と、それを Inspektor Gadget から kubectl-gadget traceloop コマンドで叩けるようにしたという話でした。

デモでは このリンク先の例 のように、実際に cannot open file エラーが発生する Pod を run したあとに kubectl-gadget traceloop show コマンドで syscall のトレース結果を取得して原因がすぐ分かるねという内容でした。

03-Snooping_Operations

BCC (BPF Compiler Collection) *3 の一機能である opensnoopexecsnoop を Inspektor Gadget から kubectl-gadget execsnoop, kubectl-gadget opensnoop コマンドでそれぞれ叩けるようにしたという話でした。

execsnoop のデモは、 kubectl run された Pod 内で実行されたコマンドを取得するという内容でした。 opensnoop のデモは、 nginx Pod に対し存在しないファイルの http リクエストをした際に opensnoop から nginx がどのパスのファイルを開こうとしたかを確認できるという内容でした。

04-Tracing

これまでの章は Inspektor Gadget の紹介でしたが、この章では Kubernetes API 経由で bpftrace *4 を実行するツールである kubectl-trace *5 の使い方についての話でした。 kubectl trace run コマンドで bpftrace と同じ expression で同じ操作ができるそうです。

05-Extras

発表中で触れてないので省略。

感想

どれもトラシュー時に役に立ちそうな機能だったので今すぐにでも導入したいと思いました。 また元々 BPF はなんとなく知ってるけど bpftrace 等のツールは使ったことが無かったという状態でしたがこの発表にてそれらの片鱗を知れたのも良かったです、これから積極的に使っていこうと思います。