本文介绍如何创建并使用支持ACS定制SDK访问的 ACS 沙箱环境。使用ACS定制的SDK,可以规避E2B原生SDK需要泛域名的限制,降低部署的复杂度。
准备工作
升级
acs-virtual-node组件至 v2.17.0 及以上版本。升级
Kube Scheduler组件版本。集群版本
Kube Scheduler组件版本v1.28
v1.28.12-aliyun-1.4.6及以上
v1.30
v1.30.3-aliyun-1.6.2及以上
v1.31
v1.31.0-aliyun-1.5.2及以上
v1.32
v1.32.0-apsara.6.11.11.3187ac8f及以上
升级
ack-agent-sandbox-controller组件至 v0.5.2 及以上版本。升级
ack-sandbox-manager组件至 v0.3.2 及以上版本。
安装组件
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择组件管理。
安装Ingress Controller组件:安装ACS支持的任一Ingress Controller组件,用于从集群外部访问
sandbox-manager服务。本文以安装ALB Ingress Controller为例,新建一个公网类型的ALB实例。安装
ack-agent-sandbox-controller组件:使用默认配置安装组件,组件版本需v0.5.2及以上。安装
ack-sandbox-manager组件:待以下环境配置完成后,修改className为alb(即步骤1中自动创建的IngressClass),修改domain为实际域名,修改adminApiKey为自定义API Key,其他配置保持默认。组件安装完成后会在sandbox-system命名空间中创建一个名为sandbox-manager的路由。Demo环境配置:
获取ALB DNS名称:通过自定义资源查看AlbConfig资源对象
alb的YAML信息或kubectl get albconfig alb -o jsonpath='{.status.loadBalancer.dnsname}'命令获取ALB DNS名称,如alb-*****62roo70i*****.cn-hangzhou.alb.aliyuncsslb.com,修改domain为该DNS名称。更新
sandbox-manager路由:在sandbox-system命名空间中点击sandbox-manager路由右侧的更新进行配置,临时关闭TLS配置。更新完成后等待约1分钟后刷新路由页面,将显示该路由的端点信息。
生产环境配置:准备域名、域名解析和申请证书的详细操作,请参见应用于生产环境。若使用ALB Ingress Controller还需为ALB实例和Ingress新增HTTPS:443监听配置。
创建沙箱环境
兼容E2B SDK方式
以下步骤先通过SandboxSet创建E2B模板,再使用ACS定制E2B Python SDK创建沙箱环境。
步骤一:使用SandboxSet创建E2B模板并预热
单击左侧导航栏自定义资源,选择资源定义(CustomResourceDefinition)页签,单击使用YAML创建资源。
使用以下YAML创建一个 SandboxSet 资源来向
ack-sandbox-manager注册一个名为code-interpreter的 E2B 模板。该模板基于 E2B 官方 code-interpreter 镜像制作,用于执行 Python 代码。apiVersion: agents.kruise.io/v1alpha1 kind: SandboxSet metadata: name: code-interpreter namespace: default spec: scaleStrategy: maxUnavailable: 500 replicas: 10 # 预热池的大小,建议比预估的请求突发量略大 template: # metadata: # annotations: # 可选, 不填则使用acs-profile中的安全组配置, # 需确保对应安全组有足够的可用IP,至少需要大于replicas # IP不足会导致sandbox创建缓慢甚至失败 # network.alibabacloud.com/security-group-ids: sg-8****** # labels: # 可选,用于在 ACK 集群中将沙箱 Pod 调度到 ACS # alibabacloud.com/acs: "true" spec: initContainers: # 以 native-sidecar 形式声明 agent-runtime,自动给沙箱容器注入 envd 等运行时组件 - name: runtime image: registry-cn-hangzhou-vpc.ack.aliyuncs.com/acs/agent-runtime:v0.0.5 command: [ "sh", "/workspace/entrypoint_inner.sh" ] volumeMounts: # 与主容器的共享目录 - name: envd-volume mountPath: /mnt/envd env: - name: ENVD_DIR value: /mnt/envd # 这个环境变量使得 sidecar 共享主容器的资源,不产生额外费用 - name: __IGNORE_RESOURCE__ value: "true" restartPolicy: Always containers: - name: sandbox # 官方维护的 e2b code-interpreter 镜像,支持全地域、vpc 拉取 image: registry-cn-hangzhou-vpc.ack.aliyuncs.com/acs/code-interpreter:v1.6 imagePullPolicy: IfNotPresent # 推荐设置资源需求,否则在 ACS 环境下会被设置成超小规格影响运行 resources: limits: cpu: 1 memory: 1Gi requests: cpu: 1 memory: 1Gi startupProbe: failureThreshold: 10 httpGet: path: /health port: 49999 initialDelaySeconds: 1 periodSeconds: 2 timeoutSeconds: 1 env: # 指定 runtime 注入的 envd 组件位置 - name: ENVD_DIR value: /mnt/envd volumeMounts: # 与 runtime 的共享目录 - name: envd-volume mountPath: /mnt/envd # 通过 post start hook 启动 envd 服务 lifecycle: postStart: exec: command: [ "/bin/bash", "-c", "/mnt/envd/envd-run.sh" ] # 保证容器快速销毁,提高复用的概率 terminationGracePeriodSeconds: 1 volumes: - name: envd-volume emptyDir: { }单击左侧导航栏容器组,选择
default命名空间,查看已经创建并预热的code-interpreter沙箱环境Pod。
步骤二:使用ACS定制E2B Python SDK创建沙箱环境
安装E2B Python SDK。
pip install e2b-code-interpreter==2.4.1配置环境变量。
# 使用安装ack-sandbox-manager组件时默认的域名,不需要带*,可按实际配置修改 export E2B_DOMAIN=your.domain.com # 使用安装ack-sandbox-manager组件时默认的API Key,可按实际配置修改 export E2B_API_KEY=admin-987654321执行
git clone https://github.com/openkruise/agents.git命令,下载ACS定制SDK至本地。进入本地定制SDK的
/agents/sdk/customized_e2b目录,将以下代码保存为main.py文件。# Import the E2B SDK from e2b_code_interpreter import Sandbox from kruise_agents.patch_e2b import patch_e2b patch_e2b(https=False) # patch sdk sbx: Sandbox = Sandbox.create(template="code-interpreter") print(f"sandbox id: {sbx.sandbox_id}") result = sbx.run_code("print('hello, world')") print(f"run code result: {result}") text = input("enter some text to be saved to file 'text.txt' inside sandbox: ") sbx.files.write("text.txt", text) print(f"read file from sandbox via files api: [{sbx.files.read('text.txt')}]") print(f"read file from sandbox via commands api: [{sbx.commands.run('cat text.txt')}]") input("press ENTER to kill the sandbox") print(sbx.kill())运行
main.py文件,创建并验证沙箱环境。在第一次出现提示后,输入文字如
acs agent sandbox,然后按ENTER键,会在名为code-interpreter-29***的Pod的/home/user/text.txt文件中写入acs agent sandbox;若再次按ENTER键,则会删除当前沙箱环境。python main.py预期输出:
sandbox id: default--code-interpreter-29*** run code result: Execution(Results: [], Logs: Logs(stdout: ['hello, world\n'], stderr: []), Error: None) enter some text to be saved to file 'text.txt' inside sandbox: acs agent sandbox read file from sandbox via files api: [acs agent sandbox] read file from sandbox via commands api: [CommandResult(stderr='', stdout='acs agent sandbox', exit_code=0, error='')] press ENTER to kill the sandbox True
Sandbox CR方式
单击左侧导航栏自定义资源,选择资源定义(CustomResourceDefinition)页签,单击使用YAML创建资源。
使用以下YAML创建一个 Sandbox 资源对象,该资源对象基于 E2B 官方 code-interpreter 镜像制作,用于执行 Python 代码。
apiVersion: agents.kruise.io/v1alpha1 kind: Sandbox metadata: name: code-interpreter spec: template: metadata: labels: agent: code-interpreter spec: initContainers: # 以 native-sidecar 形式声明 agent-runtime,自动给沙箱容器注入 envd 等运行时组件 - name: runtime image: registry-cn-hangzhou-vpc.ack.aliyuncs.com/acs/agent-runtime:v0.0.5 command: [ "sh", "/workspace/entrypoint_inner.sh" ] volumeMounts: # 与主容器的共享目录 - name: envd-volume mountPath: /mnt/envd env: - name: ENVD_DIR value: /mnt/envd # 这个环境变量使得 sidecar 共享主容器的资源,不产生额外费用 - name: __IGNORE_RESOURCE__ value: "true" restartPolicy: Always containers: - name: sandbox image: registry-cn-hangzhou-vpc.ack.aliyuncs.com/acs/code-interpreter:v1.6 imagePullPolicy: IfNotPresent resources: requests: cpu: 1 memory: 1Gi ephemeral-storage: 30Gi startupProbe: failureThreshold: 10 httpGet: path: /health port: 49999 initialDelaySeconds: 1 periodSeconds: 2 timeoutSeconds: 1 env: # 指定 runtime 注入的 envd 组件位置 - name: ENVD_DIR value: /mnt/envd volumeMounts: # 与 runtime 的共享目录 - name: envd-volume mountPath: /mnt/envd # 通过 post start hook 启动 envd 服务 lifecycle: postStart: exec: command: [ "/bin/bash", "-c", "/mnt/envd/envd-run.sh" ] # 保证容器快速销毁,提高复用的概率 terminationGracePeriodSeconds: 1 volumes: - name: envd-volume emptyDir: { }单击左侧导航栏容器组,选择
default命名空间,查看已经创建的code-interpreter沙箱环境。
应用于生产环境
准备域名
ACS定制SDK支持非泛域名,可参考添加/删除内网权威域名 (Zone)配置域名your.domain.com和*.your.domain.com,并解析到Ingress的地址;如果访问完全在ACS集群内部,也可以直接使用集群内Headless Service地址:sandbox-manager.sandbox-system.svc.cluster.local。
域名解析
通过以下命令查看接入点信息:
kubectl get ingress sandbox-manager -o jsonpath='{range .status.loadBalancer.ingress[*]}{.hostname}{.ip}{"\n"}{end}' -n sandbox-system根据输出的接入点信息,配置域名 your.domain.com 或者 *.your.domain.com 的解析。更多域名解析相关的操作,请参见快捷入口。
如果输出的是一个 IP 地址(如
47.114.***.***),请将主机记录*.your.domain.com以 A 记录类型解析到该 IP。如果输出的是一个域名(如
alb-*****62roo70i*****.cn-hangzhou.alb.aliyuncsslb.com),请将主机记录*.your.domain.com以 CNAME 记录类型解析到对应域名。如果输出多个接入点,将记录解析到其中任意一个接入点,或为所有接入点配置轮询均可。
申请证书
E2B 客户端可以通过 HTTPS 协议请求后端。在生产场景下,推荐使用以下方式申请证书。