在华为云 CCE 上解锁 AgentCube,打造高性能 AI Agent

举报
云容器大未来 发表于 2026/06/11 09:31:20 2026/06/11
【摘要】 随着大模型技术的飞速发展,AI Agent 正从概念走向生产。与传统的批处理任务或推理服务不同,Agent 工作负载呈现出独特的运行特征——间歇性活跃、极低延迟敏感、多轮会话状态持久化。然而,现有的 Kubernetes 调度体系主要面向批处理和长运行服务设计,难以有效应对这类"潮汐式"交互负载:空闲时资源白白占用,唤醒时又无法做到亚秒级响应,状态管理更是一大痛点。

随着大模型技术的飞速发展,AI Agent 正从概念走向生产。与传统的批处理任务或推理服务不同,Agent 工作负载呈现出独特的运行特征——间歇性活跃极低延迟敏感多轮会话状态持久化。然而,现有的 Kubernetes 调度体系主要面向批处理和长运行服务设计,难以有效应对这类"潮汐式"交互负载:空闲时资源白白占用,唤醒时又无法做到亚秒级响应,状态管理更是一大痛点。

AgentCube[1] 正是为解决这一矛盾而生。作为 Volcano社区[2]的子项目,AgentCube 专为 AI Agent 工作负载打造了专用的控制面与数据面,核心优势体现在四个方面:

  • 极速启动—— 通过 Warm Pool (预热池)机制预先创建并暂停一批沙箱,当 Agent 请求到来时以 "Claim-and-Go" 的方式进行毫秒级分配,消除冷启动瓶颈。
  • 高效调度 —— 借助 Volcano Agent Scheduler 的乐观并发控制与精简调度策略,大幅提升调度吞吐,并能与 Volcano 原有的 Batch Scheduler 无缝协作,确保 Agent 与传统批处理作业的统一调度与资源协调。
  • 原生会话管理 —— 以 Session ID 为核心路由标识,会话到来时自动识别并路由请求至对应沙箱,并在沙箱休眠时自动唤醒,保障多轮交互的上下文连续性。
  • 安全隔离 —— 为每个会话分配独立沙箱,确保计算、内存与文件系统的端到端隔离,防止跨租户数据泄露。同时支持以安全容器运行 Agent,借助安全运行时技术实现内核级强隔离。

本文将聚焦 AgentCube 在华为云 CCE(云容器引擎)上的实践,探讨如何将 AgentCube 的调度能力与 CCE 的基础设施深度结合,为 AI Agent 应用提供高效、稳定的云原生运行底座。关于AgentCube的原理可通过设计文档[3]往期文章[4]了解。

  环境准备  

  • 已经创建好了一个1.29或更高版本的CCE集群
  • 确保本地安装的python版本>=3.11
  • 安装SDK[5] : pip install agentcube_sdk

  安装 AgentCube 插件  

AgentCube目前已上架华为云 CCE 插件市场。可通过登录CCE控制台[6]进入集群插件中心界面,找到AgentCube插件进行配置安装。

AgentCube主要组件

  • workloadmanager:管理AgentRuntime和CodeInterpreter的生命周期。
  • agentcube-router:API 网关,代理客户端请求到沙箱实例。
  • volcano-agent-scheduler:调度器组件,提供低延迟和高吞吐的负责调度。
  • agent-sandbox-controller:管理AgentSandbox资源。

安装时需要设置如下参数

  • redis.addr:Redis的地址,必须配置。
  • redis.password:Redis的密码,必须配置。
  • agentSandbox.install:是否自动安装agent-sandbox。AgentCube插件运行时依赖 agent-sandbox[7],当参数配置为true时会自动安装。如果集群已手动安装了agent-sandbox,则可配置为false跳过安装。
  • agentSandbox.extensions:是否启用agent-sandbox的extension controller。
  • volcano.scheduler.enabled:是否安装volcano agent-scheduler调度器。

由于AgentCube运行时依赖Redis维护会话状态和索引,从稳定性和可扩展性考虑,建议购买和使用华为云分布式缓存服务 DCS[8]。此外,如果要在集群外访问 AgentCube,可为workloadmanager和agentcube-router的Service绑定ELB Ingress。

  开始使用  

步骤一:环境变量设置

export WORKLOAD_MANAGER_URL="http://workloadmanager-addr:workloadmanager-port" 
export ROUTER_URL="http://agentcube-router-addr:agentcube-router-port"

其中workloadmanager-addrworkloadmanager-service-nodeport为workload-manager的访问地址和端口,agentcube-router-addragentcube-router-port为agentcube-router的访问地址和端口。

步骤二:使用CodeInterpreter

