本文介绍如何通过ACK集群使用ACS Agent Sandbox部署OpenClaw。
准备工作
步骤一:创建 ACK 集群并使用 ACS 算力
步骤二:安装 Sandbox 相关组件并配置域名
步骤三:配置网络访问控制
部署实践
步骤一:部署OpenClaw预热池
将以下内容保存为
openclaw-sbs.yaml文件,然后执行kubectl apply -f openclaw-sbs.yaml命令申请SandboxSet资源。示例提供了一个基于OpenClaw官方镜像的预热池,通过spec.runtimes向容器中注入ACS Runtime。apiVersion: agents.kruise.io/v1alpha1 kind: SandboxSet metadata: name: openclaw-sbs namespace: default spec: persistentContents: - filesystem replicas: 3 runtimes: - name: agent-runtime # 注入envd/agent-runtime等binary能力,方便使用e2b接口管理容器内部环境 template: metadata: labels: app: openclaw alibabacloud.com/acs: "true" # 使用ACS算力 alibabacloud.com/compute-class: agent-sandbox # Agent Sandbox 实例类型 annotations: network.alibabacloud.com/vswitch-ids: "vsw-****,vsw-****" # 设置独享的vsw 10.10.0.0/16,10.20.0.0/16 network.alibabacloud.com/security-group-ids: "sg-****" #设置单独的企业安全组 # TrafficPolicy网络隔离 network.alibabacloud.com/network-policy-mode: "traffic-policy" network.alibabacloud.com/enable-network-policy-agent: "true" spec: automountServiceAccountToken: false enableServiceLinks: false hostNetwork: false hostname: openclaw containers: - name: gateway # 镜像来源OpenClaw官方发布,仅供demo使用 image: ghcr.io/openclaw/openclaw:2026.4.14 securityContext: readOnlyRootFilesystem: false # node账号 runAsUser: 1000 runAsGroup: 1000 command: ["openclaw", "gateway", "run", "--allow-unconfigured"] ports: - name: gateway containerPort: 18789 protocol: TCP env: # 不同Linux账号使用不同的home路径 - name: OPENCLAW_CONFIG_DIR value: /home/node/.openclaw # 显式覆盖,避免暴露集群信息 - name: KUBERNETES_SERVICE_PORT_HTTPS value: "" - name: KUBERNETES_SERVICE_PORT value: "" - name: KUBERNETES_PORT_443_TCP value: "" - name: KUBERNETES_PORT_443_TCP_PROTO value: "" - name: KUBERNETES_PORT_443_TCP_ADDR value: "" - name: KUBERNETES_SERVICE_HOST value: "" - name: KUBERNETES_PORT value: "" - name: KUBERNETES_PORT_443_TCP_PORT value: "" resources: requests: cpu: 2 memory: 4Gi limits: cpu: 2 memory: 4Gi startupProbe: exec: command: - node - -e - "require('http').get('http://127.0.0.1:18789/healthz', r => process.exit(r.statusCode < 400 ? 0 : 1)).on('error', () => process.exit(1))" initialDelaySeconds: 1 periodSeconds: 2 failureThreshold: 150查看SandboxSet以及对应的Sandbox是否已经就绪。
kubectl get sbs openclaw-sbs预期输出:
NAME REPLICAS AVAILABLE UPDATEREVISION AGE openclaw-sbs 3 3 59dc77f4b7 30m查看Sandbox(简写
sbx)运行状态。kubectl get sbx -l agents.kruise.io/sandbox-pool=openclaw-sbs -l agents.kruise.io/sandbox-claimed=false预期输出:
NAME STATUS AGE SHUTDOWN_TIME PAUSE_TIME MESSAGE openclaw-sbs-df*** Running 12m openclaw-sbs-hz*** Running 30m openclaw-sbs-rd*** Running 18m
步骤二:为用户分配OpenClaw实例
E2B SDK方式
在本地环境中安装Python。
安装E2B Python SDK(仅支持小于v2.25.0的版本)。
pip install "e2b-code-interpreter==2.7.0" "e2b==2.24.0"配置并申请Sandbox。
创建
openclaw-template.json文件。由于该文件所配置的访问控制和权限较大,请勿在生产环境中直接使用。
{ "agents": { "defaults": { "model": { "primary": "bailian/qwen3.5-plus" }, "workspace": "~/.openclaw/workspace" } }, "models": { "mode": "merge", "providers": { "bailian": { "baseUrl": "https://dashscope.aliyuncs.com/compatible-mode/v1", "apiKey": "${DASHSCOPE_API_KEY}", "api": "openai-completions", "models": [ { "id": "qwen3.5-plus", "name": "通义千问", "input": [ "text" ], "contextWindow": 1000000, "maxTokens": 65536 } ] } } }, "commands": { "native": "auto", "nativeSkills": "auto", "restart": true, "ownerDisplay": "raw" }, "gateway": { "port": 18789, "bind": "lan", "controlUi": { "allowedOrigins": [ "*" ], "dangerouslyAllowHostHeaderOriginFallback": true, "allowInsecureAuth": true, "dangerouslyDisableDeviceAuth": true }, "auth": { "mode": "token", "token": "${GATEWAY_TOKEN}" } } }创建
create_sandbox.py文件,读取上述配置模板并创建OpenClaw Sandbox。注意:请确保在运行脚本前已通过
export或.env文件设置了这些变量。GATEWAY_TOKEN: 自定义的OpenClaw网关访问令牌。DASHSCOPE_API_KEY: 阿里云百炼的 API Key,可前往百炼API Key页面获取。# Import and patch the E2B SDK import os from string import Template from e2b_code_interpreter import Sandbox # 注意为用户配置 never timeout。否则 sandbox/openclaw 在默认300s超时时间后,会被自动清理 sbx: Sandbox = Sandbox.create(template="openclaw-sbs", metadata={ "e2b.agents.kruise.io/never-timeout": "true" }) print(f"sandbox id: {sbx.sandbox_id}") # 从本地环境变量中获取配置 GATEWAY_TOKEN = os.environ.get("GATEWAY_TOKEN") DASHSCOPE_API_KEY = os.environ.get("DASHSCOPE_API_KEY") # 渲染 openclaw-template.json 文件, 并将渲染后的文件覆盖沙盒中 /home/node/.openclaw/openclaw.json 的内容,触发openclaw重启更新配置 template_path = "openclaw-template.json" with open(template_path, "r") as f: template_content = f.read() rendered_content = Template(template_content).safe_substitute( GATEWAY_TOKEN=GATEWAY_TOKEN, DASHSCOPE_API_KEY=DASHSCOPE_API_KEY, ) # 注意标明写文件使用的权限 sbx.files.write("/home/node/.openclaw/openclaw.json", rendered_content, user="node") print("已将渲染后的配置写入沙盒 /home/node/.openclaw/openclaw.json")
执行代码创建OpenClaw Sandbox。
uv run create_sandbox.py预期输出:
sandbox id: default--openclaw-sbs-2t8wf 已将渲染后的配置写入沙盒 /home/node/.openclaw/openclaw.json获取更详细的Sandbox信息。
kubectl describe sandbox openclaw-sbs-2t8wf -n default预期输出:
... Status: ... Phase: Running Pod Info: ... Node Name: virtual-kubelet-cn-zhangjiakou-c Pod IP: 172.19.208.215 Pod UID: e85e1ccb-4764-4c19-9a73-25228bc9ac8a Sandbox Ip: 172.19.208.215 Update Revision: 52bb7wbwx
K8s SDK方式
本节介绍如何通过K8s SDK方式申请Sandbox实例。为了演示方便,下文采用 kubectl 命令行工具进行演示调用。
通过SandboxClaim获取Sandbox实例
使用 SandboxClaim 从预热池(SandboxSet)中动态获取一个可用的 Sandbox 实例。
apiVersion: agents.kruise.io/v1alpha1 kind: SandboxClaim metadata: name: openclaw-claim-user-a spec: templateName: openclaw-sbs # 指定上文部署的 SandboxSet 名称 replicas: 1 # 申请的实例数量 claimTimeout: 1m # 获取可用实例的超时时间 ttlAfterCompleted: 5m # 任务完成后 CR 自动回收的延迟时间 # 可为申请的资源打上自定义label,方便后期使用label selector进行管理 # labels: # user: user-a观测SandboxClaim(简写:
sbc)状态。kubectl get sbc openclaw-claim-user-a预期输出:
NAME PHASE TEMPLATE DESIRED CLAIMED AGE openclaw-claim-user-a Completed openclaw-sbs 1 1 38s根据 Label Selector 筛选出与该申请关联的 Sandbox 实例:
kubectl get sbx -l agents.kruise.io/claim-name=openclaw-claim-user-a预期输出:
NAME STATUS AGE CLAIMED SHUTDOWN_TIME PAUSE_TIME MESSAGE openclaw-sbs-2t8wf Running 42h true
提取运行环境元数据
在对 Sandbox 内部环境进行操作前,需提取 Sandbox ID 和 访问密钥 (Token),请妥善保存以下变量:
Runtime Sandbox ID
格式为:${Namespace}--${SandboxName}。
在本示例中为:default--openclaw-sbs-2t8wf。Runtime 访问密钥
替换以下<YOUR_SANDBOX_NAME>为上一步输出的Sandbox名称,获取鉴权Token:kubectl get sandbox <YOUR_SANDBOX_NAME> -o jsonpath='{.metadata.annotations.agents\.kruise\.io/runtime-access-token}'
初始化 OpenClaw 环境
推荐使用 Runtime Client 链路 进行初始化。该方式相比直接通过 K8s 原生运维,具有细粒度管理、高并发支持、权限控制更精细等优势。以下为E2B SDK操作示例。
在本地环境中安装Python。
安装E2B Python SDK(仅支持小于v2.25.0的版本)。
pip install "e2b-code-interpreter==2.7.0" "e2b==2.24.0"连接Sandbox,修改OpenClaw配置并重启。
创建
openclaw-template.json文件。由于该文件所配置的访问控制和权限较大,请勿在生产环境中直接使用。
{ "agents": { "defaults": { "model": { "primary": "bailian/qwen3.5-plus" }, "workspace": "~/.openclaw/workspace" } }, "models": { "mode": "merge", "providers": { "bailian": { "baseUrl": "https://dashscope.aliyuncs.com/compatible-mode/v1", "apiKey": "${DASHSCOPE_API_KEY}", "api": "openai-completions", "models": [ { "id": "qwen3.5-plus", "name": "通义千问", "input": [ "text" ], "contextWindow": 1000000, "maxTokens": 65536 } ] } } }, "commands": { "native": "auto", "nativeSkills": "auto", "restart": true, "ownerDisplay": "raw" }, "gateway": { "port": 18789, "bind": "lan", "controlUi": { "allowedOrigins": [ "*" ], "dangerouslyAllowHostHeaderOriginFallback": true, "allowInsecureAuth": true, "dangerouslyDisableDeviceAuth": true }, "auth": { "mode": "token", "token": "${GATEWAY_TOKEN}" } } }创建
update-openclaw-json.py文件。以下示例通过 E2B SDK 经Sandbox Gateway远程连接到已分配的Sandbox,将 OpenClaw配置文件写入容器内/home/node/.openclaw/openclaw.json,触发OpenClaw自动重启并加载最新配置。注意:请确保在运行脚本前已通过
export或.env文件设置了这些变量。GATEWAY_TOKEN: 自定义的OpenClaw网关访问令牌。DASHSCOPE_API_KEY: 阿里云百炼的 API Key,可前往百炼API Key页面获取。import os from string import Template from e2b_code_interpreter import Sandbox from e2b.connection_config import ConnectionConfig from packaging.version import Version gateway_url = "sandbox-gateway.sandbox-system.svc.cluster.local:7788" # 可通过kubectl转发后,在本地测试 kubectl port-forward svc/sandbox-gateway -n sandbox-system 7788:7788 # gateway_url = "127.0.0.1:7788" sandbox_id="default--openclaw-sbs-2t8wf" # 容器内驻守的运维Server鉴权token runtime_token = "<YOUR_RUNTIME_ACCESS_TOKEN>" # 需替换为前文提取的 Runtime 访问密钥 config = ConnectionConfig( domain=gateway_url, api_key="dummy", sandbox_url=f"http://{gateway_url}", # 按需使用http,或https extra_sandbox_headers={ "X-Access-Token": runtime_token, "e2b-sandbox-id": sandbox_id, "e2b-sandbox-port": "49983", }, ) # 直接构造 Sandbox 对象 sbx: Sandbox = Sandbox( sandbox_id="dummy", sandbox_domain="dummy", envd_version=Version("0.2.11"), envd_access_token="dummy", traffic_access_token=None, connection_config=config, ) # 从本地环境变量中获取配置 GATEWAY_TOKEN = os.environ.get("GATEWAY_TOKEN") DASHSCOPE_API_KEY = os.environ.get("DASHSCOPE_API_KEY") # 渲染 openclaw-template.json 文件 template_path = "openclaw-template.json" with open(template_path, "r") as f: template_content = f.read() rendered_content = Template(template_content).safe_substitute( GATEWAY_TOKEN=GATEWAY_TOKEN, DASHSCOPE_API_KEY=DASHSCOPE_API_KEY, ) # 将渲染后的文件覆盖沙盒中 /home/node/.openclaw/openclaw.json 的内容,触发openclaw重启更新配置 # 注意标明写文件使用的权限 sbx.files.write("/home/node/.openclaw/openclaw.json", rendered_content, user="node") print("已将渲染后的配置写入沙盒 /home/node/.openclaw/openclaw.json")执行代码创建OpenClaw Sandbox。
uv run update-openclaw-json.py预期输出:
已将渲染后的配置写入沙盒 /home/node/.openclaw/openclaw.json
步骤三:访问OpenClaw
在本地浏览器中访问OpenClaw UI页面。
方式一:通过E2B原生接口进行请求路由。
访问URL格式为
https://<port>-<sandbox id>.your.domain.com/#token=<your token>。以本文为例:https://18789-default--openclaw-sbs-2t8wf.agent-vpc.infra/#token=clawdbot-****。其中token为步骤二中自定义的GATEWAY_TOKEN。如需在中国境内公网开放访问,请合规备案。如果使用的是私网域名,应该保证客户端处于可正确解析该域名的网络环境中。
方式二:本地转发(仅限本地调试使用)。
通过
kubectl port-forward的方式将本地请求代理到对应Sandbox环境中,然后请求http://127.0.0.1:18789/#token=clawdbot-****即可与OpenClaw交互。kubectl port-forward openclaw-sbs-2t8wf 18789:18789 -n default

Gateway的默认权限较大,请参考创建TrafficPolicy配置访问控制。
进阶使用
OpenClaw实例升级:升级Agent Sandbox。
OpenClaw实例使用镜像缓存:使用镜像缓存加速ACS Pod启动。
OpenClaw实例挂载共享存储:为Agent Sandbox挂载共享存储。
OpenClaw实例Checkpoint/Fork:使用Checkpoint功能克隆Agent Sandbox。
OpenClaw实例休眠/唤醒:休眠和唤醒Agent Sandbox。
免责声明
本文档仅供参考,您需要根据实际业务需求自行确定技术选型、配置调整并评估业务影响。文档涉及的开源组件/软件/模型(如OpenClaw、E2B、Python等)由开源社区独立维护,因开源软件等本身缺陷导致的业务损失,阿里云不提供赔偿或补偿,您需主动维护ACK集群中已安装的软件,及时修复开源软件引起的缺陷和问题。
