Skip to main content

运行 E2B 代码执行沙箱

该示例演示了如何通过 OpenKruise Agents 部署 E2B code-interpreter 沙箱并通过 E2B SDK 进行调用。

0. 基本概念

Sandbox

Sandbox 是 OpenKruise Agents 的核心 CRD。它管理一个沙箱实例(比如一个 Pod)的生命周期,并提供 Pause、Resume、Checkpoint、Fork、原地升级 等高级功能。

SandboxSet

SandboxSet 是管理 Sandbox 的工作负载。其作用类似管理 Pod 的 ReplicaSetSandboxSet 通过预热一批沙箱实例以沙箱的秒级启动。 这个工作负载针对扩容性能特别优化,能够及时地补充被消耗的沙箱。

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)")