访问沙箱
当 Sandbox 被交付后(参见 Sandbox 申领),客户端会向其发送流量,用于运行代码、执行命令、 读写文件,或访问 Sandbox 内某个端口上监听的服务。本页介绍入方向流量如何到达 Sandbox、由哪些安全凭证保护,以及可用于 连接的三种 SDK,并说明如何通过端口转发将流量映射到本地进行调试。
域名、TLS 和多域名部署的细节请参见使用 E2B SDK。本页聚焦于访问链路本身,相关内容以链接方式引用, 不再重复。
入方向流量架构
OpenKruise Agents 将入方向流量拆分为控制面和数据面,从而保证控制面的问题不会中断已经流向运行中 Sandbox 的 业务流量。
| 平面 | 组件 | 职责 | 原生协议地址 | 私有协议地址 |
|---|---|---|---|---|
| 控制面 | sandbox-manager | E2B/MCP 管理 API:create、kill、pause、resume、connect、list、API Key | api.<domain> | <domain>/kruise/api |
| 数据面 | sandbox-gateway | 将流量代理进运行中的 Sandbox(envoy filter) | <port>-<sandboxID>.<domain> | <domain>/kruise/<sandboxID>/<port> |
- 控制面使用 API Key 鉴权,返回 Sandbox 地址及其数据面凭证。
- 数据面承载真正的命令、文件、代码执行以及自定义服务流量。
sandbox-gateway将每个请求路由到目标 Sandbox,默认 转发到监听49983端口的agent-runtime(envd)sidecar。命令和文件操作需要注入agent-runtime,参见 Runtime 注入。 - 当控制面请求到达
sandbox-gateway时,它会将请求转发给sandbox-manager。因此 gateway Service 可以作为两个平面在7788端口上的单一入口。
数据面路由
sandbox-gateway 按以下优先级解析目标 Sandbox:
- 基于 Header(优先)。 设置
e2b-sandbox-id(必填)和e2b-sandbox-port(可选,默认为 envd 端口49983)。 Header 路由不依赖 DNS 泛解析,也是各 SDK 底层使用的方式。 - 基于域名(兜底)。 原生协议主机名
<port>-<sandboxID>.<domain>,或私有协议路径<domain>/kruise/<sandboxID>/<port>。
<sandboxID> 默认为 namespace--name;启用短 Sandbox ID 后则为不透明的短 ID。请将其视为精确匹配的
不透明值。
原生协议基于主机名的路由需要泛域名 DNS(
*.<domain>)和泛域名证书。私有协议只需要单一域名和单一证书,降低了测试与 快速集成的部署门槛。
访问凭证
不同凭证保护不同的平面。它们都属于敏感信息:不要写入日志,也不要存进 Sandbox metadata。
| 凭证 | 保护对象 | Header / 环境变量 | 来源 |
|---|---|---|---|
| API Key | 控制面 | X-API-KEY 头、E2B_API_KEY 环境变量 | 以 adminApiKey 引导,或通过 API Key 端点按团队签发 |
| envd 访问令牌 | 数据面(静态) | X-Access-Token | create 响应中以 envdAccessToken 返回;与 Sandbox 生命周期绑定 |
| 流量访问令牌 | 数据面(JWT) | E2B-Traffic-Access-Token | 短期、可刷新的 JWT;参见流量访问令牌轮换 |
| Runtime 令牌 | 数据面(直连 envd) | X-Access-Token | 存储在 Sandbox CR 注解 agents.kruise.io/runtime-access-token 上 |
- API Key。 每一次对
sandbox-manager的管理调用都要设置X-API-KEY。原生 E2B SDK 从E2B_API_KEY读取。管理员 Key 拥有更高权限;日常工作请优先使用按团队划分范围的 Key。E2B SDK >= 2.25.0 会在客户端校验e2b_[0-9a-f]+的 Key 格式;旧版 Key 的处理方式参见 API Key 与团队管理。 - envd 访问令牌(静态)。 与 Sandbox 绑定的长期不透明令牌。原生 E2B SDK 会在
run_code、commands、files调用中 自动注入,因此大多数客户端无需直接处理它。它在 Sandbox 被删除前一直有效。 - 流量访问令牌(JWT)。 静态令牌的可选替代,短期、可刷新,按 Sandbox 启用。它将重放风险限制在 JWT 有效期窗口内。刷新 行为和客户端要求见流量访问令牌轮换。
- Runtime 令牌。 仅由 Runtime SDK 使用,它直连 envd。当具备 kubeconfig 或集群内访问能力时, Runtime 客户端可以直接从 Sandbox CR 注解读取该令牌。
访问方式
根据部署方式以及所需的 E2B 能力范围选择合适的 SDK。
| 方式 | 包 | 路由 | 适用场景 |
|---|---|---|---|
| 原生 E2B SDK | e2b、e2b-code-interpreter | 域名 / Header | 标准生产集成,完整 E2B API |
| 私有协议 SDK | kruise_agents.patch_e2b | 路径(/kruise/...) | 单域名部署、测试、快速集成 |
| Runtime SDK | github.com/openkruise/agents-api/runtime | 直连 envd | 直接对运行中的 Sandbox 执行命令和文件操作 |
安装 Python 客户端:
# 原生 E2B SDK
pip install "e2b" "e2b-code-interpreter"
# OpenKruise Agents 私有协议扩展,来自 agents-api 仓库。
# 将 <version> 替换为 agents-api 的发布标签。
pip install "git+https://github.com/openkruise/agents-api.git@<version>#subdirectory=e2b/python"
1. 原生 E2B SDK
标准集成方式。客户端从控制面解析 Sandbox,并通过 *.<domain>(或等价的 Header)发送数据面流量。设置域名和 API Key 后,
按常规方式使用 SDK:
export E2B_DOMAIN=your.domain.com
export E2B_API_KEY=<your-api-key>
from e2b_code_interpreter import Sandbox
sbx = Sandbox.create(template="code-interpreter")
print("sandbox id:", sbx.sandbox_id)
execution = sbx.run_code("print('hello, world')")
print("run code result:", execution)
# Sandbox 内监听 8000 端口的服务访问 URL
print(sbx.get_host(8000))
sbx.kill()
envdAccessToken 会自动返回并注入到 run_code、commands、files 调用中,无需手动处理令牌。原生协议部署需要泛域名 DNS
和泛域名证书,参见使用 E2B SDK。
2. 私有协议 SDK
私有协议只保留单一域名并按路径路由(<domain>/kruise/<sandboxID>/<port>),因此只需要一张证书。请在导入 E2B Sandbox 类
之前应用补丁:
export E2B_DOMAIN=your.domain.com
export E2B_API_KEY=<your-api-key>
from kruise_agents.patch_e2b import patch_e2b
patch_e2b(https=True) # 从集群外通过 HTTPS 访问
from e2b_code_interpreter import Sandbox
sbx = Sandbox.create(template="code-interpreter")
execution = sbx.run_code("print('hello, world')")
print(execution)
sbx.kill()
- 对于集群内访问或本地端口转发(TLS 在别处终止)的场景,使用
patch_e2b(https=False)。 - 若要在 E2B SDK >= 2.25.0 上复用旧版(非
e2b_)API Key,传入validate_key=False:patch_e2b(https=True, validate_key=False)。 - 若需要自动刷新 JWT,在
patch_e2b之后追加流量令牌补丁,参见 流量访问令牌轮换。
3. Runtime SDK(直连 envd)
Runtime SDK 绕过 E2B 协议,直接操作运行中 Sandbox 内的 envd 服务,用于命令执行和文件操作。它只使用 Scheme + Domain
(没有协议路径),并通过 X-Access-Token 携带 Runtime 令牌鉴权。这是一个 Go 客户端;完整 API 参见
Runtime 客户端,Java 绑定参见
Runtime 客户端(Java)。
package main
import (
"context"
"fmt"
"github.com/openkruise/agents-api/runtime"
)
func main() {
ctx := context.Background()
// 集群内:"sandbox-gateway.sandbox-system.svc:7788"
// 本地调试:"127.0.0.1:7788"(端口转发之后)
domain := "sandbox-gateway.sandbox-system.svc:7788"
// NewFromK8s 会从 Sandbox CR 注解 agents.kruise.io/runtime-access-token
// 解析 sandboxID 和 Runtime 令牌。
c, err := runtime.NewFromK8s(ctx, "default", "your-sandbox-name",
runtime.WithDomain(domain),
)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
res, _ := c.Commands.Run(ctx, "uname -a")
fmt.Println(res.Stdout)
}
当没有 kubeconfig 访问能力时,使用 runtime.New 构建客户端,并通过 runtime.WithRuntimeToken(<token>) 显式传入令牌。
端口转发到本地调试
端口转发将集群内的 Service 映射到 localhost,让你无需公网 DNS 和证书即可在本地工作站上迭代。
E2B / 私有协议客户端
sandbox-gateway 会将控制面请求转发给 sandbox-manager,因此只转发 gateway Service 即可覆盖两个平面。通过
E2B_API_URL 和 E2B_SANDBOX_URL 将两个平面指向同一个本地地址(参见
使用 E2B SDK):
export E2B_API_KEY=<your-api-key>
# 一次转发覆盖两个平面:gateway 会将管控流量转发给 sandbox-manager。
export E2B_API_URL="http://localhost:7788"
export E2B_SANDBOX_URL="http://localhost:7788"
kubectl port-forward services/sandbox-gateway 7788:7788 -n sandbox-system
from e2b import Sandbox
sbx = Sandbox.create(template="code-interpreter")
print(sbx.commands.run("echo hello").stdout) # 数据面经由转发后的 gateway
sbx.kill()
上层库 e2b-code-interpreter 和 e2b-desktop 不读取 E2B_API_URL / E2B_SANDBOX_URL,因此该本地调试配置请使用基础
e2b Sandbox。
Runtime SDK 客户端
同一条转发同样适用;让客户端指向本地地址即可:
kubectl port-forward services/sandbox-gateway 7788:7788 -n sandbox-system
c, _ := runtime.NewFromK8s(ctx, "default", "your-sandbox-name",
runtime.WithDomain("127.0.0.1:7788"),
runtime.WithScheme("http"),
)
相关文档
- 使用 E2B SDK —— 域名、TLS、多域名及所有集成方式
- API Key 与团队管理 —— 控制面凭证与 Key 管理
- 流量访问令牌轮换 —— JWT 数据面令牌与刷新
- E2B 网络管控 —— 出方向限制与 Header 变换
- Runtime 注入 —— 启用
agent-runtime以支持命令和文件 API - Runtime 客户端 —— 完整的 Runtime SDK 参考