本文介绍如何在ACS集群中创建 Agent Sandbox(沙箱),完成组件安装、预热池创建、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 和 Sandbox 相关组件。
安装Ingress Controller组件
安装ACS支持的任一Ingress Controller组件,用于从集群外部访问
sandbox-manager服务。后续步骤以安装ALB Ingress Controller为例,新建一个公网类型的ALB实例。安装
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监听配置。
创建Agent Sandbox
步骤一:通过 SandboxSet 创建预热池
预热池是一组预先创建的 Sandbox 副本,由 SandboxSet CR 管理。应用从预热池中直接获取已就绪的 Sandbox,可显著提高交付效率。
单击左侧导航栏自定义资源,选择资源定义(CustomResourceDefinition)页签,单击使用YAML创建资源。
使用以下 YAML 创建 SandboxSet 资源。ack-sandbox-manager 会自动监听并识别该资源,同步初始化名为 code-interpreter 的沙箱模板配置。
在YAML中添加
alibabacloud.com/compute-class: agent-sandbox标签即指定使用Agent Sandbox实例类型。apiVersion: agents.kruise.io/v1alpha1 kind: SandboxSet metadata: name: code-interpreter namespace: default spec: scaleStrategy: maxUnavailable: 500 # 预热池的大小,建议比预估的请求突发量略大 replicas: 10 # 可选,创建的沙箱在休眠、唤醒过程中需要保留的内容 # persistentContents: # - ip # Sandbox 模板,与 Sandbox CRD 一致 template: metadata: # annotations: # 可选,不填则使用acs-profile中的安全组配置, # 需确保对应安全组有足够的可用IP,至少需要大于replicas # IP不足会导致sandbox创建缓慢甚至失败 # network.alibabacloud.com/security-group-ids: sg-8****** labels: # 使用 ACS 算力 alibabacloud.com/acs: "true" alibabacloud.com/compute-class: agent-sandbox # Agent Sandbox 实例类型 alibabacloud.com/compute-qos: default # 算力质量 default/best-effort spec: initContainers: # 以 native-sidecar 形式声明 agent-runtime,自动给Sandbox容器注入 envd 等运行时组件 - name: runtime image: registry-cn-zhangjiakou-vpc.ack.aliyuncs.com/acs/agent-runtime:v0.0.5 # 请将 cn-zhangjiakou 替换为实际地域ID 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-zhangjiakou-vpc.ack.aliyuncs.com/acs/code-interpreter:v1.6 # 请将 cn-zhangjiakou 替换为实际地域ID 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: { }单击左侧导航栏容器组,选择对应的命名空间,查看已创建的
code-interpreterSandbox。可通过
kubectl get sbs命令查看 SandboxSet 资源,其中AVAILABLE表示已就绪的 Sandbox 数量。当一个 Sandbox 被获取后,SandboxSet 会自动触发补充流程,以维持库存数量。
步骤二:获取Agent Sandbox
E2B SDK方式
在本地环境中安装Python。
安装E2B Python SDK。
pip install e2b-code-interpreter配置环境变量。
# 使用安装ack-sandbox-manager组件时默认的域名,不需要带*,可按实际配置修改 export E2B_DOMAIN=your.domain.com # 使用安装ack-sandbox-manager组件时默认的API Key,可按实际配置修改 export E2B_API_KEY=admin-987654321将以下代码保存为
main.py文件。# Import the E2B SDK from e2b_code_interpreter import Sandbox 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文件,创建并验证Sandbox。在第一次出现提示后,输入文字如
acs agent sandbox,然后按ENTER键,会在名为code-interpreter-29***的Pod的/home/user/text.txt文件中写入acs agent sandbox;若再次按ENTER键,则会删除当前 Sandbox。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
SandboxClaim方式
单击左侧导航栏自定义资源,选择资源定义(CustomResourceDefinition)页签,单击使用YAML创建资源。
使用以下YAML创建 SandboxClaim 资源获取Sandbox。
apiVersion: agents.kruise.io/v1alpha1 kind: SandboxClaim metadata: name: code-interpreter # SandboxSet 的名字 namespace: default # SandboxSet 的命名空间 spec: templateName: code-interpreter # 指定 SandboxSet 的名字 replicas: 1 # 期望从 SandboxSet 中获取的沙箱数量 claimTimeout: 5m # 指定 SandboxClaim 的超时时间 ttlAfterCompleted: 15m # 指定 SandboxClaim 完成后的 TTL 时间。任务完成后,经过 TTL 时间,SandboxClaim 资源会被删除(获取到的沙箱不会被删除)。单击左侧导航栏容器组,选择
default命名空间,查看新获取的名为code-interpreter-xxxxx的 Sandbox。可通过
kubectl get sbx -l agents.kruise.io/claim-name=code-interpreter命令获取 Sandbox状态。
开发者还可通过Kubernetes SDK方式来操作Sandbox资源。
替换Agent Sandbox容器镜像
E2B SDK方式
参考以下Python代码,替换<YOUR_IMAGE>为实际的镜像地址,从预热池中取出Sandbox后,通过metadata参数将容器镜像替换为指定镜像。
from e2b_code_interpreter import Sandbox
sbx = Sandbox.create(template="some-template", timeout=300, metadata={
# 将沙箱容器的镜像原地替换为指定镜像
"e2b.agents.kruise.io/image": "<YOUR_IMAGE>"
})SandboxClaim方式
替换以下<YOUR_IMAGE>为实际的镜像地址。
apiVersion: agents.kruise.io/v1alpha1
kind: SandboxClaim
metadata:
name: my-sandbox-claim
namespace: default
spec:
templateName: code-interpreter # 指定SandboxSet预热池名称
replicas: 1
claimTimeout: 5m
ttlAfterCompleted: 15m
inplaceUpdate:
# 期望升级的目标镜像
image: <YOUR_IMAGE> # 请将 cn-zhangjiakou 替换为实际地域ID 删除Sandbox
如需彻底移除实例,可通过以下方式删除沙箱。
E2B SDK方式
通过E2B SDK删除沙箱实例:将以下<YOUR_SANDBOX_ID>替换成实际的沙箱id。
from e2b_code_interpreter import Sandbox
sandbox = Sandbox.connect("<YOUR_SANDBOX_ID>")
sandbox.kill()Sandbox CR方式
# 执行前请将 <NAMESPACE> 替换为资源对应的命名空间,<RESOURCE_NAME>替换为实际的CR名称
kubectl -n <NAMESPACE> delete sandbox <RESOURCE_NAME>应用于生产环境
准备域名
可参考添加/删除内网权威域名 (Zone)配置域名your.domain.com和*.your.domain.com,并解析到Ingress的地址;如果访问完全在ACS集群内部,也可以直接使用集群内Headless Service地址:sandbox-manager.sandbox-system.svc.cluster.local。
申请证书
E2B 客户端可以通过 HTTPS 协议请求后端。在生产场景下,推荐使用以下方式申请证书。
(推荐)方式一: 使用 cert-manager 管理证书
方式二:使用自签证书
方式三:采用正式证书(以 Let's Encrypt 为例)
域名解析
通过以下命令查看接入点信息:
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 记录类型解析到对应域名。如果输出多个接入点,将记录解析到其中任意一个接入点,或为所有接入点配置轮询均可。
