运行 E2B 代码执行沙箱
该示例演示了如何通过 OpenKruise Agents 部署 E2B code-interpreter 沙箱并通过 E2B SDK 进行调用。
0. 基本概念
Sandbox
Sandbox 是 OpenKruise Agents 的核心 CRD。它管理一个沙箱实例(比如一个 Pod)的生命周期,并提供
Pause、Resume、Checkpoint、Fork、原地升级
等高级功能。
SandboxSet
SandboxSet 是管理 Sandbox 的工作负载。其作用类似管理 Pod 的 ReplicaSet。SandboxSet 通过预热一批沙箱实例以沙箱的秒级启动。
这个工作负载针对扩容性能特别优化,能够及时地补充被消耗的沙箱。
sandbox-manager
sandbox-manager 是一个无状态的后端管控组件,提供了一套兼容 E2B 协议的 API,用于管理与操作沙箱实例。
agent-runtime
agent-runtime 是注入到 Sandbox 中的一个 Sidecar,为沙箱提供一系列高级功能,包括兼容 E2B envd 的远程操作接口、动态 CSI
挂载等。
1. 定义模板
OpenKruise Agents 提供了兼容 E2B 协议的后端管控组件 sandbox-manager,使得用户可以直接通过原生的 E2B SDK 管理与操作沙箱。该示例中,
我们将在 K8s 集群中部署一个 E2B 官方的 code-interpreter 模板。
1.1 通过 SandboxSet 部署预热池
SandboxSet 作为管理 Sandbox 的工作负载,将会自动被 sandbox-manager
作为模板所识别。您可以参考 sandboxset.yaml
在 K8s 中创建一个 SandboxSet,以创建一个名为 code-interpreter 的模板。
1.2 使用自定义镜像
agent-runtime 提供了兼容 E2B 的接口,支持其命令执行、文件操作、代码运行等功能。如果官方的镜像不满足需求,您可以替换为自定义的镜像。
1.3 跨 Namespace 部署模板
您可以通过在多个 Namespace 中创建多个 同名 的 SandboxSet 来实现模板的跨 Namespace 部署。这在超大规模的预热场景下,可以有效降低集群压力。
2. 通过 E2B Python SDK 使用沙箱
您可以通过以下环境变量将原生 E2B Python SDK 与 JavaScript SDK 连接到 sandbox-manager。在本节中,将以 Python SDK 为例进行介绍。
域名与初始 API Token 请在安装时通过 helm value 配置
export E2B_DOMAIN=your.domain
export E2B_API_TOKEN=your-token
您可以通过以下命令安装 E2B code interpreter Python SDK:
pip install e2b-code-interpreter
2.1 E2B 标准能力
sandbox-manager 兼容 E2B 的标准能力,包括管控与沙箱实例操作。下面这个例子展示了通过 E2B SDK 进行创建沙箱、执行代码、操作文件、执行命令等功能。
2.1.1 创建与删除
通过以下代码可以从预热池中快速分配一个沙箱实例。完成分配的同时,SandboxSet 将会立刻创建一个新的沙箱实例进行补充。
import os
# Import the E2B SDK
from e2b_code_interpreter import Sandbox
# Create a sandbox using the E2B Python SDK
# 这里 template 名字要和 SandboxSet 名字保持一致
sbx = Sandbox.create(template="code-interpreter", timeout=300)
print(f"sandbox id: {sbx.sandbox_id}")
sbx.kill()
print(f"sandbox {sbx.sandbox_id} killed")
2.1.2 执行代码
with Sandbox.create(template="code-interpreter", timeout=300) as sbx:
sbx.run_code("print('hello world')")
2.1.3 操作文件
with Sandbox.create(template="code-interpreter", timeout=300) as sbx:
with open(os.path.abspath(__file__), "rb") as file:
sbx.files.write("/home/user/my-file", file)
file_content = sbx.files.read("/home/user/my-file")
print(file_content)
2.1.4 执行命令
with Sandbox.create(template="code-interpreter", timeout=300) as sbx:
result = sbx.commands.run('echo hello; sleep 1; echo world', on_stdout=lambda data: print(data),
on_stderr=lambda data: print(data))
print(result)
2.1.5 休眠与唤醒
注意:目前,仅在阿里云 ACS 上支持休眠与唤醒的内存状态保留
with Sandbox.create(template="code-interpreter", timeout=300) as sbx:
# Pause the sandbox
sbx.run_code("a = 1")
sbx.beta_pause()
# Resume the sandbox
sbx.connect()
sbx.run_code("print(a)")