本文介紹如何通過E2B SDK接入ACS Agent Sandbox。
背景資訊
ACS Agent Sandbox相容E2B SDK,您可以使用E2B SDK建立、管理和串連Sandbox執行個體。Agent Sandbox基於OpenKruise Agents實現E2B協議相容,支援兩種E2B協議:
原生協議(Native Protocol):每個Sandbox按連接埠使用獨立子網域名稱,訪問格式為
<PORT>-<SANDBOX_ID>.DOMAIN,API入口為api.DOMAIN。需要泛網域名稱DNS解析和TLS認證,適合生產環境。私人協議(Private Protocol):所有Sandbox共用同一網域名稱,通過URL路徑區分,訪問格式為
DOMAIN/kruise/<SANDBOX_ID>/<PORT>,API入口為DOMAIN/kruise/api。僅需單網域名稱,簡化網路設定並降低認證成本。
對比項 | 原生協議 | 私人協議 |
網域名稱要求 | 泛網域名稱( | 單網域名稱( |
TLS認證 | 泛網域名稱認證 | 單網域名稱認證 |
E2B SDK要求 | 原生支援 | 需安裝 |
適用情境 | 生產環境 | 測實驗證、快速整合 |
安裝組件
如已安裝組件,請升級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監聽配置。
步驟一:建立預熱池
單擊左側導覽列自訂資源,選擇資源定義(CustomResourceDefinition)頁簽,單擊使用YAML建立資源。
使用以下 YAML 建立 SandboxSet 資源。ack-sandbox-manager 會自動監聽並識別該資源,同步初始化名為 code-interpreter 的沙箱模板配置。
啟用動態儲存裝置掛載功能,需要為容器開放特權容器(Privileged Container)和宿主機路徑(hostPath,/var/run/csi)的容器安全驗證,可以提交工單放開限制,但由此帶來的安全風險需要使用者承擔一定責任,相關機制請參見安全責任共擔模型。
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單擊左側導覽列容器組,選擇對應的命名空間,查看已建立的
code-interpreterSandbox。可通過
kubectl get sbs命令查看 SandboxSet 資源,其中AVAILABLE表示已就緒的 Sandbox 數量。
步驟二:安裝E2B SDK
E2B SDK目前支援 Python、Java、Go 等多種程式設計語言。本文以 Python 語言為例進行說明,如需瞭解其他語言的詳細整合指南,請參考e2b-client。
安裝Python環境。
安裝E2B Python SDK。Agent Sandbox僅支援低於v2.25.0的E2B SDK版本。
pip install "e2b-code-interpreter==2.7.0" "e2b==2.24.0"
步驟三:配置E2B_DOMAIN
E2B_DOMAIN是E2B SDK串連sandbox-manager的網域名稱配置,用戶端與組件配置必須一致。
網域名稱的註冊與解析請參考Alibaba Cloud DNS。
配置組件
以下樣本以ALB Ingress Controller為例,詳細操作請參考安裝組件及配置。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇組件管理。
在控制台組件管理中,搜尋
ack-sandbox-manager組件,單擊配置並修改組件的domain參數,請將其修改為您的實際網域名稱。domain參數不帶*首碼。例如網域名稱為*.sandbox.example.com,則domain配置為sandbox.example.com。(可選)如僅需通過 HTTP 協議訪問 SandboxManager(無需配置 TLS 認證),在同一配置介面取消勾選 Whether to enable TLS for ingress。
配置用戶端
在本地環境中設定以下環境變數。
E2B_DOMAIN的值必須與ack-sandbox-manager組件的domain參數完全一致,否則SDK無法串連到sandbox-manager服務。
# 設定E2B_DOMAIN,與組件domain參數保持一致
export E2B_DOMAIN=<YOUR_E2B_DOMAIN>
# 設定E2B_API_KEY,與組件adminApiKey參數保持一致
export E2B_API_KEY=<YOUR_API_KEY>(可選)步驟四:安裝認證
如果您需要通過 HTTPS 訪問 sandbox-manager,需要安裝 TLS 認證。建議使用受信任的CA認證。各種認證申請及配置方式,請參考以下文檔:
檢查 Secret 是否成功建立以及類型是否正確(應為 kubernetes.io/tls):
kubectl get secret sandbox-manager-tls -n sandbox-system步驟五:選擇整合方式串連Sandbox
根據您的網路環境和需求,選擇以下整合方式之一串連Sandbox。
以下樣本code-interpreter 為佔位名,需替換為您實際建立的 SandboxSet 名稱。方式一:叢集外通過原生協議訪問:生產環境推薦,需泛網域名稱和TLS認證。
方式二:叢集外通過私人協議訪問(HTTPS):單網域名稱即可,降低部署門檻。
方式三:連接埠轉寄到本地調試:適合本地開發調試。
方式一:叢集外通過原生協議訪問
通過泛網域名稱將請求路由到sandbox-manager服務,每個Sandbox使用獨立子網域名稱。適合生產環境。
配置泛網域名稱DNS解析,將
*.your.domain.com解析到叢集Ingress的外部IP。並為泛網域名稱配置認證。範例程式碼。
from e2b_code_interpreter import Sandbox sbx = Sandbox.create(template="code-interpreter") print(f"sandbox id: {sbx.sandbox_id}") execution = sbx.run_code("print('hello, world')") print(f"run code result: {execution}") sbx.kill()
方式二:叢集外通過私人協議訪問(HTTPS)
通過單網域名稱和URL路徑區分不同Sandbox,僅需單網域名稱認證即可。適合測實驗證和快速整合。
網域名稱的註冊與解析請參考Alibaba Cloud DNS。
安裝
kruise-agents擴充包。pip install "git+https://github.com/openkruise/agents.git#subdirectory=sdk/customized_e2b"配置單網域名稱DNS解析,將
your.domain.com解析到叢集Ingress的外部IP。並為單網域名稱配置認證。範例程式碼。
使用私人協議時,必須在匯入E2B SDK之前調用
patch_e2b(),以將E2B SDK的請求路由切換為私人協議路徑。叢集外通過HTTPS訪問時傳入https=True。from kruise_agents.patch_e2b import patch_e2b patch_e2b(https=True) from e2b_code_interpreter import Sandbox sbx = Sandbox.create(template="code-interpreter") print(f"sandbox id: {sbx.sandbox_id}") execution = sbx.run_code("print('hello, world')") print(f"run code result: {execution}") sbx.kill()
方式三:連接埠轉寄到本地調試
通過kubectl連接埠轉寄將sandbox-manager服務對應到本地,適合本地開發調試。
設定環境變數。
E2B_DOMAIN需與sandbox-manager的domain參數保持一致,均設定為localhost。export E2B_DOMAIN=localhost export E2B_API_KEY=<YOUR_API_KEY>安裝
kruise-agents擴充包。pip install "git+https://github.com/openkruise/agents.git#subdirectory=sdk/customized_e2b"將sandbox-manager的Sandbox流量連接埠轉寄到本地80連接埠。
7788為Sandbox流量連接埠,請根據實際Service連接埠調整。sudo kubectl port-forward services/sandbox-manager 80:7788 -n sandbox-system使用私人協議,需在匯入E2B SDK前調用
patch_e2b(https=False)。樣本如下:from kruise_agents.patch_e2b import patch_e2b patch_e2b(https=False) from e2b_code_interpreter import Sandbox sbx = Sandbox.create(template="code-interpreter") print(f"sandbox id: {sbx.sandbox_id}") execution = sbx.run_code("print('hello, world')") print(f"run code result: {execution}") sbx.kill()