Slide 1

Slide 1 text

eBPFツールを使ってみた! (Observability編 Part 1) Kubernetes Novice Tokyo #33

Slide 2

Slide 2 text

参考 eBPF Applications Landscape

Slide 3

Slide 3 text

今回用いるサンプルアプリケーション # kubectl apply -f https://raw.githubusercontent.com/keyval-dev/microservices-demo/master/release/kubernetes-manifests.yaml # kubectl get pods -n default NAME READY STATUS RESTARTS AGE adservice-64d674d84-kgjp5 1/1 Running 0 2m51s cartservice-68c568b947-ks85d 1/1 Running 2 (2m30s ago) 2m51s checkoutservice-74f77477d4-nlf62 1/1 Running 0 2m51s currencyservice-cd84b68-vbx9z 1/1 Running 0 2m51s emailservice-88fd5969b-m7757 1/1 Running 0 2m51s frontend-5f5f58ff9f-bmrgh 1/1 Running 0 2m51s loadgenerator-5c46bcfb7d-npjgr 1/1 Running 0 2m49s paymentservice-7d58f78948-5qkgr 1/1 Running 0 2m51s productcatalogservice-6c447cb789-cbgrw 1/1 Running 0 2m50s recommendationservice-7fb98d9d5b-jc8t5 1/1 Running 0 2m50s redis-cart-548dfd74d-w2fdt 1/1 Running 0 2m50s shippingservice-6cf97c9854-tpwr8 1/1 Running 0 2m50s

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

検証用監視基盤 以下のように、Grafana, Prometheus, Grafana Loki, Grafana Tempoを作成しておく。 デプロイ簡略化のため 以下のHelm Chartを利用しますが、とても古いものなので商用環境などでは使わないでください。 https://github.com/odigos-io/charts/tree/master # kubectl get pods -n observability NAME READY STATUS RESTARTS AGE observability-grafana-7c68bb5d56-cdlz9 1/1 Running 0 5m52s observability-loki-0 1/1 Running 0 15m observability-prometheus-server-7847cd6968-2wt9t 2/2 Running 0 15m observability-tempo-0 2/2 Running 0 15m

Slide 6

Slide 6 text

Odigos

Slide 7

Slide 7 text

Odigosとは https://github.com/odigos-io/odigos eBPFを用いてアプリケーションから分散トレーシング情報を取得するためのツール。 (Java, Python, .NET, Node.js, and Go) インタプリタ言語の場合、 OpenTelemetryによる自動計装を実行。 コンパイル言語の場合、 eBPFによる自動計装を実行。 取得したデータをOpenTelemetry形式で様々なオブザーバビリティツールに対して送ることができる。

Slide 8

Slide 8 text

アーキテクチャ アプリケーションの言語に応じて自動計装を実行する

Slide 9

Slide 9 text

アーキテクチャ Odigos Collectorのデプロイと構成を担当

Slide 10

Slide 10 text

アーキテクチャ Instrumentorによって検出されたアプリケーションを、 Autoscalerによって作成された Collectorに割り当てる

Slide 11

Slide 11 text

アーキテクチャ データ取得対象や送信先の決定などを行う

Slide 12

Slide 12 text

インストール方法 以下二つの方法が用意されている。 ● Odigos CLI ● Helm 以下のようなリソースが稼働する。 # kubectl get pods -n odigos-system NAME READY STATUS RESTARTS AGE odiglet-8fbbs 1/1 Running 0 6h31m odiglet-dnd5l 1/1 Running 0 6h31m odiglet-h2t82 1/1 Running 0 6h31m odigos-autoscaler-84b99b8647-628c5 1/1 Running 0 6h31m odigos-data-collection-n5fkt 1/1 Running 0 18m odigos-data-collection-vqqbz 1/1 Running 0 18m odigos-data-collection-xzd5c 1/1 Running 0 18m odigos-gateway-6c95bc95bb-gh47b 1/1 Running 0 24m odigos-instrumentor-7bd64ffb68-rttcs 1/1 Running 0 6h31m odigos-scheduler-5d89b686c-hbcc5 1/1 Running 0 6h31m odigos-ui-7b78f6d454-kqnz7 1/1 Running 0 6h31m

