全部产品
Search
文档中心

容器计算服务 ACS:在ACS集群中创建Agent Sandbox

更新时间:Mar 31, 2026

本文介绍如何创建并使用支持ACS定制SDK访问的 ACS 沙箱环境。使用ACS定制的SDK,可以规避E2B原生SDK需要泛域名的限制,降低部署的复杂度。

准备工作

  1. 创建ACS集群

  2. 升级acs-virtual-node组件至 v2.17.0 及以上版本。

  3. 升级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及以上

  4. 升级ack-agent-sandbox-controller组件至 v0.5.2 及以上版本。

  5. 升级ack-sandbox-manager组件至 v0.3.2 及以上版本。

安装组件

集群列表页面,单击目标集群名称,然后在左侧导航栏,选择组件管理

  1. 安装Ingress Controller组件:安装ACS支持的任一Ingress Controller组件,用于从集群外部访问sandbox-manager服务。本文以安装ALB Ingress Controller为例,新建一个公网类型的ALB实例。

  2. 安装ack-agent-sandbox-controller组件:使用默认配置安装组件,组件版本需v0.5.2及以上。

  3. 安装ack-sandbox-manager组件:待以下环境配置完成后,修改classNamealb(即步骤1中自动创建的IngressClass),修改domain为实际域名,修改adminApiKey为自定义API Key,其他配置保持默认。组件安装完成后会在sandbox-system命名空间中创建一个名为sandbox-manager的路由。

    1. Demo环境配置:

      1. 获取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名称。

      2. 更新sandbox-manager路由:在sandbox-system命名空间中点击sandbox-manager路由右侧的更新进行配置,临时关闭TLS配置。更新完成后等待约1分钟后刷新路由页面,将显示该路由的端点信息。

    2. 生产环境配置:准备域名、域名解析和申请证书的详细操作,请参见应用于生产环境。若使用ALB Ingress Controller还需为ALB实例和Ingress新增HTTPS:443监听配置

    详细参数说明

    配置项

    参数

    说明

    sandboxManager

    replicaCount

    sandbox-manager 实例个数,默认值为 3。

    E2B

    domain

    E2B域名,即步骤3准备的域名。

    Enable E2B_API_KEY verification

    是否开启 API_KEY 鉴权,默认开启。

    adminApiKey

    开启鉴权后,首次安装时通过该配置项来指定最初的 Key。请替换为自定义的API Key。

    Controller

    logLevel

    controller日志等级,默认为 1。

    resources.requests.cpu

    controller CPU资源请求,默认为 2。

    resources.requests.memory

    controller 内存资源请求,默认为 4Gi。

    Proxy

    resources.requests.cpu

    proxy CPU资源请求,默认为 2。

    resources.requests.memory

    proxy 内存资源请求,默认为 4Gi。

    Ingress

    className

    集群中已配置的 IngressClass 名称,如 albmse

创建沙箱环境

兼容E2B SDK方式

以下步骤先通过SandboxSet创建E2B模板,再使用ACS定制E2B Python SDK创建沙箱环境。

步骤一:使用SandboxSet创建E2B模板并预热

  1. 单击左侧导航栏自定义资源,选择资源定义(CustomResourceDefinition)页签,单击使用YAML创建资源

  2. 使用以下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: { }

    code-interpreter镜像使用说明

    • 镜像拉取registry-cn-hangzhou-vpc.ack.aliyuncs.com/acs/code-interpreter镜像是 ACS 基于 e2b-code-interpreter 项目制作的示例镜像,兼容 E2B 客户端的run_code接口,推荐直接使用。可将镜像地址中的地域修改为实际的地域以提高拉取速度,或去除 "-vpc" 通过公网拉取。

    • 使用自定义镜像:如需使用 E2B code-interpreter(直接使用或作为 base 镜像),推荐选择 ACS 提供的版本化镜像。ACS 不保证运行时与 E2B 官方 latest 镜像的兼容性。如需要使用自定义镜像,请确保镜像满足以下条件:

      1. 包含 cp、mv、mkdir 等基础指令。

      2. 包含 bash 且可执行文件位于/bin/bash

      使用自定义镜像时,E2B 的run_code方法暂时无法使用。

  3. 单击左侧导航栏容器组,选择default命名空间,查看已经创建并预热的code-interpreter沙箱环境Pod。

