本文介紹如何在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.14-release.1及以上,升級ack-sandbox-manager組件版本至v0.6.0及以上。
登入容器計算服務控制台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇組件管理。
安裝 Ingress Controller 和 Sandbox 相關組件。
安裝Ingress Controller組件。
安裝ACS支援的任一Ingress Controller組件,用於從叢集外部存取
sandbox-manager服務。後續步驟以安裝ALB Ingress Controller為例,建立一個公網類型的ALB執行個體。安裝ack-agent-sandbox-controller組件。
首次安裝需要先授權AliyunCSManagedAgentSandboxRole角色訪問您的雲資源,參數可先按照預設設定,如有額外並發需求,可再提升對應資源規格。
關於該組件功能的詳細說明,請參見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 的沙箱模板配置。
apiVersion: agents.kruise.io/v1alpha1 kind: SandboxSet metadata: name: code-interpreter namespace: default spec: runtimes: - name: csi # 支援CSI掛載能力,建立的Sandbox會被注入對應的Sidecar - name: agent-runtime # 注入envd等環境管理工具 replicas: 4 template: metadata: labels: alibabacloud.com/acs: "true" alibabacloud.com/compute-class: agent-sandbox # Agent Sandbox 執行個體類型 alibabacloud.com/compute-qos: default # 算力品質 default/best-effort 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 ephemeral-storage: 30Gi terminationGracePeriodSeconds: 30關於 SandboxSet CRD 各欄位的詳細含義及進階配置,請參見Sandbox CRD 欄位說明。
單擊左側導覽列容器組,選擇對應的命名空間,查看已建立的
code-interpreterSandbox。可通過
kubectl get sbs命令查看 SandboxSet 資源,其中AVAILABLE表示已就緒的 Sandbox 數量。
當一個 Sandbox 被分配後,SandboxSet 會自動觸發補充流程,以維持預熱池執行個體數量。
步驟二:擷取Agent Sandbox
E2B SDK方式
Sandbox 支援通過 E2B SDK 在平台上開發、部署專案並查看效果,包括執行代碼(run_code)、讀寫檔案(files.write/files.read)、運行命令(commands.run)等操作。更多 SDK 使用說明,請參見使用 E2B SDK 接入 Agent Sandbox。
在本地環境中安裝Python。
安裝E2B Python SDK(僅支援小於v2.25.0的版本)。
pip install "e2b-code-interpreter==2.7.0" "e2b==2.24.0"配置環境變數。
# 使用安裝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方式
預熱池分配Sandbox後,將立即啟動自動補足邏輯,快速回填預熱執行個體。
單擊左側導覽列自訂資源,選擇資源定義(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
# timeout預設時間長度300秒
sbx = Sandbox.create(template="some-template", timeout=300, metadata={
# 將沙箱容器的鏡像原地替換為指定鏡像
"e2b.agents.kruise.io/image": "<YOUR_IMAGE>"
})沙箱支援通過鏡像緩衝(Image Cache)來加速鏡像拉取。可通過 Annotation ops.alibabacloud.com/update-with-image-cache 控制鏡像緩衝的使用時機,具體取值及適用情境如下:
false(預設):在預熱池擴容時使用鏡像緩衝。在此模式下,後續更新鏡像時不啟用鏡像緩衝。適用於更新鏡像與預熱池鏡像層重合度高、可大量複用的情境。true:在鏡像更新時使用鏡像緩衝。在此模式下,預熱池擴容時不啟用緩衝。適用於預熱池採用輕量佔位鏡像,或目標更新鏡像較大的情境。
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 指定Agent Sandbox資源規格
從預熱池分配 Sandbox 時支援容器原地垂直伸縮(VPA),將已預熱的低規格沙箱執行個體升配至業務所需規格,無需重建 Pod,兼顧預熱池的快速供給與業務側的差異化資源訴求。
當前僅支援調整 CPU,記憶體和其他資源會被忽略,且僅調整主容器。詳細的使用限制及使用說明,請參考基於CPU指標的容器原地垂直伸縮。
叢集在1.32以下版本時,需在組件管理為Kube API Server配置特性門控
InPlacePodVerticalScaling=true,開啟原地變更配置功能。
步驟一:為 SandboxSet 開啟原地變更配置
在 SandboxSet 的 spec.template.metadata.annotations 中添加 scaling.alibabacloud.com/enable-inplace-resource-resize: "true",允許預熱池中的 Sandbox 在被分配時執行原地 VPA。
以下樣本僅建立一個較小規格的預熱池,後續分配時可指定規格動態擴容。
apiVersion: agents.kruise.io/v1alpha1
kind: SandboxSet
metadata:
name: code-interpreter
spec:
template:
metadata:
annotations:
# 允許從預熱池分配 Sandbox 時執行原地 VPA
scaling.alibabacloud.com/enable-inplace-resource-resize: "true"
spec:
containers:
- name: interpreter
image: xxx
resources:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: 500m
memory: 1Gi
replicas: 5 # 預熱執行個體數量步驟二:分配時聲明目標資源規格
從預熱池中分配Agent Sandbox時,可通過以下兩種方式將 CPU 動態擴容至指定規格:
E2B SDK方式
在 Sandbox.create 的 metadata 中通過約定的鍵聲明目標 CPU 規格。
from e2b_code_interpreter import Sandbox
sbx = Sandbox.create(template="code-interpreter", metadata={
"e2b.agents.kruise.io/cpu-request": "1000m",
"e2b.agents.kruise.io/cpu-limit": "1000m"
})SandboxClaim方式
在 SandboxClaim 的 spec.inplaceUpdate.resources 中聲明目標資源規格。
apiVersion: agents.kruise.io/v1alpha1
kind: SandboxClaim
metadata:
name: code-interpreter-vpa-claim
namespace: default
spec:
templateName: code-interpreter
replicas: 1
claimTimeout: 5m
ttlAfterCompleted: 15m
inplaceUpdate: # 聲明目標資源規格
resources:
requests:
cpu: 1000m
limits:
cpu: 1000m刪除Agent 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 記錄類型解析到對應網域名稱。如果輸出多個存取點,將記錄解析到其中任意一個存取點,或為所有存取點配置輪詢均可。
常見問題
ack-agent-sandbox-controller組件安裝失敗,錯誤資訊:[RAM Role AliyunCSManagedAgentSandboxRole is not granted]
進入RAM存取控制-角色頁面,搜尋AliyunCSManagedAgentSandboxRole,然後單擊角色名稱進入角色詳情頁。
在角色詳情頁,勾選AliyunCSManagedAgentSandboxRolePolicy,然後單擊解除授權。
重新進行授權,單擊授權連結。