本文介绍如何在创建Agent Sandbox时为沙箱挂载OSS或NAS静态存储卷。
前提条件
已完成Agent Sandbox的基础环境搭建,具体操作,请参见创建Agent Sandbox。
在集群组件管理中,确认
ack-agent-sandbox-controller组件版本为v0.5.10及以上。在集群的
sandbox-system命名空间内存在一份名为sandbox-injection-config的ConfigMap对象,该对象在组件安装后默认带有初始配置项。如需特殊定制或配置修改,请在修改前联系阿里云技术支持评估配置的完备性。在集群组件管理中,确认
ack-sandbox-manager组件版本为v0.5.0及以上。
该功能通过白名单开放中,如需使用,请提交工单。
使用限制
支持基于E2B接口的create功能、休眠/唤醒功能以及原地升级镜像后的运行时存储挂载,但目前不支持基于Checkpoint机制创建快照后恢复存储挂载。
若挂载NAS共享存储并配合休眠/唤醒功能,将导致沙箱的休眠能力失效。
目前OSS静态存储挂载仅支持AccessKey鉴权方式。
在配置网络策略或流量策略时,请务必确保已放行访问 OSS/NAS 管控端点的出方向流量。
挂载共享存储
ACS支持在调用Sandbox.create或Sandbox.beta_create接口时,为沙箱在运行时挂载一个存储卷(PV),如阿里云NAS等。此功能依赖agent-runtime组件。
步骤一:配置存储挂载能力
ACS提供动态注入Sidecar的配置方案。您只需在SandboxSet或Sandbox对象上设置spec.runtimes参数,框架会在Sandbox被创建时自动注入所需的CSI配置,包括agent-runtime和存储相关的CSI Sidecar配置。
以下为SandboxSet配置示例:
apiVersion: agents.kruise.io/v1alpha1
kind: SandboxSet
metadata:
name: code-interpreter-inject-test
namespace: default
spec:
runtimes:
- name: csi # 使能CSI挂载能力,新建的Sandbox会被注入对应的Sidecar
- name: agent-runtime # 注入envd等环境管理工具
replicas: 4
template:
metadata:
labels:
alibabacloud.com/acs: "true"
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
terminationGracePeriodSeconds: 30以下为Sandbox对象的配置示例:
apiVersion: agents.kruise.io/v1alpha1
kind: Sandbox
metadata:
name: code-interpreter-inject-test-xxx
namespace: default
spec:
runtimes:
- name: csi # 提供CSI挂载能力
- name: agent-runtime # 注入envd等环境管理工具
...步骤二:创建存储卷
根据您的存储需求,在集群中创建对应的PV对象。以下分别介绍OSS和NAS静态存储卷的创建方法。
创建OSS存储卷
创建一份描述OSS的PersistentVolume对象和对应的访问密钥Secret对象。更多信息,请参见使用OSS静态存储卷。
apiVersion: v1
kind: Secret
metadata:
name: oss-secret
# 密钥对象仅允许在sandbox-system命名空间
namespace: sandbox-system
stringData:
akId: <YOUR_ACCESS_KEY_ID> # 访问OSS的AccessKey ID
akSecret: <YOUR_ACCESS_KEY_SECRET> # 访问OSS的AccessKey Secret
---
apiVersion: v1
kind: PersistentVolume
metadata:
labels:
alicloud-pvname: oss-pv-sandbox-system
name: oss-pv-sandbox-system
spec:
accessModes:
- ReadWriteMany
capacity:
storage: 50Gi
csi:
driver: ossplugin.csi.alibabacloud.com
nodePublishSecretRef:
name: oss-secret
namespace: sandbox-system
volumeAttributes:
bucket: <OSS_BUCKET> # 替换为OSS上的实际的Bucket名称
otherOpts: -o umask=022 -o allow_other
url: <OSS_ENDPOINT> # OSS访问端点,请替换为实际OSS Endpoint地址
volumeHandle: oss-pv-sandbox-system
persistentVolumeReclaimPolicy: Retain
storageClassName: test
volumeMode: Filesystem创建NAS存储卷
创建NAS的PersistentVolume资源。NAS存储不支持公网挂载,您需要提前在NAS控制台配置挂载点。更多信息,请参见使用NAS静态存储卷。
apiVersion: v1
kind: PersistentVolume
metadata:
labels:
alicloud-pvname: nas-pv-sandbox-system
name: nas-pv-sandbox-system
spec:
accessModes:
- ReadWriteMany
capacity:
storage: 5Gi
csi:
driver: nasplugin.csi.alibabacloud.com
volumeAttributes:
# 替换成实际的NAS挂载点地址,挂载点所属VPC必须与集群所属VPC一致。
server: xxx.xxx.extreme.nas.aliyuncs.com
# 挂载NAS的目录地址
path: /share
volumeHandle: nas-pv-sandbox-system
mountOptions:
- nolock,tcp,noresvport
- vers=3
persistentVolumeReclaimPolicy: Retain
volumeMode: Filesystem步骤三:通过E2B SDK挂载存储卷
挂载单个存储卷
您可以参考以下Python代码,从预热池中获取Sandbox后,将存储卷挂载到沙箱内的指定目录。
挂载OSS存储卷示例
from e2b_code_interpreter import Sandbox
sbx = Sandbox.create(template="code-interpreter-inject-test", timeout=300, metadata={
"e2b.agents.kruise.io/csi-volume-name": "oss-pv-sandbox-system", # OSS的PersistentVolume名称
"e2b.agents.kruise.io/csi-mount-point": "/data-oss",
"e2b.agents.kruise.io/csi-subpath": "data-subPath" # 相对路径,表示在OSS Bucket内的相对子目录
})挂载NAS存储卷示例
from e2b_code_interpreter import Sandbox
sbx = Sandbox.create(template="code-interpreter-inject-test", timeout=300, metadata={
"e2b.agents.kruise.io/csi-volume-name": "nas-pv-sandbox-system",
"e2b.agents.kruise.io/csi-mount-point": "/data-nas",
"e2b.agents.kruise.io/csi-subpath": "data-subPath"
})如遇504响应问题,请前往修改sandbox-injection-config,将registry-cn-zhangjiakou-vpc.ack.aliyuncs.com/acs/csi-agent:v1.35.3-cgroupv1-dport-forbidden替换为registry-cn-zhangjiakou-vpc.ack.aliyuncs.com/acs/csi-agent:v1.35.4-3c34d4a-aliyun,再重新创建Sandbox即可。metadata参数说明如下:
参数 | 说明 |
| 指定PersistentVolume对象的名称。 |
| 指定存储卷在容器内的挂载目录。 |
| 指定存储卷在远端存储内的子目录名(相对路径)。 |
挂载多个存储卷
如果需要一次挂载多个存储卷,可以使用e2b.agents.kruise.io/csi-volume-config参数,通过JSON数组格式指定多个挂载配置。
若同时配置了e2b.agents.kruise.io/csi-volume-config(新协议)和单卷挂载参数(旧协议),新协议的优先级高于旧协议。以下为同时挂载多个存储卷的Python代码示例:
from e2b_code_interpreter import Sandbox
sbx = Sandbox.create(template="code-interpreter-inject-test", timeout=600, metadata={
"e2b.agents.kruise.io/csi-volume-config": '[{"pvName":"pv-nas-fast","mountPath":"/data-nas","subPath":"data-subPath","readOnly":true},{...}]'
})
print(f"sandbox id: {sbx.sandbox_id}")csi-volume-config相关配置说明如下:
字段 | 类型 | 说明 |
| String | PersistentVolume对象名称。 |
| String | 期望挂载到容器内的目录路径。 |
| String | 远端存储的子目录名(相对路径),可选。 |
| Boolean | 是否以只读方式挂载,可选,默认为false。 |