步骤二:使用ACS定制E2B Python SDK创建沙箱环境

  1. 在本地环境中安装GitPython

  2. 安装E2B Python SDK。

    pip install e2b-code-interpreter==2.4.1
  3. 配置环境变量。

    # 使用安装ack-sandbox-manager组件时默认的域名,不需要带*,可按实际配置修改
    export E2B_DOMAIN=your.domain.com
    # 使用安装ack-sandbox-manager组件时默认的API Key,可按实际配置修改
    export E2B_API_KEY=admin-987654321
  4. 执行git clone https://github.com/openkruise/agents.git命令,下载ACS定制SDK至本地。

  5. 进入本地定制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())
    

    create 接口 metadata 参数说明

    create 接口的 metadata 参数的使用方式,请参见使用示例

    key

    含义

    value

    e2b.agents.kruise.io/never-timeout

    是否为sandbox配置自动清理时间。配置true则不会使用超时时间自动清理此Sandbox。

    • false

    • true

    e2b.agents.kruise.io/image

    是否为申请的Sandbox指定运行时镜像,如果镜像与预热池中声明的镜像不一致会主动原地升级镜像。

    特定镜像名,例如ghcr.io/openclaw/openclaw:****

    e2b.agents.kruise.io/wait-ready-timeout-seconds

    主要用于申请时,镜像更新场景。最长等待多久让镜像更新完成。

    整数

    e2b.agents.kruise.io/csi-volume-config

    支持申请Sandbox时,动态挂载NAS/OSS,格式为JSON字符串,支持细粒度配置多挂载点。每个挂载点支持配置:

    1. pvName:上述 OSS/NAS的PersistentVolume名称。

    2. mountPath:沙箱内的挂载目录。

    3. subPath:OSS/NAS 的 BucketPath,表示绝对地址。

    volume_config = [

    {"pvName": "oss-pv-sandbox-system", "mountPath": "/home/data-oss1", "subPath": "data-subPath1","readOnly": true}]

    e2b.agents.kruise.io/claim-timeout-seconds

    本次获取到可用沙箱最长等待多久,超过此时间直接置为申请失败。

    整数,默认为60。

    e2b.agents.kruise.io/create-on-no-stock

    默认总是会从预热池中获取沙箱,如果预热池中没有可用沙箱则会等待沙箱补充与就绪。通过配置此项可以直接基于预热池模板创建沙箱,减少等待时间。

    • false

    • true

    默认:false

    e2b.agents.kruise.io/skip-init-runtime

    申请Sandbox实例时,是否对Sandbox实例中的Agent-runtime进行初始化。如果没有runtime进程或需要高度自定义则可以配置为false

    • false

    • true

    默认:true

    e2b.agents.kruise.io/reserve-failed-sandbox

    获取沙箱时,如果出现错误管理组件会直接清理异常沙箱。通过此字段可以让管理组件保留发生错误的Sandbox实例,用于问题排查。

    • false

    • true

    默认:false

    自定义原数据

    在获取沙箱时,可以通过自定义kv,为Sandbox实例添加注解。

    自定义value,例如{"userId": "alice"}

  6. 运行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方式

  1. 单击左侧导航栏自定义资源,选择资源定义(CustomResourceDefinition)页签,单击使用YAML创建资源

  2. 使用以下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: { }

    code-interpreter镜像使用说明

    • 镜像拉取registry-cn-hangzhou-vpc.ack.aliyuncs.com/acs/code-interpreter镜像是 ACS 基于 e2b-code-interpreter 项目制作的示例镜像,兼容 E2B 客户端的run_code接口,推荐直接使用。可将镜像地址中的地域修改为实际的地域以提高拉取速度,或去除 "-vpc" 通过公网拉取。

    • 使用自定义镜像:如需使用 E2B code-interpreter(直接使用或作为 base 镜像),推荐选择 ACS 提供的版本化镜像。ACS 不保证运行时与 E2B 官方 latest 镜像的兼容性。如需要使用自定义镜像,请确保镜像满足以下条件:

      1. 包含 cp、mv、mkdir 等基础指令。

      2. 包含 bash 且可执行文件位于/bin/bash

      使用自定义镜像时,E2B 的run_code方法暂时无法使用。

  3. 单击左侧导航栏容器组,选择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 协议请求后端。在生产场景下,推荐使用以下方式申请证书。

(推荐)方式一: 使用 cert-manager 管理证书

以下步骤提供了一种使用 cert-manager 来管理和部署 sandbox-manager 自签证书的最佳实践。请确保具备 kubectl 命令行工具并有cert-manager API的操作权限。

步骤一:安装 cert-manager

请参考 官方文档 安装 v1.14 版本的cert-manager。

