CiliumのeBPFベースのイベント監視コンポーネントTetragon。下記記事の最後に少し紹介しましたが、実際に動かしてみました。(準備が少し面倒です。また少しみにくくなりますが、バージョン結果などコマンドの出力も今後のため表示しています。)
「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コマンドなどを実行しました。
kubectl exec -it nginx-deploy-579f977958-qx6f6 — sh
以下、ポッドの情報で、ngnix以外は最初のdemoで作成されたもの。
tcp-connect.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
apiVersion: cilium.io/v1alpha1 kind: TracingPolicy metadata: name: "connect" spec: kprobes: - call: "tcp_connect" syscall: false args: - index: 0 type: "sock" - call: "tcp_close" syscall: false args: - index: 0 type: "sock" - call: "tcp_sendmsg" syscall: false args: - index: 0 type: "sock" - index: 2 type: int |
demoのyamlも一応引用します。
http-sw-app.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
--- apiVersion: v1 kind: Service metadata: name: deathstar labels: app.kubernetes.io/name: deathstar spec: type: ClusterIP ports: - port: 80 selector: org: empire class: deathstar --- apiVersion: apps/v1 kind: Deployment metadata: name: deathstar labels: app.kubernetes.io/name: deathstar spec: replicas: 2 selector: matchLabels: org: empire class: deathstar template: metadata: labels: org: empire class: deathstar app.kubernetes.io/name: deathstar spec: containers: - name: deathstar image: docker.io/cilium/starwars --- apiVersion: v1 kind: Pod metadata: name: tiefighter labels: org: empire class: tiefighter app.kubernetes.io/name: tiefighter spec: containers: - name: spaceship image: docker.io/tgraf/netperf --- apiVersion: v1 kind: Pod metadata: name: xwing labels: app.kubernetes.io/name: xwing org: alliance class: xwing spec: containers: - name: spaceship image: docker.io/tgraf/netperf |
最初に紹介しましたBPF関連の記事では、CやPython、専用言語などがでてきましたが、ここではyamlですべて実現できるということがわかりました。