Tetragon搭建
注意事项
这份流程会考虑到:
- Helm 的正确安装和卸载。
- Service 端口缺失的补丁方案
tetra
CLI 工具的正确使用。- 多终端同步操作和日志过滤。
- 动态 Pod 名称查找。
请严格按照步骤执行,并确保在各自的终端窗口中操作。
Tetragon 完整部署与测试流程
前提条件
-
Kubernetes 集群: 已准备就绪,推荐至少 2 个节点(一个 Master,一个 Worker)以模拟真实环境,确保 Tetragon DaemonSet 能部署到 Worker 节点。
-
kubectl
: 已配置好,可以连接到你的 Kubernetes 集群。 -
Helm
: 已安装并可用于管理 Kubernetes 应用。 -
tetra
CLI 工具: 已下载到你的工作目录,或者已添加到系统 PATH 中。如果它在当前目录,后续命令请使用./tetra
。 -
测试 Pod 定义文件:
test-pod.yaml
,内容如下:# test-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: busybox-test
namespace: default # 确保是 default 命名空间,这样不会被 Tetragon 的默认 denylist 过滤
spec:
containers:
- name: busybox
image: busybox:latest
command: ["sleep", "3600"]
restartPolicy: Never
步骤 1: 清理现有 Tetragon 安装 (确保干净状态)
为了避免 cannot re-use a name
错误和残留配置,我们先进行一次彻底的卸载。
-
卸载 Tetragon Release:
helm uninstall tetragon -n kube-system
等待命令完成。
-
确认所有 Tetragon 资源已删除:
kubectl get pods -n kube-system -l app.kubernetes.io/name=tetragon
kubectl get service -n kube-system tetragon你应该看到
No resources found
或NotFound
的输出。
步骤 2: 安装 Tetragon (不含 gRPC 端口)
我们将使用 Helm 安装 Tetragon,但由于 Chart 的默认行为或你环境的特定问题,Service 暂时不会包含 gRPC 端口。我们将在下一步手动添加它。
-
添加 Tetragon Helm 仓库 (如果尚未添加):
helm repo add cilium https://helm.cilium.io/
helm repo update -
安装 Tetragon Chart:
- 我们只启用
enablePolicyDeny
,因为grpc.enabled
暂时不会通过 Chart 生效。
helm install tetragon cilium/tetragon -n kube-system --create-namespace \
--set tetragon.enablePolicyDeny=true等待安装完成,会显示
STATUS: deployed
。 - 我们只启用
-
验证 Tetragon Pods 状态:
kubectl get pods -n kube-system -l app.kubernetes.io/name=tetragon -o wide
你应该看到每个工作节点上都有一个
tetragon-xxxxx
Pod,且STATUS
为Running
,READY
为2/2
。记下你busybox-test
Pod 所在的节点上的那个 Tetragon Pod 的完整名称 (例如tetragon-2j8bb
)。root@10-241-243-194:~# kubectl get pod -n kube-system -l app.kubernetes.io/name=tetragon -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
tetragon-2j8bb 2/2 Running 0 98m 10.241.243.195 10.241.243.195 <none> <none>
tetragon-6hjvp 2/2 Running 0 98m 10.241.243.204 10.241.243.204 <none> <none>
tetragon-fglkn 2/2 Running 0 99m 10.241.243.182 10.241.243.182 <none> <none>
tetragon-jx8n2 2/2 Running 0 98m 10.241.243.200 10.241.243.200 <none> <none>
tetragon-nz4f4 2/2 Running 0 98m 10.241.243.202 10.241.243.202 <none> <none>
tetragon-qngrg 2/2 Running 0 98m 10.241.243.193 10.241.243.193 <none> <none>
tetragon-z8h7g 2/2 Running 0 99m 10.241.243.194 10.241.243.194 <none> <none>
步骤 3: 手动打补丁,为 Tetragon Service 添加 gRPC 端口 (关键一步)
-
执行 Service 补丁命令:
这个命令会为tetragon
Service 添加一个grpc
端口50051
,并将其转发到 Tetragon Pod 内部的54321
端口。kubectl patch service -n kube-system tetragon --type=json -p='[{"op":"add", "path":"/spec/ports/-", "value":{"name":"grpc", "port":50051, "protocol":"TCP", "targetPort":54321}}]'
你应该看到
service/tetragon patched
的输出。 -
验证 Service 补丁是否成功:
kubectl get service -n kube-system tetragon -o yaml
在输出的
spec.ports
部分,确认除了metrics
端口2112
之外,还有一个grpc
端口50051
及其targetPort: 54321
。ports:
- name: metrics
port: 2112
protocol: TCP
targetPort: 2112
- name: grpc # <--- 这一段必须存在!
port: 50051
protocol: TCP
targetPort: 54321
步骤 4: 部署测试 Pod
-
部署
busybox-test
Pod:kubectl apply -f test-pod.yaml
等待 Pod 变为
Running
状态。 -
确认
busybox-test
Pod 所在的节点:kubectl get pod busybox-test -o wide
确认
NODE
列显示的节点名称(例如10.241.243.195
)。确保它与步骤 2 中 Tetragon Pod 所在节点一致。root@10-241-243-194:~# kubectl get pod busybox-test -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
busybox-test 0/1 Completed 0 102m 10.227.12.143 10.241.243.195 <none> <none>
步骤 5: 启动端口转发 (连接 tetra
CLI)
在新的终端窗口 (称之为 终端 A) 中执行。这个命令会将你本地机器的端口转发到 Tetragon Service,让 tetra
CLI 可以连接。
kubectl port-forward -n kube-system service/tetragon 50051:50051 & |
&
会让命令在后台运行。- 你应该看到
Forwarding from 127.0.0.1:50051 -> 54321
的输出。 - 重要:请保持此终端窗口打开,不要关闭它,也不要按
Ctrl+C
。
步骤 6: 使用 tetra
CLI 监听事件
在新的终端窗口 (称之为 终端 B) 中执行。这将是你在命令执行后观察事件的主要窗口。
# 假设 tetra 可执行文件在当前目录 |
- 这个命令会启动,连接到 Tetragon Service,并开始等待事件。它会保持打开状态。
步骤 7: 在测试 Pod 中生成活动 (触发事件)
在新的终端窗口 (称之为 终端 C) 中执行。
-
进入
busybox-test
Pod 的 shell:kubectl exec -it busybox-test -- sh
-
在 Pod 内部执行以下命令,并立即观察 终端 B (步骤 6 的窗口):
/ # ls -l /
/ # cat /etc/resolv.conf
/ # echo "Hello Tetragon! Events should appear now." > /tmp/successful_test.txt
/ # rm /tmp/successful_test.txt
/ # ping -c 3 google.com # 如果 Pod 有网络连接,可以尝试
/ # exit
步骤 8: 观察 tetra
CLI 输出 (验证成功)
回到 终端 B (运行 ./tetra getevents --pod busybox-test
的窗口)。
你应该会看到实时输出的 JSON 格式事件日志,清晰地显示了你在 busybox-test
Pod 中执行的命令 (例如 process_exec
事件)、文件操作 (例如 file
事件) 和网络活动 (例如 network
事件)。
这些事件的 pod
字段中将包含 name: busybox-test
,明确表明事件来源于你的测试 Pod。
步骤 9: 直接查看 Tetragon Agent 容器的日志 (备用验证/调试)
如果终端 B 仍然没有输出,作为备用方案,你可以直接查看 Tetragon Agent 容器的日志。
- 打开一个新的终端窗口 (称之为 终端 D)。
- 获取正确节点上的 Tetragon Pod 名称:
# 请替换 busybox-test 所在的节点IP,例如 10.241.243.195
TETRAGON_POD_NAME=$(kubectl get pod -n kube-system -l app.kubernetes.io/name=tetragon -o wide | grep 10.241.243.195 | awk '{print $1}')
echo $TETRAGON_POD_NAME - 查看
export-stdout
容器的实时日志,并过滤busybox-test
:再次在终端 C 中执行命令,观察终端 D。如果这里有输出,那么问题就可能在于kubectl logs -n kube-system -f $TETRAGON_POD_NAME -c export-stdout | grep busybox-test
tetra
CLI 工具本身或其与 gRPC 服务的交互上。如果这里也没有输出,那么 Tetragon Agent 可能有更深层次的问题 (尽管我们已经排除了很多,但值得再次确认)。
步骤10:大部分情况步骤8和9都会过滤数据导致并没有内容输出
所以我们可以使用这个命令来进行观察tetragon-2j8bb
是和busybox-test
在同一个节点的容器
kubectl logs -n kube-system -f tetragon-2j8bb -c export-stdout | grep busybox-test |
接着就可以看到具体的命令内容了
{"process_exec":{"process":{"exec_id":"MTAuMjQxLjI0My4xOTU6MTg4MzUwMDU2MDQ0MzkxODE6MzUzNzE2Mg==", "pid":3537162, "uid":0, "cwd":"/", "binary":"/bin/ls", "arguments":"-l /", "flags":"execve rootcwd clone", "start_time":"2025-05-28T07:55:57.842249287Z", "auid":4294967295, "pod":{"namespace":"default", "name":"busybox-test", "container":{"id":"containerd://aa1009c7d69d06276b0dcf55b29f8c3303df59ca92d29f647e4bb56d1f8dde8a", "name":"busybox", "image":{"id":"ascotbe.com/library/busybox@sha256:ce4f0c0a6e67a3a1469e7a8e1fe781f64ba7c652823fdf2d5eac677dd4d095d6", "name":"ascotbe.com/library/busybox:latest"}, "start_time":"2025-05-28T07:41:31Z", "pid":18}, "workload":"busybox-test", "workload_kind":"Pod"}, "docker":"aa1009c7d69d06276b0dcf55b29f8c3", "parent_exec_id":"MTAuMjQxLjI0My4xOTU6MTg4MzQxNDE1OTc1OTMwODE6MzUyMTY4NQ==", "tid":3537162, "in_init_tree":false}, "parent":{"exec_id":"MTAuMjQxLjI0My4xOTU6MTg4MzQxNDE1OTc1OTMwODE6MzUyMTY4NQ==", "pid":3521685, "uid":0, "cwd":"/", "binary":"/bin/sh", "flags":"execve rootcwd clone", "start_time":"2025-05-28T07:41:33.835403377Z", "auid":4294967295, "pod":{"namespace":"default", "name":"busybox-test", "container":{"id":"containerd://aa1009c7d69d06276b0dcf55b29f8c3303df59ca92d29f647e4bb56d1f8dde8a", "name":"busybox", "image":{"id":"ascotbe.com/library/busybox@sha256:ce4f0c0a6e67a3a1469e7a8e1fe781f64ba7c652823fdf2d5eac677dd4d095d6", "name":"ascotbe.com/library/busybox:latest"}, "start_time":"2025-05-28T07:41:31Z", "pid":7}, "workload":"busybox-test", "workload_kind":"Pod"}, "docker":"aa1009c7d69d06276b0dcf55b29f8c3", "parent_exec_id":"MTAuMjQxLjI0My4xOTU6MTg4MzQxNDE1MjM5NjgyNTI6MzUyMTY3Ng==", "tid":3521685, "in_init_tree":false}}, "node_name":"10.241.243.195", "time":"2025-05-28T07:55:57.842248921Z"} |
清理资源
测试完成后,清理你的 Kubernetes 资源:
- 删除测试 Pod:
kubectl delete -f test-pod.yaml
- 停止端口转发:
回到 终端 A,按下Ctrl+C
来终止kubectl port-forward
命令。 - 卸载 Tetragon:
helm uninstall tetragon -n kube-system
查看容器日志
进入容器
kubectl exec -it -n kube-system tetragon-2j8bb -c tetragon -- sh |
查看日志
tail -f /var/run/cilium/tetragon/tetragon.log |
日志每10M大小就会进行打包