本文介紹如何建立並使用支援ACS定製SDK訪問的 ACS 沙箱環境。使用ACS定製的SDK,可以規避E2B原生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組件:安裝ACS支援的任一Ingress Controller組件,用於從叢集外部存取
sandbox-manager服務。本文以安裝ALB Ingress Controller為例,建立一個公網類型的ALB執行個體。安裝
ack-agent-sandbox-controller組件:使用預設配置安裝組件,組件版本需v0.5.2及以上。安裝
ack-sandbox-manager組件:待以下環境配置完成後,修改className為alb(即步驟1中自動建立的IngressClass),修改domain為實際網域名稱,修改adminApiKey為自訂API Key,其他配置保持預設。組件安裝完成後會在sandbox-system命名空間中建立一個名為sandbox-manager的路由。Demo環境配置:
擷取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名稱。更新
sandbox-manager路由:在sandbox-system命名空間中點擊sandbox-manager路由右側的更新進行配置,臨時關閉TLS配置。更新完成後等待約1分鐘後重新整理路由頁面,將顯示該路由的端點資訊。
生產環境配置:準備網域名稱、網域名稱解析和申請認證的詳細操作,請參見應用於生產環境。若使用ALB Ingress Controller還需為ALB執行個體和Ingress新增HTTPS:443監聽配置。
建立沙箱環境
相容E2B SDK方式
以下步驟先通過SandboxSet建立E2B模板,再使用ACS定製E2B Python SDK建立沙箱環境。
步驟一:使用SandboxSet建立E2B模板並預熱
單擊左側導覽列自訂資源,選擇資源定義(CustomResourceDefinition)頁簽,單擊使用YAML建立資源。
使用以下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: { }單擊左側導覽列容器組,選擇
default命名空間,查看已經建立並預熱的code-interpreter沙箱環境Pod。
步驟二:使用ACS定製E2B Python SDK建立沙箱環境
安裝E2B Python SDK。
pip install e2b-code-interpreter==2.4.1配置環境變數。
# 使用安裝ack-sandbox-manager組件時預設的網域名稱,不需要帶*,可按實際配置修改 export E2B_DOMAIN=your.domain.com # 使用安裝ack-sandbox-manager組件時預設的API Key,可按實際配置修改 export E2B_API_KEY=admin-987654321執行
git clone https://github.com/openkruise/agents.git命令,下載ACS定製SDK至本地。進入本地定製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())運行
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方式
單擊左側導覽列自訂資源,選擇資源定義(CustomResourceDefinition)頁簽,單擊使用YAML建立資源。
使用以下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: { }單擊左側導覽列容器組,選擇
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 協議請求後端。在生產情境下,推薦使用以下方式申請認證。