由于最新版本使用的是社区的镜像仓库(quay.io),推荐使用 v1.14 版本。
步骤二:通过 cert-manager 自动管理证书
  1. cert-manager.yaml 中的*.your.domain.comyour.domain.com替换为你的域名。

    示例YAML中使用了自签的CA证书,也可以使用自己的CA证书。
  2. 执行kubectl apply -f cert-manager.yaml命令,将配置添加到 ACS 集群中。

步骤三:验证证书状态
  1. 检查证书是否正确创建和颁发。

    kubectl get certificates -n sandbox-system
    kubectl describe certificate sandbox-manager-ingress-cert -n sandbox-system
    kubectl describe secret sandbox-manager-tls -n sandbox-system
  2. 检查 Ingress 状态。

    kubectl get ingress sandbox-manager -n sandbox-system
    kubectl describe ingress sandbox-manager -n sandbox-system
步骤四:配置客户端信任

若使用的是自签名证书,客户端需要信任根 CA 证书。

  1. 获取 CA 证书。

    kubectl get secret sandbox-ca-key-pair -n sandbox-system -o jsonpath='{.data.tls\.crt}' | base64 -d > ca.crt
  2. 配置客户端。客户端需要设置环境变量 SSL_CERT_FILE 为获取的 CA 证书路径或者将 CA 证书添加到系统的信任存储中。

    export SSL_CERT_FILE=/path/to/ca.crt

方式二:使用自签证书

步骤一:创建证书
  1. 通过脚本 generate-certificates.sh 创建自签名证书。可通过以下命令查看脚本的使用方法。

    bash generate-certificates.sh --help

    预期输出:

    Usage: generate-certificates.sh [OPTIONS]
    
    Options:
      -d, --domain DOMAIN     Specify certificate domain (default: example.com)
      -o, --output DIR        Specify output directory (default: .)
      -D, --days DAYS         Specify certificate validity days (default: 365)
      -h, --help              Show this help message
    
    Examples:
      generate-certificates.sh -d myapp.example.com
      generate-certificates.sh --domain api.example.com --days 730
  2. 执行generate-certificates.sh -d your.domain.com命令,生成证书。完成证书生成后,会创建以下文件:

    • fullchain.pem:服务器证书公钥

    • privkey.pem:服务器证书私钥

    • ca-fullchain.pem:CA 证书公钥

    • ca-privkey.pem:CA 证书私钥

    该脚本会同时生成单域名(your.domain.com)与泛域名(*.your.domain.com)证书,兼容原生 E2B 协议与 OpenKruise 定制 E2B 协议。

步骤二:安装证书

通过以下命令将服务器证书挂载到集群的 Ingress 上:

kubectl create secret tls sandbox-manager-tls \
        --cert=fullchain.pem \
        --key=privkey.pem -n sandbox-system
证书的生效可能会有一些延迟,具体生效时间由所用的 Ingress 控制器决定。
步骤三:配置客户端信任

客户端需要设置环境变量 SSL_CERT_FILE 为步骤一中生成的 CA 公钥(ca-fullchain.pem)文件路径:

export SSL_CERT_FILE=/path/to/ca-fullchain.pem
python main.py # 通过 python 调用 E2B SDK

方式三:采用正式证书(以 Let's Encrypt 为例)

步骤一:准备证书

E2B 客户端必须通过 HTTPS 协议请求后端。在生产场景下,推荐申请一个正式的域名证书。

以下示例通过 Let's Encrypt 申请一个免费的测试证书(Let's Encrypt证书需要强依赖公网域名)。

  1. 通过系统的包管理器(brew、snap 等)安装 certbot,更多安装信息请查看 官方文档

  2. 修改-d--email的参数为泛域名your.domain.com 申请证书。请根据命令的提示进行验证操作。

由于签发的证书同时包括泛域名和单域名,通过 TXT 解析鉴权的流程需要连续操作两次。
sudo certbot certonly \
  --manual \
  --preferred-challenges=dns \
  --email your-email@example.com \
  --server https://acme-v02.api.letsencrypt.org/directory \
  --agree-tos \
  -d "your.domain.com" \
  -d "*.your.domain.com"
步骤二:导出证书
sudo cp /etc/letsencrypt/live/your.domain.com/fullchain.pem ./fullchain.pem
sudo cp /etc/letsencrypt/live/your.domain.com/privkey.pem ./privkey.pem
步骤三:安装证书
kubectl create secret tls sandbox-manager-tls \
  --cert=fullchain.pem \
  --key=privkey.pem \
  --namespace=sandbox-system