Tutorial: Using BPF in Cloud Native environments
KubeCon + CloudNativeCon Europe 2020 0日目 のセッションである Tutorial: Using BPF in Cloud Native environments
についてです。
- スライド: https://github.com/kinvolk/cloud-native-bpf-workshop/blob/master/slides.pdf
- Workshop 資料: https://github.com/kinvolk/cloud-native-bpf-workshop
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 の一機能である opensnoop
や execsnoop
を 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 等のツールは使ったことが無かったという状態でしたがこの発表にてそれらの片鱗を知れたのも良かったです、これから積極的に使っていこうと思います。