Tetragon / Cilium

CiliumのeBPFベースのイベント監視コンポーネントTetragon。下記記事の最後に少し紹介しましたが、実際に動かしてみました。(準備が少し面倒です。また少しみにくくなりますが、バージョン結果などコマンドの出力も今後のため表示しています。)

「Cilium / Container Network Interface」

Cilium / Container Network Interface

「Cilium Project Tetragon」
https://github.com/cilium/tetragon


参考までに、BPFを使ってイベント監視については以下でその基本となるしくみをまとめています。
「BPF Tracing Tools」
https://decode.red/blog/202302201582/
「Berkeley Packet Filter」
https://decode.red/blog/202302181573/
「BPF Compiler Collection」
https://decode.red/blog/202302031560/

環境) Ubuntu 20.04
インストール)
まずはKubernetesのインストールですが、これまでWSLやk3sと手軽に試してきましたが、今回は下記を参考にdockerを使ってインストールしました。
https://itc-engineering-blog.netlify.app/blogs/ubuntu-kubernetes

apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add –
add-apt-repository “deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable”
apt update
apt install -y docker-ce
docker -v

Docker version 23.0.1, build a5ee5b1

systemctl status docker

起動していることを確認

curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo “deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main” | tee /etc/apt/sources.list.d/kubernetes.list
apt update
apt install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl

バージョン確認

root@n07:~# kubelet –version
Kubernetes v1.26.1
root@n07:~# kubeadm version
kubeadm version: &version.Info{Major:”1″, Minor:”26″, GitVersion:”v1.26.1″, GitCommit:”8f94681cd294aa8cfd3407b8191f6c70214973a4″, GitTreeState:”clean”, BuildDate:”2023-01-18T15:56:50Z”, GoVersion:”go1.19.5″, Compiler:”gc”, Platform:”linux/amd64″}
root@n07:~# kubectl version
WARNING: This version information is deprecated and will be replaced with the output from kubectl version –short. Use –output=yaml|json to get the full version.
Client Version: version.Info{Major:”1″, Minor:”26″, GitVersion:”v1.26.1″, GitCommit:”8f94681cd294aa8cfd3407b8191f6c70214973a4″, GitTreeState:”clean”, BuildDate:”2023-01-18T15:58:16Z”, GoVersion:”go1.19.5″, Compiler:”gc”, Platform:”linux/amd64″}
Kustomize Version: v4.5.7
Server Version: version.Info{Major:”1″, Minor:”25″, GitVersion:”v1.25.3″, GitCommit:”434bfd82814af038ad94d62ebe59b133fcb50506″, GitTreeState:”clean”, BuildDate:”2022-10-25T19:35:11Z”, GoVersion:”go1.19.2″, Compiler:”gc”, Platform:”linux/amd64″}
root@n07:~#

Kindのインストール
https://kind.sigs.k8s.io/docs/user/quick-start/#installation より

curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.17.0/kind-linux-amd64
chmod +x ./kind
mv ./kind /usr/local/bin/kind

そして最後にTetragonのインストール・デプロイ
https://github.com/cilium/tetragon より

kind create cluster

root@n07:~# snap install helm –classic
helm 3.10.1 from Snapcrafters installed
root@n07:~# helm repo add cilium https://helm.cilium.io
“cilium” has been added to your repositories
root@n07:~# helm repo update
Hang tight while we grab the latest from your chart repositories…
…Successfully got an update from the “cilium” chart repository
Update Complete. ?Happy Helming!?
root@n07:~# helm install tetragon cilium/tetragon -n kube-system
NAME: tetragon
LAST DEPLOYED: Mon Feb 20 08:14:06 2023
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
root@n07:~# kubectl rollout status -n kube-system ds/tetragon -w
Waiting for daemon set “tetragon” rollout to finish: 0 of 1 updated pods are available…
daemon set “tetragon” successfully rolled out

動作確認

root@n07:~# kubectl cluster-info –context kind-kind
Kubernetes control plane is running at https://127.0.0.1:38831
CoreDNS is running at https://127.0.0.1:38831/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use ‘kubectl cluster-info dump’.

デモアプリのデプロイ

kubectl create -f https://raw.githubusercontent.com/cilium/cilium/v1.11/examples/minikube/http-sw-app.yaml

Tetra CLIのインストール(出力を整形するために必要)

apt install golang-go
apt install gccgo-go
GOOS=$(go env GOOS)
GOARCH=$(go env GOARCH)
curl -L –remote-name-all https://github.com/cilium/tetragon/releases/latest/download/tetra-${GOOS}-${GOARCH}.tar.gz{,.sha256sum}
sha256sum –check tetra-${GOOS}-${GOARCH}.tar.gz.sha256sum
sudo tar -C /usr/local/bin -xzvf tetra-${GOOS}-${GOARCH}.tar.gz
rm tetra-${GOOS}-${GOARCH}.tar.gz{,.sha256sum}

イベント監視
まずはデモにあるようにコンテナに入り”whoai”や”vi /etc/passwd”を実行しました。あと適当にコマンドを実行しましたが、右の数字はexit codeですね。(echo $?)

kubectl exec -it xwing — /bin/bash

kubectl logs -n kube-system -l app.kubernetes.io/name=tetragon -c export-stdout -f | tetra getevents -o compact


整形しないと以下のように大量の情報を出力します。

この次に、前のブログで少し触れたtcpコネクトのテストです。

kubectl apply -f https://raw.githubusercontent.com/cilium/tetragon/main/crds/examples/tcp-connect.yaml

※createではなくapply

podでなく、TracingPolicyが作られる。
下記で使ったnginx.ymlを利用し、このコンテナに入り、curlコマンドなどを実行しました。

Pod-to-Pod Communication / Kubernetes

kubectl exec -it nginx-deploy-579f977958-qx6f6 — sh


以下、ポッドの情報で、ngnix以外は最初のdemoで作成されたもの。

tcp-connect.yaml

demoのyamlも一応引用します。
http-sw-app.yaml

最初に紹介しましたBPF関連の記事では、CやPython、専用言語などがでてきましたが、ここではyamlですべて実現できるということがわかりました。