CodeInterpreter是AgentCube两大核心能力之一(另一个是AgentRuntime),是专为执行 LLM 生成的不可信代码而设计的受限运行时。通过收窄模板配置、内置 JWT 认证和预热池加速,在保障安全隔离的同时实现毫秒级启动,适用于代码解释器等沙箱执行场景。

部署CodeInterpreter

首先创建文件code-interpreter.yaml:

apiVersion: runtime.agentcube.volcano.sh/v1alpha1
kind: CodeInterpreter
metadata:
  name: my-codeinterpreter
  namespace: default
spec:
  template:
    # runtimeClassName: kata    # 若使用安全容器,则可配置runtimeClassName为kata或kuasar-vmm(需要有支持安全运行时的节点)
    image: swr.ap-southeast-3.myhuaweicloud.com/container/picod:latest    # 使用 PicoD 镜像,当前示例使用的镜像仅支持执行shell和python代码
    resources:
      requests:
        cpu: "100m"
        memory: "128Mi"
      limits:
        cpu: "500m"
        memory: "512Mi"
  sessionTimeout: "15m"      # 空闲 15 分钟后超时
  maxSessionDuration: "8h"   # 最大会话时长 8 小时
  warmPoolSize: 5    # 预热 5 个 Pod

执行部署:

kubectl apply -f code-interpreter.yaml

验证是否部署成功:

kubectl get codeinterpreter

部署完成后,等待一段时间执行kubectl get pods |grep my-codeinterpreter可以看到已经预热出了5个CodeInterpreter。

远程执行第一份代码

创建python脚本quickstart.py:

import os
from agentcube import CodeInterpreterClient

WORKLOAD_MANAGER_URL = os.getenv('WORKLOAD_MANAGER_URL', 'http://workloadmanager.agentcube.svc.cluster.local:8080')
ROUTER_URL = os.getenv('ROUTER_URL', 'http://agentcube-router.agentcube.svc.cluster.local:8080')

with CodeInterpreterClient(name="my-codeinterpreter", namespace="default") as client:
    result = client.run_code("python", "print('Hello from AgentCube!')")
    print(result)

上述python脚本会连接到上一步部署的CodeInterpreter,启动一个隔离的沙箱会话,向其发送一段待执行的 Python 代码片段,并打印输出结果。执行python quickstart.py开始运行,输出:

2026-06-05 15:25:22,584 | INFO | agentcube.code_interpreter | Creating new session...
2026-06-05 15:25:22,790 | INFO | agentcube.code_interpreter | Session created: 900923f4-4d1c-4383-ac6b-331c5ec83acb
Hello from AgentCube!

2026-06-05 15:25:22,921 | INFO | agentcube.code_interpreter | Deleting session 900923f4-4d1c-4383-ac6b-331c5ec83acb...

尝试在一个会话中连续执行代码

在步骤三中,我们创建的 CodeInterpreter 仅运行了单次代码便自动结束了会话。但在真实的业务场景中,我们往往需要处理多轮连续交互。接下来,我们将通过一个更具实战价值的进阶示例,来展示 AgentCube 的会话保持能力。

创建python脚本longtask.py:

import os
from agentcube import CodeInterpreterClient

WORKLOAD_MANAGER_URL = os.getenv('WORKLOAD_MANAGER_URL', 'http://workloadmanager.agentcube.svc.cluster.local:8080')
ROUTER_URL = os.getenv('ROUTER_URL', 'http://agentcube-router.agentcube.svc.cluster.local:8080')

def session_reuse_workflow():
    # 步骤 1:创建会话并写入数据
    print("step 1: Create a session and write initial data.")
    client1 = CodeInterpreterClient(
        name='my-codeinterpreter',
        namespace='default',
        workload_manager_url=WORKLOAD_MANAGER_URL,
        router_url=ROUTER_URL,
    )

    # 写入多个文件
    client1.write_file("100", "counter.txt")
    client1.write_file("[]", "results.json")

    session_id = client1.session_id
    print(f"session ID: {session_id}")
    print("The file system status has been saved.\n")

    # 注意:不调用 client1.stop(),让会话保持活跃

    # 步骤 2:复用会话,读取并处理数据
    print("step 2: Reusing sessions and processing data.")
    client2 = CodeInterpreterClient(
        name='my-codeinterpreter',
        namespace='default',
        workload_manager_url=WORKLOAD_MANAGER_URL,
        router_url=ROUTER_URL,
        session_id=session_id,  # 复用会话
    )

    code = """
import json
import time

# 读取计数器
with open('counter.txt') as f:
    counter = int(f.read().strip())
print(f"current count: {counter}")

# 增加计数
counter += 1
with open('counter.txt', 'w') as f:
    f.write(str(counter))

# 读取结果列表
with open('results.json') as f:
    results = json.load(f)

# 添加新结果
results.append({
    'timestamp': time.time(),
    'counter': counter
})

# 保存结果
with open('results.json', 'w') as f:
    json.dump(results, f, indent=2)

print(f"new count: {counter}")
print(f"result count: {len(results)}")
"""

    result = client2.run_code("python", code)
    print(f"{result}\n")

    # 步骤 3:查看文件系统状态
    print("step 3: Verifying the File System Statuses")
    files = client2.list_files(".")
    print(f"Files in session: {[f['name'] for f in files]}\n")

    # 清理会话
    client2.stop()
    print("session is deleted")

