当前位置: 首页 > news >正文

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

本文分享自华为云社区《在华为云 CCE 上解锁 AgentCube,打造高性能 AI Agent》

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

AgentCube 正是为解决这一矛盾而生。作为 Volcano社区的子项目,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的原理可通过设计文档或往期文章了解。

环境准备

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

安装 AgentCube 插件

AgentCube目前已上架华为云 CCE 插件市场。可通过登录CCE控制台进入集群插件中心界面,找到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,当参数配置为true时会自动安装。如果集群已手动安装了agent-sandbox,则可配置为false跳过安装。
  • agentSandbox.extensions:是否启用agent-sandbox的extension controller。
  • volcano.scheduler.enabled:是否安装volcano agent-scheduler调度器。

由于AgentCube运行时依赖Redis维护会话状态和索引,从稳定性和可扩展性考虑,建议购买和使用华为云分布式缓存服务 DCS。此外,如果要在集群外访问 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示例代码,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/

# 暴露端口

EXPOSE 8080

# 运行应用

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官网: Volcano

[3] AgentCube设计文档: https://github.com/volcano-sh/agentcube/tree/main/docs/design

[4] Kubernetes 跑 AI Agent,缺的不只是算力——AgentCube 补上了什么: Kubernetes 跑 AI Agent,缺的不只是算力——AgentCube 补上了什么-云社区-华为云

[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: GitHub - kubernetes-sigs/agent-sandbox: agent-sandbox enables easy management of isolated, stateful, singleton workloads, ideal for use cases like AI agent runtimes. · GitHub

[8] 华为云分布式缓存服务 DCS: Security Verification

[9] Agent示例代码: agentcube/cmd/cli/examples/hello-agent/main.py at release-0.1.0 · volcano-sh/agentcube · GitHub

http://www.gsyq.cn/news/1607741.html

相关文章:

  • “荣家厚勤“系列推介|智慧医院后勤管理平台怎么选?综合解决方案让管理“更智慧“、效益“更突出“
  • 实战指南丨三维视觉与SLAM求职面试的核心要点与项目突围
  • 庭院门哪家好
  • Cursor-AI模型选型与协作指南
  • MOOTDX:免费获取实时股票数据的终极解决方案
  • 企业级文件上传漏洞深度解析:从原理到飞企互联FE平台实战复现
  • Rimworld Mod进阶 图形篇 第一讲:活用GraphicData,打造视觉差异化Mod
  • 【记录】「COCI 2015.11」SAVEZ
  • 工业机器人搬运应用落地案例:汽车冷凝器芯体搬运
  • Python大麦抢票脚本终极指南:如何用自动化技术提升300%成功率
  • 2026实测:两款主流AI编程工具vibe coding能力深度对比
  • 企业落地 AI Agent:降低成本与 ROI 风险完整落地方案
  • 实测深度测评!Paperxie智能写作,解锁毕业论文高效创作新范式
  • 达梦数据库DEM组件反序列化RCE漏洞(CNVD-2023-69447)复现与防御
  • H5+Plus实战:低功耗蓝牙设备连接与数据交互全流程解析
  • 公证处公证亲属关系需要什么材料?亲属关系公证办理流程是什么?
  • DataX实战(02)- 在IDEA中从源码编译到插件调试的一站式指南
  • Logback + ELK 实现北极星日淘日志集中收集与异常排查
  • 如何3步掌握歌词滚动姬LRC Maker:免费制作专业滚动歌词的终极指南
  • 百家号批量发布工具实测:安全、效率、管理对比
  • Twitter 如何通过关键词获得精准流量?实操思路详解
  • 在Linux上解锁完整B站体验:3个痛点场景与深度解决方案
  • 终极指南:用Nucleus Co-Op实现一台电脑四人同屏游戏
  • 零碳园区智能化管理平台执行反馈层的效果反馈实现逻辑
  • G-Helper:华硕笔记本终极控制指南,三步解锁完整硬件潜能
  • DouyinLiveRecorder:40+平台全自动直播录制神器
  • 计算机毕业设计之基于人脸识别的图书管理系统
  • 工控人怒吼:那些 GitHub 高星的“开源工业项目“,为什么一到产线就翻车?
  • OpenClaw工作流设计入门,自动化任务编排实例标题)
  • 3个关键维度:全面解锁AMD Ryzen处理器的硬件调试能力