? eBPF とは? 出典 : Brendan Gregg's Blog https://www.brendangregg.com/blog/2019-01-01/learn-ebpf-tracing.html eBPF does to Linux what JavaScript does to HTML. 訳:JavaScript が HTML に対して行うのと同じように、eBPF は Linux に対して行います。 eBPF には、Linux カーネルの拡張を書くた めのフレームワークがある
Pod App Pod App Pod App Pod App Pod App Pod App Pod App Pod App Pod App Node Pod App Pod App Pod App Node Pod App Pod App Pod App Pod App Pod App Pod App サイドカーモデル サイドカーレスモデル サイドカーとしてのプロキシコンテナが無いことで起動時間やノードのリソース消費を低減 補足
「Life Without Sidecars - ls eBPF's Promise Too Good to Be True ?」 • カーネルをプログラム可能にするためのインターフェース • イベント駆動型、カーネル空間で実行 • 効率 - 開発者はユーザー空間へのデータ転送を回避し、 コンテキストの切り替えを最小限に抑える • 安全 - プログラムは厳格な要件に従うため、カーネルを 停止することは不可能です eBPF 概要
「Life Without Sidecars - ls eBPF's Promise Too Good to Be True ?」 Sockmap • eBPF の sock map は、このシナリオをカバーするデータ 構造 • ソケットへの参照を保存し、eBPF プログラムが TCP パ ケットを完全にカーネル空間へのリダイレクトを可能にする • リバースプロキシとロードバランサを高速化するために使用 可能
「Life Without Sidecars - ls eBPF's Promise Too Good to Be True ?」 ノードごとにプロキシを共有 • リソースを大量に消費するプロキシを使用すれば、より効率的になる • リソース不足と公平性への懸念 • リソースを最適化する精度が弱い • 機密情報を隔離できない • 問題が発生した場合の影響範囲が大きい
「Life Without Sidecars - ls eBPF's Promise Too Good to Be True ?」 サイドカー優位性 • リソースの消費量はアプリケーションに応じて変化 • プロキシの障害は特定のインスタンスに限定される • メンテナンスが容易でリスクが軽減される • セキュリティ境界が非常に明確であり、隔離性が非常に 高い • シンプルモデル
Runtime Enforcement 予期せぬアプリケーションの挙動を検知し、ランタイムレベルで脅威をアラートするランタイムセキュリティツール カーネルからのシステムコールを解析して、定義したルールに違反した意図しない振る舞いを検知 Go or C++ の SDK で動 的共有ライブラリを生成し て読み込ませることで、 libsinsp/libscapを拡張 https://falco.org/
1 Install PIXIE on OKE $ px deploy Deploy the Pixie Platform in your K8s cluster https://docs.px.dev/installing-pixie/requirements/ https://work.withpixie.ai:443 Webブラウザからアクセス
2 L7 Policy with Cilium and Kubernetes Observability of Hubble tiefighter to deathstar Access Deny HTTP PUT /v1/exhaust-port tiefighter to deathstar forward HTTP POST /v1/request-landing xwing to deathstar dropped
3 Install Tetragon $ helm repo add cilium https://helm.cilium.io $ helm repo update $ helm install tetragon cilium/tetragon -n kube-system $ kubectl rollout status -n kube-system ds/tetragon -w Waiting for daemon set "tetragon" rollout to finish: 0 of 3 updated pods are available... Waiting for daemon set "tetragon" rollout to finish: 1 of 3 updated pods are available... Waiting for daemon set "tetragon" rollout to finish: 2 of 3 updated pods are available... daemon set "tetragon" successfully rolled out
3 Privileged Execution $ kubectl edit cm -n kube-system tetragon-config # change "enable-process-cred" from "false" to "true" # change "enable-process-ns" from "false" to "true" # then save and exit Console B $ kubectl rollout restart -n kube-system ds/tetragon $ kubectl apply -f https://raw.githubusercontent.com/cilium/tetragon/main/testdata/specs/testpod.yaml Restart the Tetragon daemonset Apply the privileged PodSpec:
3 $ kubectl apply -f https://raw.githubusercontent.com/cilium/tetragon/main/examples/tracingpolicy/sys_write_follow_fd_prefix.yaml Apply the following TracingPolicy Generic tracing - File Access - Console B tracingpolicy.cilium.io/sys-read-follow-prefix created $ kubectl exec -it xwing -- /bin/bash kubectl exec into the xwing pod bash-4.3# vi /etc/passwd
3 Generic tracing - Network Observability - $ kubectl apply -f https://raw.githubusercontent.com/cilium/tetragon/main/examples/tracingpolicy/tcp-connect.yaml Apply the example TCP connect TracingPolicy Console B tracingpolicy.cilium.io/connect created $ kubectl exec -it xwing -- curl http://cilium.io kubectl exec into the xwing pod Redirecting to https://cilium.io/