Agent Sandbox 从零开始 · 3.0
第 19 / 34 节 · 面向零基础读者

第 17 章:OpenSandbox——把环境管理与执行能力接起来

它解决什么问题

OpenSandbox 让应用通过统一接口创建执行环境、运行命令、管理文件,并接入浏览器或桌面任务。本次读取的 README 给出从本地 Docker 起步,再走向 Kubernetes 的路径;也列出多语言 SDK、CLI 与集成示例。[11]

对小白来说,可以先把它理解成“为沙箱补齐前台和服务窗口”。你不必自己把每个 Docker 参数变成 API,但仍需理解所选后端究竟提供什么隔离。

一次请求怎样走

创建请求先到生命周期服务,由它选择后端并准备环境。运行命令和读写文件则通常通过环境中的 execd API 完成。客户端还可以解析沙箱内某个服务端口,用浏览器或该服务自己的客户端访问。环境的创建接口、execd 的执行接口、浏览器服务接口并不是同一个东西。

应用 / SDK
  ├─创建与销毁 → 生命周期服务 → Docker / Kubernetes 等后端
  ├─命令与文件 → execd → 沙箱内进程与文件
  └─访问服务   → 解析端点 / ingress → 浏览器或其他工作负载

execd 的文档描述了前台流式命令、后台执行、持久 shell 会话、Jupyter 代码上下文、PTY 和文件操作。它们的状态语义不同:持久 shell 里的 cd 或变量可能跨调用保留,而两次独立进程执行不应被想当然地视为同一个 shell。

源码入口告诉我们什么

server/opensandbox_server/services/runtime_resolver.py 将安全运行时配置转换成 Docker runtime 或 Kubernetes RuntimeClass。代码中可以看到 gVisor、Kata 等映射,也能看到未启用安全运行时配置时返回空结果的路径。这说明统一 API 之下的隔离机制需要核对配置,不能把“支持某机制”当成“所有环境默认使用该机制”。

docs/architecture/fast-sandbox/index.md 描述另一条集成:通过模板在预热 Fastlet 中启动 Firecracker microVM,后端平台的 FastPath、Fastlet 和 CRD 属于外部 fast-sandbox 项目。读到这里,应把“OpenSandbox 仓库中的适配层”和“外部运行平台”区分开;本书没有进一步审阅外部仓库。

网络不是只写一个域名列表

Egress 文档区分 DNS 过滤与 dns+nft 网络层执行。前者约束域名解析,后者再加上包级限制。这正好对应第 4 章的问题:拒绝一次 DNS 查询,不等于限制程序直接访问 IP。

同一文档还列出运行时兼容边界:它所描述的透明重定向机制与 gVisor netstack 不兼容,并不支持与透明 service-mesh sidecar 叠加使用。学习重点是检查你要组合的功能能否一起工作,不能把多个“支持”简单相加。

适合怎样入门

沿 README 先做一次“创建—运行 echo—读写临时文件—销毁”,记录沙箱 ID、命令返回和清理结果。再把第 8 章的虚构 CSV 任务迁过去。首次不必接模型,也不要一开始部署 Kubernetes。

还要注意删除语义:生命周期服务文档说明,某些 Kubernetes 工作负载删除返回时只是接受请求,需要继续查询;池采用 Noop 策略时,即使查询返回 404,也不能确认进程终止。这是特定后端与池策略的行为,不能泛化成所有删除都一样。

阅读练习:找到创建环境与运行命令分别调用哪个接口;再查使用的后端和出网模式。能写下这三个答案,才算理解这次执行的路径。

本书包含示例与资料导读;验证范围和来源见附录。