在 Knative 中使用 Agent Sandbox 工作负载

更新时间:
复制为 MD 格式

运行 AI Agent 或在线 IDE 时,用户会话间歇性活跃——传统 Serverless 实例空闲即销毁,再次访问需要冷启动且丢失所有运行状态。Knative支持Agent Sandbox 工作负载,可为每个会话分配独立 MicroVM,空闲时休眠并完整保留文件系统和 IP,再访问时秒级唤醒,同时可以按活跃会话数弹性伸缩,支持缩容到零。

工作原理

Agent Sandbox是一款面向生产级AI智能体的沙箱算力产品,提供以下核心能力:

  • MicroVM级别的隔离运行环境。

  • 内存级休眠唤醒及Checkpoint克隆能力。

  • 最高每分钟15K Sandbox的大规模弹性扩展能力。

  • 全面兼容Kubernetes原生生态,无缝对接E2B SDK、AgentScope等主流AI Agent框架和工具。

阿里云KnativeAgent Sandbox之上提供Serverless能力支持,面向AI智能体场景设计。与传统无状态Serverless不同,Sandbox支持:

  • 会话亲和:每个会话独占一个 Sandbox 实例(target=1),请求始终路由到同一实例

  • 状态保持:休眠(Pause)时保留 Pod 的 IP和文件系统,唤醒后从中断处继续

  • 智能弹性:按活跃会话数自动扩缩,空闲实例自动休眠,支持缩容到零

  • 预热池预热:预创建并冻结指定数量的实例,新会话到来时秒级唤醒,无需等待冷启动

根据是否需要保留运行状态,Agent Sandbox 支持两种空闲策略:

维度

Delete 模式(默认)

Pause 模式

空闲后行为

删除实例

冻结实例(保留状态)

再次访问

冷启动(创建新实例)

秒级唤醒(恢复已有实例)

状态保留

不保留

IP + 文件系统

资源占用

空闲时零资源

冻结实例占少量存储

适用场景

无状态任务、批处理

AI Agent、在线 IDE、长会话

准备工作

  • 创建ACK托管集群,并开通Agent Sandbox服务

  • 确保相关组件符合要求:

    安装或升级入口:在ACK集群列表页面,单击目标集群名称,在集群详情页左侧导航栏,单击组件管理
    • 升级kube-scheduler至符合要求的版本

      展开查看组件版本要求

      集群版本

      Kube Scheduler组件版本

      v1.28

      v1.28.12-apsara-6.11.8.9edb0089及以上

      v1.30

      v1.30.3-apsara.6.11.11.2155fa7b及以上

      v1.31

      v1.31.0-apsara.6.11.7.17d202a9及以上

      v1.32

      v1.32.0-apsara.6.11.11.3187ac8f及以上

      v1.33

      v1.33.0-apsara.6.11.12及以上

      v1.34

      v1.34.0-apsara.6.11.12及以上

      v1.35

      v1.35.0-apsara.6.11.12及以上

    • 安装 v2.13.0及以上版本的ACK Virtual Node

    • 安装 v2.17.0 及以上版本的 ack-agent-sandbox-controller(使用默认配置即可)

    • 已安装1.18.3及以上版本的 Knative 组件,详见部署与管理Knative组件

  • (可选,生产环境推荐)Activator 默认将会话映射存储在内存中,重启后可能丢失。生产环境或运行多个 Activator 副本时,建议使用 Redis 存储模式,需提前创建云数据库 Tair(兼容 Redis)实例。配置方法参见为 Knative 服务配置会话保持

配置 Delete 模式

Delete 模式的行为等价于标准 Knative Service + 会话保持,即空闲实例直接删除,再次访问时重新创建。适用于无状态任务或不需要保留运行环境的批处理场景。

创建 Sandbox Service

  1. 将以下配置应用到集群,启用 Sandbox 工作负载类型和会话保持。

    请将镜像地址中的registry-cn-wulanchabu-vpc替换为实际地域,如registry-cn-hangzhou-vpc
    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: ai-agent-delete
    spec:
      template:
        metadata:
          annotations:
            # 启用 Sandbox 工作负载类型
            serving.knative.dev/workload-type: "sandbox"
            # 启用会话保持,确保每个用户请求路由到固定实例
            serving.knative.dev/session-affinity: "true"
            # 30 分钟无请求后释放实例
            serving.knative.dev/session-timeout: "30m"
            # Cookie 名称,用于标识用户会话
            serving.knative.dev/session-affinity-cookie: "app"
            # 按活跃会话数扩缩容
            autoscaling.knative.dev/metric: "session"
            # 每个实例严格绑定 1 个会话
            autoscaling.knative.dev/target: "1"
        spec:
          containers:
          - image: registry-cn-wulanchabu-vpc.ack.aliyuncs.com/acs/knative-samples-helloworld-go-session:v1.0-bfdce98
  2. 等待ai-agent-delete部署完成后,在服务管理页面,获取访问网关地址和服务的默认域名

  3. 结果验证。

    1. 首次请求携带Cookie: app=11,同一 Cookie 再次访问应路由到同一 Pod。

      curl -i -H "Host: ai-agent-delete.default.example.com" http://<GATEWAY_IP> \
        -H "Cookie: app=11"

      预期输出:

      HTTP/1.1 200 OK
      Date: Fri, 05 Jun 2026 08:00:53 GMT
      Content-Type: text/plain; charset=utf-8
      Content-Length: 75
      Connection: keep-alive
      
      Hello World!
      
      Cookies:
        Name:  app
        Value: 11
      
      Raw Cookie Header: app=11
    2. 再次请求携带Cookie: app=22,该请求将会访问另一个Pod。

      curl -i -H "Host: ai-agent-delete.default.example.com" http://<GATEWAY_IP> \
        -H "Cookie: app=22"

      预期输出:

      HTTP/1.1 200 OK
      Date: Fri, 05 Jun 2026 08:02:49 GMT
      Content-Type: text/plain; charset=utf-8
      Content-Length: 75
      Connection: keep-alive
      
      Hello World!
      
      Cookies:
        Name:  app
        Value: 22
      
      Raw Cookie Header: app=22

