【Tetragon / eBPF】Runtime Hooks 与容器边界:OCI hook、NRI 与 API server 窗口

💡 原文中文,约8500字,阅读约需21分钟。
📝

内容提要

Tetragon v1.7.0通过Runtime Hooks在容器创建时同步通知agent,使policyfilter在进程执行前就绪,避免API server异步延迟导致的策略漏事件或误放行。支持CRI-O OCI hooks和containerd NRI两种方式,agent不可达时可按namespace配置fail-open或fail-closed。无hook时仅保证best-effort,不保证策略在容器启动前生效。

🔎

延伸解读

API server 延迟窗口的实质

文章指出,无 Runtime Hooks 时,策略应用是 best-effort,因为 API server 信息异步到达,容器可能已开始执行。这意味着对于 enforcement 策略,存在一个窗口期,进程可能已发出 syscall 而策略未生效。理解这一点有助于排查“第一个请求被拦、创建瞬间的 exec 没拦”的问题,应首先确认 policyfilter 的更新是同步还是异步。

两种 hook 接入方式的差异

CRI-O 通过 OCI hooks 目录直接调用 tetragon-oci-hook,而 containerd 通过 NRI 插件注入 hook。NRI 在 containerd 1.7 需显式启用,2.0 默认开启。若 containerd 未启用 NRI 且未自定义 spec,则退回 best-effort。排障时需区分“从未同步”与“DaemonSet 在跑但运行时未调用”两种失败模式。

fail-open 与 fail-closed 的权衡

agent 不可达时,hook 可按 namespace 配置 fail-open 或 fail-closed。默认 allow 列表包含 kube-system 和 Tetragon 自身 namespace,避免关键 Pod 无法创建。全局 fail-closed 可能导致依赖 Pod 启动失败,而全局 fail-open 则退回无 hook 的窗口。生产环境需在 ADR 中明确此配置。

Runtime Hooks 与内核 hook 的分工

Runtime Hooks 不决定匹配什么 syscall,而是决定 policyfilter 认为当前 cgroup 属于哪套 K8s 身份。对于按 namespace 或标签过滤的策略,Runtime Hooks 是部署前提。排障时,若已排除 BTF 和撞名问题,下一步应检查 rthooks DaemonSet 状态、CRI 接口类型及 tetragon-oci-hook.log 日志。

Q&A

Tetragon Runtime Hooks 解决什么问题?

Tetragon Runtime Hooks 解决 API server 异步延迟导致的策略漏事件或误放行问题。在容器创建时同步通知 agent,使 policyfilter 在进程执行前就绪,确保身份感知策略在容器启动前生效。

Tetragon Runtime Hooks 支持哪两种实现方式?

支持 CRI-O 的 OCI hooks 和 containerd 的 NRI 两种方式。CRI-O 通过 OCI hooks 目录调用 tetragon-oci-hook;containerd 通过 NRI 插件注入 OCI hook。

Tetragon Runtime Hooks 的 fail-open 和 fail-closed 是什么意思?

当 agent 不可达时,fail-open 允许容器继续创建(不失败),fail-closed 则阻止容器创建。默认对 kube-system 和 Tetragon 自身命名空间 fail-open,其他命名空间 fail-closed。可通过 rthooks.failAllowNamespaces 配置额外允许列表。

如何启用 Tetragon Runtime Hooks?

通过 Helm 设置 rthooks.enabled=true,并选择 interface 为 oci-hooks 或 nri-hook。默认 rthooks.enabled 为 false,需要显式启用。

没有配置 Runtime Hooks 时,Tetragon 的策略保证是什么?

没有 Runtime Hooks 时,Tetragon 使用 API server 信息以 best-effort 方式应用策略,不保证策略在容器启动前生效,可能存在漏事件或误放行窗口。

Tetragon Runtime Hooks 与纯内核 hook(如 kprobe)有何区别?

纯内核 hook 决定匹配哪些 syscall/函数,而 Runtime Hooks 决定 policyfilter 认为当前 cgroup 属于哪套 K8s 身份。两者分工不同,Runtime Hooks 用于在容器启动前填充身份信息,确保身份感知策略正确应用。

Tetragon Runtime Hooks 的安装目录默认是什么?如果 /opt 只读怎么办?

默认安装目录是 /opt/tetragon。如果 /opt 只读,需要修改 Helm 的 rthooks.installDir 为其他可写路径,如 /run/tetragon,否则会导致 FailedMount。

🏷️

标签

➡️

继续阅读