【Tetragon / eBPF】排障坐标系:无事件、策略不生效、导出缺口、误阻断与血缘空洞
内容提要
本文介绍Tetragon v1.7.0排障方法,按五轴归因:进程血缘、Sensor/Hook、策略加载、过滤分层、强制执行。常见问题包括:策略已应用但无事件(检查BTF和hook)、同名策略冲突(collectionKey撞名)、denylist不影响gRPC、Override需CONFIG_BPF_KPROBE_OVERRIDE。强调先定位问题轴,再针对性排查,避免盲目重装或修改配置。
延伸解读
先定位问题轴,再动手排查
文章强调排障第一步是明确问题属于哪个轴:血缘、Hook、加载、过滤还是强制执行。盲目重装或修改YAML可能掩盖真实原因,甚至放大故障。例如,策略不生效可能是集合键撞名,而非策略本身错误。建议先通过agent日志、tetra tracingpolicy list等工具确认问题层面,再针对性处理。
同名策略冲突的机制
三条加载路径(kubectl、gRPC、静态文件)共用同一collection map,键为name+namespace。若已有同名集合且非错误状态,后续添加会直接失败,导致CR更新不生效。排障时应检查tetra tracingpolicy list,确认正在运行的是哪份策略,避免误改。
导出过滤的适用范围
JSON allow/deny仅作用于文件sink,不影响gRPC。因此,通过tetra getevents验证denylist会得到“未生效”的假象。排障时需区分观察通道:文件日志与gRPC是两条独立出口,过滤发生在不同层。SIEM接入应使用文件sink,并注意字段过滤可能裁掉事件字段。
Override与SIGKILL的语义差异
Override依赖内核CONFIG_BPF_KPROBE_OVERRIDE,否则不可用;SIGKILL只终止进程,不保证当前系统调用无副作用。要阻止操作本身,需组合使用Signal与Override。monitor模式下enforcement动作被省略,可能导致策略看似生效但无阻断。
Q&A
Tetragon 中策略已应用但没有任何事件产生,可能的原因有哪些?
可能原因包括:BPF 程序未 attach(如 hook 符号或类型写错)、内核缺少 BTF 或 agent 未找到 BTF、策略加载路径撞名导致实际生效的不是你以为的那份策略。应先检查 BTF 路径和 hook 是否正确,再检查策略集合键是否冲突。
Tetragon 中同名策略冲突是如何发生的?如何避免?
Tetragon v1.7.0 中,Kubernetes、gRPC、静态文件三条加载路径共用同一个 collection map,键为 collectionKey{name, namespace}。如果不同路径下存在同名同命名空间的策略,后添加的会因键已存在而失败,导致更新不生效。避免方法是确保不同路径下策略名称和命名空间唯一,或使用不同名称。
Tetragon 的 denylist 配置后,为什么 tetra getevents 仍然能看到被过滤的事件?
因为 denylist/allowlist 只作用于文件 sink 导出的 JSON,不影响 gRPC API。tetra getevents 走 gRPC,所以仍会看到未被导出过滤器丢弃的事件。若要验收 denylist,应检查文件输出而非 gRPC。
Tetragon 中 Override 动作在什么条件下才能生效?
Override 使用内核 error injection,需要内核编译时启用 CONFIG_BPF_KPROBE_OVERRIDE。如果未启用,Override 不会生效。此外,如果运行时模式是 monitor,也会省略 enforcement 动作。
Tetragon 中 SIGKILL 动作能保证系统调用没有副作用吗?
不能。SIGKILL 保证进程被同步终止,但不保证当前这次系统调用没有副作用。例如 write() 可能已经写入数据。文档建议若要确保操作本身不完成,需组合使用 Signal 和 Override。
Tetragon 中进程血缘出现空洞(如短命进程无父)的可能原因是什么?
可能原因包括:fork 时父进程不在 execve_map 中,导致子进程不被插入 map;agent 启动时从 procfs 回填的进程可能缺少完整血缘;用户态 cache 过早删除导致 early deletions 计数上升。这些都会造成血缘空洞。
Tetragon 中 policyfilter 默认开启吗?主机直接运行二进制时有什么注意点?
Helm chart 默认 enablePolicyFilter: True,但 daemon flag --enable-policy-filter 的代码默认值是 false。如果主机直接运行二进制且未显式开启,又使用了 TracingPolicyNamespaced,会导致身份过滤未建立,策略可能不生效。