本文介绍如何通过E2B SDK接入ACS Agent Sandbox。
背景信息
ACS Agent Sandbox兼容E2B SDK,您可以使用E2B SDK创建、管理和连接Sandbox实例。Agent Sandbox基于OpenKruise Agents实现E2B协议兼容,支持两种E2B协议:
原生协议(Native Protocol):每个Sandbox按端口使用独立子域名,访问格式为
<PORT>-<SANDBOX_ID>.DOMAIN,API入口为api.DOMAIN。需要泛域名DNS解析和TLS证书,适合生产环境。私有协议(Private Protocol):所有Sandbox共享同一域名,通过URL路径区分,访问格式为
DOMAIN/kruise/<SANDBOX_ID>/<PORT>,API入口为DOMAIN/kruise/api。仅需单域名,简化网络配置并降低证书成本。
对比项 | 原生协议 | 私有协议 |
域名要求 | 泛域名( | 单域名( |
TLS证书 | 泛域名证书 | 单域名证书 |
E2B SDK要求 | 原生支持 | 需安装 |
适用场景 | 生产环境 | 测试验证、快速集成 |
安装组件
如已安装组件,请升级ack-agent-sandbox-controller组件版本至v0.5.14-release.1及以上,升级ack-sandbox-manager组件版本至v0.6.0及以上。
登录容器计算服务控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择组件管理。
安装 Ingress Controller 和 Sandbox 相关组件。
安装Ingress Controller组件。
安装ACS支持的任一Ingress Controller组件,用于从集群外部访问
sandbox-manager服务。后续步骤以安装ALB Ingress Controller为例,新建一个公网类型的ALB实例。安装ack-agent-sandbox-controller组件。
首次安装需要先授权AliyunCSManagedAgentSandboxRole角色访问您的云资源,参数可先按照默认设置,如有额外并发需求,可再提升对应资源规格。
关于该组件功能的详细说明,请参见ack-agent-sandbox-controller。
安装ack-sandbox-manager组件。
准备E2B域名。
准备域名、域名解析和申请证书的详细操作,请参见应用于生产环境。
配置组件参数。
修改
className为alb(即安装Ingress Controller组件中自动创建的IngressClass),修改domain为实际域名,修改adminApiKey为自定义API Key,其他配置保持默认。组件安装完成后会在sandbox-system命名空间中创建一个名为sandbox-manager的路由。若使用ALB Ingress Controller,还需同时为ALB实例和Ingress新增HTTPS:443监听配置。
步骤一:创建预热池
单击左侧导航栏自定义资源,选择资源定义(CustomResourceDefinition)页签,单击使用YAML创建资源。
使用以下 YAML 创建 SandboxSet 资源。ack-sandbox-manager 会自动监听并识别该资源,同步初始化名为 code-interpreter 的沙箱模板配置。
启用动态存储挂载功能,需要为容器开放特权容器(Privileged Container)和宿主机路径(hostPath,/var/run/csi)的容器安全验证,可以提交工单放开限制,但由此带来的安全风险需要用户承担一定责任,相关机制请参见安全责任共担模型。
apiVersion: agents.kruise.io/v1alpha1 kind: SandboxSet metadata: name: code-interpreter namespace: default spec: runtimes: - name: csi # 支持CSI挂载能力,新建的Sandbox会被注入对应的Sidecar - name: agent-runtime # 注入envd等环境管理工具 replicas: 4 template: metadata: labels: alibabacloud.com/acs: "true" alibabacloud.com/compute-class: agent-sandbox # Agent Sandbox 实例类型 alibabacloud.com/compute-qos: default # 算力质量 default/best-effort spec: automountServiceAccountToken: false containers: - image: registry-cn-zhangjiakou-vpc.ack.aliyuncs.com/acs/code-interpreter:v1.6 # 替换成实际集群所在的地域 imagePullPolicy: IfNotPresent name: sandbox resources: limits: cpu: "1" memory: 1Gi requests: cpu: "1" memory: 1Gi ephemeral-storage: 30Gi terminationGracePeriodSeconds: 30单击左侧导航栏容器组,选择对应的命名空间,查看已创建的
code-interpreterSandbox。可通过
kubectl get sbs命令查看 SandboxSet 资源,其中AVAILABLE表示已就绪的 Sandbox 数量。
步骤二:安装E2B SDK
E2B SDK目前支持 Python、Java、Go 等多种编程语言。本文以 Python 语言为例进行说明,如需了解其他语言的详细集成指南,请参考e2b-client。
安装Python环境。
安装E2B Python SDK。Agent Sandbox仅支持低于v2.25.0的E2B SDK版本。
pip install "e2b-code-interpreter==2.7.0" "e2b==2.24.0"
步骤三:配置E2B_DOMAIN
E2B_DOMAIN是E2B SDK连接sandbox-manager的域名配置,客户端与组件配置必须一致。
域名的注册与解析请参考云解析DNS。
配置组件
以下示例以ALB Ingress Controller为例,详细操作请参考安装组件及配置。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择组件管理。
在控制台组件管理中,搜索
ack-sandbox-manager组件,单击配置并修改组件的domain参数,请将其修改为您的实际域名。domain参数不带*前缀。例如域名为*.sandbox.example.com,则domain配置为sandbox.example.com。(可选)如仅需通过 HTTP 协议访问 SandboxManager(无需配置 TLS 证书),在同一配置界面取消勾选 Whether to enable TLS for ingress。
配置客户端
在本地环境中设置以下环境变量。
E2B_DOMAIN的值必须与ack-sandbox-manager组件的domain参数完全一致,否则SDK无法连接到sandbox-manager服务。
# 设置E2B_DOMAIN,与组件domain参数保持一致
export E2B_DOMAIN=<YOUR_E2B_DOMAIN>
# 设置E2B_API_KEY,与组件adminApiKey参数保持一致
export E2B_API_KEY=<YOUR_API_KEY>(可选)步骤四:安装证书
如果您需要通过 HTTPS 访问 sandbox-manager,需要安装 TLS 证书。建议使用受信任的CA证书。各种证书申请及配置方式,请参考以下文档:
检查 Secret 是否成功创建以及类型是否正确(应为 kubernetes.io/tls):
kubectl get secret sandbox-manager-tls -n sandbox-system步骤五:选择集成方式连接Sandbox
根据您的网络环境和需求,选择以下集成方式之一连接Sandbox。
以下示例code-interpreter 为占位名,需替换为您实际创建的 SandboxSet 名称。方式一:集群外通过原生协议访问:生产环境推荐,需泛域名和TLS证书。
方式二:集群外通过私有协议访问(HTTPS):单域名即可,降低部署门槛。
方式三:端口转发到本地调试:适合本地开发调试。
方式一:集群外通过原生协议访问
通过泛域名将请求路由到sandbox-manager服务,每个Sandbox使用独立子域名。适合生产环境。
配置泛域名DNS解析,将
*.your.domain.com解析到集群Ingress的外部IP。并为泛域名配置证书。示例代码。
from e2b_code_interpreter import Sandbox sbx = Sandbox.create(template="code-interpreter") print(f"sandbox id: {sbx.sandbox_id}") execution = sbx.run_code("print('hello, world')") print(f"run code result: {execution}") sbx.kill()
方式二:集群外通过私有协议访问(HTTPS)
通过单域名和URL路径区分不同Sandbox,仅需单域名证书即可。适合测试验证和快速集成。
域名的注册与解析请参考云解析DNS。
安装
kruise-agents扩展包。pip install "git+https://github.com/openkruise/agents.git#subdirectory=sdk/customized_e2b"配置单域名DNS解析,将
your.domain.com解析到集群Ingress的外部IP。并为单域名配置证书。示例代码。
使用私有协议时,必须在导入E2B SDK之前调用
patch_e2b(),以将E2B SDK的请求路由切换为私有协议路径。集群外通过HTTPS访问时传入https=True。from kruise_agents.patch_e2b import patch_e2b patch_e2b(https=True) from e2b_code_interpreter import Sandbox sbx = Sandbox.create(template="code-interpreter") print(f"sandbox id: {sbx.sandbox_id}") execution = sbx.run_code("print('hello, world')") print(f"run code result: {execution}") sbx.kill()
方式三:端口转发到本地调试
通过kubectl端口转发将sandbox-manager服务映射到本地,适合本地开发调试。
设置环境变量。
E2B_DOMAIN需与sandbox-manager的domain参数保持一致,均设置为localhost。export E2B_DOMAIN=localhost export E2B_API_KEY=<YOUR_API_KEY>安装
kruise-agents扩展包。pip install "git+https://github.com/openkruise/agents.git#subdirectory=sdk/customized_e2b"将sandbox-manager的Sandbox流量端口转发到本地80端口。
7788为Sandbox流量端口,请根据实际Service端口调整。sudo kubectl port-forward services/sandbox-manager 80:7788 -n sandbox-system使用私有协议,需在导入E2B SDK前调用
patch_e2b(https=False)。示例如下:from kruise_agents.patch_e2b import patch_e2b patch_e2b(https=False) from e2b_code_interpreter import Sandbox sbx = Sandbox.create(template="code-interpreter") print(f"sandbox id: {sbx.sandbox_id}") execution = sbx.run_code("print('hello, world')") print(f"run code result: {execution}") sbx.kill()