if __name__ == "__main__":
    session_reuse_workflow()

上述python脚本首先创建了一个会话,往CodeInterpreter中上传了两个文件counter.txtresults.json。然后并不立即关闭会话,而是使用第一次创建会话时返回的session_id(会话ID)再次创建了一个客户端并远程执行代码。执行python longtask.py开始运行,输出如下:

step 1: Create a session and write initial data.
2026-06-05 15:45:03,386 | INFO | agentcube.code_interpreter | Creating new session...
2026-06-05 15:45:03,775 | INFO | agentcube.code_interpreter | Session created: eda5f22f-ad7d-4d95-9adf-b74dbf015051
session ID: eda5f22f-ad7d-4d95-9adf-b74dbf015051
The file system status has been saved.

step 2: Reusing sessions and processing data.
2026-06-05 15:45:03,893 | INFO | agentcube.code_interpreter | Reusing existing session: eda5f22f-ad7d-4d95-9adf-b74dbf015051
current count: 100
new count: 101
result count: 1

step 3: Verifying the File System Statuses
Files in session: ['.bashrc', '.profile', 'counter.txt', 'picod', 'results.json', 'script_1780645503894.py']

2026-06-05 15:45:04,072 | INFO | agentcube.code_interpreter | Deleting session eda5f22f-ad7d-4d95-9adf-b74dbf015051...
session is deleted

可以看到3轮请求的session_id是相同的,说明 AgentCube 识别到了请求所属中的会话ID,将所有请求都代理到了同一个CodeInterpreter实例而非创建新的。且第2、3轮请求能够读取到第1轮请求上传的文件,说明这个CodeInterpreter实例并没有被销毁和重建,它的整个运行时状态——包括文件系统、内存中的变量、进程上下文等,都在请求之间完整保留。这正是 CodeInterpreter 区别于无状态函数调用的核心优势。

步骤三:使用AgentRuntime

有别于 CodeInterpreterAgentRuntime 支持完整的 PodSpec 自定义,适用于对话、工具调用等常规 Agent 场景。

部署AgentRuntime

创建agent.py、requirements.txt文件,其中agent.py文件内容为官方提供的Agent示例代码[9],requirements.txt如下:

agentcube_sdk

使用如下Dockerfile制作Agent容器镜像,并将制作好的镜像上传华为云SWR。

FROM python:3.11-slim

WORKDIR /app

# 复制依赖文件
COPY requirements.txt .

# 安装 Python 依赖
RUN pip install --no-cache-dir -r requirements.txt

# 复制应用代码
COPY agent.py /app/

# 暴露端口
EXPOSE8080

# 运行应用
CMD ["python", "/app/agent.py"]

创建文件agent-runtime.yaml:

apiVersion: runtime.agentcube.volcano.sh/v1alpha1
kind: AgentRuntime
metadata:
  name: my-agent-app
  namespace: default
spec:
  targetPort:
    - pathPrefix: "/"
      port: 8080
      protocol: "HTTP"
  podTemplate:
    labels:
      app: my-agent-app
    spec:
      schedulerName: default-scheduler    # 如果开启安装了volcano agent-scheduler调度器,可配置为agent-scheduler
      containers:
        - name: my-agent-app
          image: {{agent image}}    # 构建好并上传华为云SWR的Agent容器镜像
          env:
            - name: WORKLOAD_MANAGER_URL
              value: http://workloadmanager.agentcube.svc.cluster.local:8080
            - name: ROUTER_URL
              value: http://agentcube-router.agentcube.svc.cluster.local:8080
            - name: CODEINTERPRETER_NAME
              value: my-codeinterpreter
            - name: CODEINTERPRETER_NAMESPACE
              value: default
          readinessProbe:
            httpGet:
              path: /health
              port: 8080
            periodSeconds: 5
  sessionTimeout: "15m"             # 空闲 15 分钟后超时
  maxSessionDuration: "8h"          # 最大会话时长 8 小时
status: {}

执行部署:

kubectl apply -f agent-runtime.yaml

验证是否部署成功:

kubectl get agentruntime

输出:

NAME           AGE
my-agent-app   1m