请求路由逻辑

配置生效后,用户请求的处理流程如下:

  1. 首个用户请求到达:无可用实例,自动扩容创建 Sandbox-1,会话绑定到 Sandbox-1。

  2. 第二个用户请求到达:Sandbox-1 已被 session-1 独占(target=1),请求等待,APA 自动扩容 Sandbox-2,会话绑定到 Sandbox-2。

  3. 用户 30 分钟未访问:会话超时,实例删除,资源释放。

  4. 所有用户均无活跃:缩容到 0,零资源占用。

配置 Pause 模式

Pause 模式是 Sandbox 的核心能力,专为 AI Agent、在线 IDE、远程开发等需要长期保留运行环境的场景设计。实例空闲后进入冻结状态而非删除。用户再次访问时,秒级恢复到中断前的工作环境,打开的文件、运行中的进程、已安装的依赖全部保留。

创建 Pause 模式 Sandbox Service

  1. 相比 Delete 模式,需增加 serving.knative.dev/sandbox-idle-policy: "pause"注解。

    请将镜像地址中的registry-cn-wulanchabu-vpc替换为实际地域,如registry-cn-hangzhou-vpc
    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: ai-agent-pause
    spec:
      template:
        metadata:
          annotations:
            serving.knative.dev/workload-type: "sandbox"
            serving.knative.dev/sandbox-idle-policy: "pause"
            serving.knative.dev/session-affinity: "true"
            # 指定暖池大小(预热的 Sandbox 实例数量)
            serving.knative.dev/warm-pool: "3"
            serving.knative.dev/session-timeout: "30m"
            serving.knative.dev/session-expiry: "2h"
            serving.knative.dev/session-affinity-cookie: "test"
            autoscaling.knative.dev/metric: "session"
            autoscaling.knative.dev/target: "1"
        spec:
          containers:
          - image: registry-cn-wulanchabu-vpc.ack.aliyuncs.com/acs/knative-samples-helloworld-go-session:v1.0-bfdce98
  2. 等待ai-agent-pause部署完成后,在服务管理页面,获取访问网关地址和服务的默认域名

  3. 结果验证。

    curl -i -H "Host: ai-agent-pause.default.example.com" http://<GATEWAY_IP> \
      -H "Cookie: app=11"

    预期输出:

    HTTP/1.1 200 OK
    Date: Fri, 05 Jun 2026 08:33:06 GMT
    Content-Type: text/plain; charset=utf-8
    Content-Length: 75
    Connection: keep-alive
    
    Hello World!
    
    Cookies:
      Name:  app
      Value: 11
    
    Raw Cookie Header: app=11

状态保留范围

Pause 后,以下状态完整保留,唤醒后无需重新初始化。

保留项

说明

IP 地址

Pod IP 不变,网络连接可恢复

文件系统

容器内文件系统完整保留

配置预热池

预热池(Warm Pool)是 Pause 模式的高级配置,预先创建并冻结指定数量的 Sandbox 实例,使新用户到来时能直接唤醒已有实例,而无需等待冷启动。

通过以下Annotation指定预热池大小。

annotations:
  # 指定预热池大小(预热的 Sandbox 实例数量)
  serving.knative.dev/warm-pool: "3"

Annotation参考

Annotation

说明

默认值

serving.knative.dev/workload-type

工作负载类型,设为 "sandbox" 以启用 Sandbox

无("deployment"

serving.knative.dev/sandbox-idle-policy

空闲策略:"delete""pause"

"delete"

serving.knative.dev/session-affinity

启用会话保持

"false"

serving.knative.dev/session-timeout

会话超时时间(无请求后释放/休眠)

"30m"

autoscaling.knative.dev/metric

扩缩容指标,会话保持场景设为 "session"

"concurrency"

autoscaling.knative.dev/target

每个实例的目标会话数

"100"

serving.knative.dev/warm-pool

仅 Pause 模式有效

预热池大小

"0"

autoscaling.knative.dev/min-scale

最小实例数

"0"

autoscaling.knative.dev/max-scale

最大实例数

无限制

常见问题

Pause 模式和 Delete 模式如何选择?

取决于是否需要保留运行状态:

  • Pause 模式:需要保留容器状态(文件、进程)。

  • Delete 模式:无需保留状态,追求空闲时零资源占用。

多个用户的请求会路由到同一个 Sandbox 吗?

设置 target=1 时不会。每个 Sandbox 实例严格绑定一个会话,新用户到来时会等待新实例就绪或唤醒预热池中的冻结实例。

Activator 重启后会话会丢失吗?

取决于会话存储模式:

  • 内存模式:单实例且有限恢复会话数据。

  • Redis 模式:从 Redis 完整恢复,零数据丢失。

因此,生产环境建议使用 Redis 模式以确保 Activator 重启后会话完整恢复。