Slide 13

Slide 13 text

セットアップ odigos uiコマンドを用いてUIに接続し、自動計装対象とテレメトリーデータの送信先を設定する。

Slide 14

Slide 14 text

セットアップ セットアップが完了すると、以下の様になる。

Slide 15

Slide 15 text

Grafanaでの可視化 (Service Graph) サンプルアプリケーションにアクセスし何かしらのアクションを起こすと、以下の様に通信をグラフ化して表示することができる。

Slide 16

Slide 16 text

Tracing -> Metrics ノードをクリックすることで様々な情報にアクセスすることが可能。

Slide 17

Slide 17 text

Tracing -> Metrics -> Tracing Request histgramでは、リクエストがあった所からのトレーシング情報への導線にアクセスすることができます。

Slide 18

Slide 18 text

Tracing -> Metrics -> Tracing 「Query with Tempo」をクリックすることで、 TraceQLを打った画面が表示される。

Slide 19

Slide 19 text

Tetragon

Slide 20

Slide 20 text

Tetragonとは CilliumやHubbleなどを開発しているIsovalentによって管理されている OSS。 eBPFを用いて、アプリケーションに変更を加えることなく様々な制御をおこなったり、情報を取得することができるようになっている。

Slide 21

Slide 21 text

インストール Helmを用いて容易にインストールが可能。 $ helm repo add cilium https://helm.cilium.io "cilium" has been added to your repositories $ helm install tetragon ${EXTRA_HELM_FLAGS[@]} cilium/tetragon -n tetragon --create-namespace NAME: tetragon LAST DEPLOYED: Mon Jul 29 19:09:06 2024 NAMESPACE: tetragon STATUS: deployed REVISION: 1 TEST SUITE: None

Slide 22

Slide 22 text

Tetragonによる情報の取得 大きく分けると以下の 2つに分けて、情報の取得ができる。 ● Event ● TracingPolicy

Slide 23

Slide 23 text

Event Tetragonでは、デフォルトでPod内においてシステムコールが呼ばれた際の情報を Json形式でログに出力してくれる。 (gRPC エンドポイントを公開可能 ) テスト用Pod # kubectl exec -it checkoutservice-76f9457cff-vwqt8 -n sample-app -- sh / # touch test Tetragon $ kubectl logs tetragon-gxfkt -c export-stdout --tail 1 | jq .

Slide 24

Slide 24 text

Tracing Policy カーネル内の任意のイベントをトレースし、指定した条件にマッチした場合に実行するアクションを定義することができます。 ● Hook Point: eBPFをトリガーするための起点となるもの ○ Kprobes ○ Tracepoints ○ Uprobes ● Selector: TracingPolicyによる制御の対象を絞るためのもの ○ Arguments ○ PID ○ Binary ○ Namespace (Linux機能としてのNamespace) ○ etc…

Slide 25

Slide 25 text

TracingPolicy 以下の様なTracingPolicyを用いることで、どこからどこに対して通信がされているかを確認することができる。

Slide 26

Slide 26 text

まとめ アプリケーション側で何かしらの対応をすることなく、 eBPFを用いて情報を取得できるようになってきている。 今後はMetrics, Logs, Tracesなどでは不十分だった情報の取得や、 Pod 内のプロセスレベルでのイベント監視といったことが容易にできる世界に なっていくのかなと楽しみで仕方ない。

Slide 27

Slide 27 text

お願い 今回のようなやってみた系の発信は、まだ使ったことがない方にとって使い始めようとする際のハードルを下げてくれます。 ぜひ、「こんなことをやってみた」や「 Kubernetesのこんなことを調べてみた」といったご登壇をお待ちしております! そして、リレー参加者募集 !! 「eBPFツール使ってみた! (Observability編 Part2)」を話していただけますと嬉しいです! - Grafana Beyla - Pyroscope - Kepler - KubeScoop - etc…

Slide 28

Slide 28 text

Thank you