说明部署成功,my-agent-app为我们创建的Agent的名字。

与Agent进行对话

创建python脚本chatToAgent.py:

from agentcube.agent_runtime import AgentRuntimeClient
import os
import time


ROUTER_URL = os.getenv('ROUTER_URL', 'http://agentcube-router.agentcube.svc.cluster.local:8080')

def test_conversation():
    # 第一轮对话
    agent_client1 = AgentRuntimeClient(
        agent_name='my-agent-app',
        namespace='default',
        router_url=ROUTER_URL,
        timeout=500,
        connect_timeout=120.0
    )

    # 记录会话ID,后续对话复用
    session_id = agent_client1.session_id

    result = agent_client1.invoke(
        payload={"prompt": "Introduce yourself"},
    )
    print(f"response: {result}\n")
    time.sleep(1)

    # 第二轮对话
    agent_client2 = AgentRuntimeClient(
        agent_name='my-agent-app',
        namespace='default',
        router_url=ROUTER_URL,
        timeout=500,
        connect_timeout=120.0,
        session_id=session_id
    )

    result = agent_client2.invoke(
        payload={"prompt": "What can you do?"},
    )
    print(f"response: {result}\n")
    time.sleep(1)

    # 第三轮对话
    agent_client3 = AgentRuntimeClient(
        agent_name='my-agent-app',
        namespace='default',
        router_url=ROUTER_URL,
        timeout=500,
        connect_timeout=120.0,
        session_id=session_id
    )

    result = agent_client3.invoke(
        payload={"prompt": "Write a Python function for me"},
    )
    print(f"response: {result}\n")


if __name__ == "__main__":
    test_conversation()

上述python脚本首先创建了一个对话,对话的对象是上一步创建的my-agent-appAgent应用,然后连续发起3次对话。输出如下:

2026-06-05 16:33:28,396 | INFO | agentcube.agent_runtime | Bootstrapping AgentRuntime session...
2026-06-05 16:33:29,771 | INFO | agentcube.agent_runtime | AgentRuntime session created: cdb9f642-fcfd-4d96-b024-c49b8fc4baf3
response: {'response': 'Hello Agent received: Introduce yourself', 'agent': 'hello-agent', 'timestamp': '2026-06-05T08:33:29.839193', 'original_prompt': 'Introduce yourself'}

2026-06-05 16:33:30,812 | INFO | agentcube.agent_runtime | Reusing AgentRuntime session: cdb9f642-fcfd-4d96-b024-c49b8fc4baf3
response: {'response': 'Hello Agent received: What can you do?', 'agent': 'hello-agent', 'timestamp': '2026-06-05T08:33:30.912573', 'original_prompt': 'What can you do?'}

2026-06-05 16:33:31,886 | INFO | agentcube.agent_runtime | Reusing AgentRuntime session: cdb9f642-fcfd-4d96-b024-c49b8fc4baf3
response: {'response': 'Hello Agent received: Write a Python function for me', 'agent': 'hello-agent', 'timestamp': '2026-06-05T08:33:31.989551', 'original_prompt': 'Write a Python function for me'}

可以看到3次对话的session_id是相同的,说明 AgentCube 识别到了请求所属中的会话ID,将所有请求都代理到了同一个AgentRuntime实例。

  总 结  

AgentCube 以极速启动、高效调度、原生会话管理、安全隔离四大核心能力,补齐了 K8s 集群承载 AI Agent 工作负载的短板。华为云 CCE 将持续集成 AgentCube ,为用户打造低延迟、高吞吐、强隔离的高性能 AI Agent 运行底座。


相关链接

[1] AgentCube GitHub仓库: https://github.com/volcano-sh/agentcube
[2] Volcano官网: https://volcano.sh
[3] AgentCube设计文档: https://github.com/volcano-sh/agentcube/tree/main/docs/design
[4] Kubernetes 跑 AI Agent,缺的不只是算力——AgentCube 补上了什么: https://bbs.huaweicloud.com/blogs/477468
[5] Python SDK: https://github.com/volcano-sh/agentcube/tree/main/sdk-python
[6] 华为云CCE控制台: https://console.huaweicloud.com/cce2.0/?region=cn-north-9#/cce/cluster/list
[7] AgentSandbox: https://github.com/kubernetes-sigs/agent-sandbox
[8] 华为云分布式缓存服务 DCS: https://support.huaweicloud.com/productdesc-dcs/dcs-pd-200713001.html
[9] Agent示例代码: https://github.com/volcano-sh/agentcube/blob/release-0.1.0/cmd/cli/examples/hello-agent/main.py



容器模仿.png

关注魔方公众号,获取更多前沿资讯

添加社区小助手k8s2222,进入技术交流群

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。