全部產品
Search
文件中心

Container Compute Service:在ACS叢集中建立Agent Sandbox

更新時間:Apr 01, 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