• [产品讨论] 求助!配置集群弹出错误信息,急急急,在做期末实验
    配置信息如下: 弹出信息如下:   
  • [技术干货] 在华为云 CCE 上解锁 AgentCube,打造高性能 AI Agent
    随着大模型技术的飞速发展,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-addr、workloadmanager-service-nodeport为workload-manager的访问地址和端口,agentcube-router-addr、agentcube-router-port为agentcube-router的访问地址和端口。▍步骤二:使用CodeInterpreterCodeInterpreter是AgentCube两大核心能力之一(另一个是AgentRuntime),是专为执行 LLM 生成的不可信代码而设计的受限运行时。通过收窄模板配置、内置 JWT 认证和预热池加速,在保障安全隔离的同时实现毫秒级启动,适用于代码解释器等沙箱执行场景。部署CodeInterpreter首先创建文件code-interpreter.yaml:apiVersion: runtime.agentcube.volcano.sh/v1alpha1kind: CodeInterpretermetadata:  name: my-codeinterpreter  namespace: defaultspec:  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 osfrom agentcube import CodeInterpreterClientWORKLOAD_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-331c5ec83acbHello 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 osfrom agentcube import CodeInterpreterClientWORKLOAD_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 jsonimport time# 读取计数器with open('counter.txt') as f:    counter = int(f.read().strip())print(f"current count: {counter}")# 增加计数counter += 1with 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.txt和results.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-b74dbf015051session ID: eda5f22f-ad7d-4d95-9adf-b74dbf015051The 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-b74dbf015051current count: 100new count: 101result count: 1step 3: Verifying the File System StatusesFiles 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有别于 CodeInterpreter,AgentRuntime 支持完整的 PodSpec 自定义,适用于对话、工具调用等常规 Agent 场景。部署AgentRuntime创建agent.py、requirements.txt文件,其中agent.py文件内容为官方提供的Agent示例代码[9],requirements.txt如下:agentcube_sdk使用如下Dockerfile制作Agent容器镜像,并将制作好的镜像上传华为云SWR。FROM python:3.11-slimWORKDIR /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/v1alpha1kind: AgentRuntimemetadata:  name: my-agent-app  namespace: defaultspec:  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           AGEmy-agent-app   1m说明部署成功,my-agent-app为我们创建的Agent的名字。与Agent进行对话创建python脚本chatToAgent.py:from agentcube.agent_runtime import AgentRuntimeClientimport osimport timeROUTER_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-c49b8fc4baf3response: {'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-c49b8fc4baf3response: {'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-c49b8fc4baf3response: {'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仓库: cid:link_7[2] Volcano官网: https://volcano.sh[3] AgentCube设计文档: cid:link_3[4] Kubernetes 跑 AI Agent,缺的不只是算力——AgentCube 补上了什么: cid:link_6[5] Python SDK: cid:link_4[6] 华为云CCE控制台: cid:link_1[7] AgentSandbox: cid:link_5[8] 华为云分布式缓存服务 DCS: cid:link_2[9] Agent示例代码: cid:link_0 关注魔方公众号,获取更多前沿资讯添加社区小助手k8s2222,进入技术交流群
  • [技术干货] 在华为云 CCE 上解锁 AgentCube,打造高性能 AI Agent
    随着大模型技术的飞速发展,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-addr、workloadmanager-service-nodeport为workload-manager的访问地址和端口,agentcube-router-addr、agentcube-router-port为agentcube-router的访问地址和端口。▍步骤二:使用CodeInterpreterCodeInterpreter是AgentCube两大核心能力之一(另一个是AgentRuntime),是专为执行 LLM 生成的不可信代码而设计的受限运行时。通过收窄模板配置、内置 JWT 认证和预热池加速,在保障安全隔离的同时实现毫秒级启动,适用于代码解释器等沙箱执行场景。部署CodeInterpreter首先创建文件code-interpreter.yaml:apiVersion: runtime.agentcube.volcano.sh/v1alpha1kind: CodeInterpretermetadata:  name: my-codeinterpreter  namespace: defaultspec:  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 osfrom agentcube import CodeInterpreterClientWORKLOAD_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-331c5ec83acbHello 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 osfrom agentcube import CodeInterpreterClientWORKLOAD_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 jsonimport time# 读取计数器with open('counter.txt') as f:    counter = int(f.read().strip())print(f"current count: {counter}")# 增加计数counter += 1with 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.txt和results.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-b74dbf015051session ID: eda5f22f-ad7d-4d95-9adf-b74dbf015051The 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-b74dbf015051current count: 100new count: 101result count: 1step 3: Verifying the File System StatusesFiles 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有别于 CodeInterpreter,AgentRuntime 支持完整的 PodSpec 自定义,适用于对话、工具调用等常规 Agent 场景。部署AgentRuntime创建agent.py、requirements.txt文件,其中agent.py文件内容为官方提供的Agent示例代码[9],requirements.txt如下:agentcube_sdk使用如下Dockerfile制作Agent容器镜像,并将制作好的镜像上传华为云SWR。FROM python:3.11-slimWORKDIR /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/v1alpha1kind: AgentRuntimemetadata:  name: my-agent-app  namespace: defaultspec:  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           AGEmy-agent-app   1m说明部署成功,my-agent-app为我们创建的Agent的名字。与Agent进行对话创建python脚本chatToAgent.py:from agentcube.agent_runtime import AgentRuntimeClientimport osimport timeROUTER_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-c49b8fc4baf3response: {'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-c49b8fc4baf3response: {'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-c49b8fc4baf3response: {'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仓库: cid:link_7[2] Volcano官网: https://volcano.sh[3] AgentCube设计文档: cid:link_3[4] Kubernetes 跑 AI Agent,缺的不只是算力——AgentCube 补上了什么: cid:link_6[5] Python SDK: cid:link_4[6] 华为云CCE控制台: cid:link_1[7] AgentSandbox: cid:link_5[8] 华为云分布式缓存服务 DCS: cid:link_2[9] Agent示例代码: cid:link_0 关注魔方公众号,获取更多前沿资讯添加社区小助手k8s2222,进入技术交流群
  • [行业前沿] 在华为云 CCE 上解锁 AgentCube,打造高性能 AI Agent
    随着大模型技术的飞速发展,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-addr、workloadmanager-service-nodeport为workload-manager的访问地址和端口,agentcube-router-addr、agentcube-router-port为agentcube-router的访问地址和端口。▍步骤二:使用CodeInterpreterCodeInterpreter是AgentCube两大核心能力之一(另一个是AgentRuntime),是专为执行 LLM 生成的不可信代码而设计的受限运行时。通过收窄模板配置、内置 JWT 认证和预热池加速,在保障安全隔离的同时实现毫秒级启动,适用于代码解释器等沙箱执行场景。部署CodeInterpreter首先创建文件code-interpreter.yaml:apiVersion: runtime.agentcube.volcano.sh/v1alpha1kind: CodeInterpretermetadata:  name: my-codeinterpreter  namespace: defaultspec:  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 osfrom agentcube import CodeInterpreterClientWORKLOAD_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-331c5ec83acbHello 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 osfrom agentcube import CodeInterpreterClientWORKLOAD_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 jsonimport time# 读取计数器with open('counter.txt') as f:    counter = int(f.read().strip())print(f"current count: {counter}")# 增加计数counter += 1with 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.txt和results.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-b74dbf015051session ID: eda5f22f-ad7d-4d95-9adf-b74dbf015051The 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-b74dbf015051current count: 100new count: 101result count: 1step 3: Verifying the File System StatusesFiles 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有别于 CodeInterpreter,AgentRuntime 支持完整的 PodSpec 自定义,适用于对话、工具调用等常规 Agent 场景。部署AgentRuntime创建agent.py、requirements.txt文件,其中agent.py文件内容为官方提供的Agent示例代码[9],requirements.txt如下:agentcube_sdk使用如下Dockerfile制作Agent容器镜像,并将制作好的镜像上传华为云SWR。FROM python:3.11-slimWORKDIR /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/v1alpha1kind: AgentRuntimemetadata:  name: my-agent-app  namespace: defaultspec:  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           AGEmy-agent-app   1m说明部署成功,my-agent-app为我们创建的Agent的名字。与Agent进行对话创建python脚本chatToAgent.py:from agentcube.agent_runtime import AgentRuntimeClientimport osimport timeROUTER_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-c49b8fc4baf3response: {'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-c49b8fc4baf3response: {'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-c49b8fc4baf3response: {'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仓库: cid:link_7[2] Volcano官网: https://volcano.sh[3] AgentCube设计文档: cid:link_3[4] Kubernetes 跑 AI Agent,缺的不只是算力——AgentCube 补上了什么: cid:link_6[5] Python SDK: cid:link_4[6] 华为云CCE控制台: cid:link_1[7] AgentSandbox: cid:link_5[8] 华为云分布式缓存服务 DCS: cid:link_2[9] Agent示例代码: cid:link_0 关注魔方公众号,获取更多前沿资讯添加社区小助手k8s2222,进入技术交流群
  • [技术干货] 华为云云容器引擎CCE 2026-Q1优化升级,全面进化您的云原生体验!
    华为云云容器引擎CCE近期推出多项核心能力升级,从可观测性、技术栈前沿性、操作便捷性等维度,全面进化您的云原生体验,助力业务高效、稳定、安全地运行。欢迎体验!
  • CCE集群是什么?
    在AI开发平台ModelArts/轻量算力集群/购买轻量算力集群购买轻量算力集群时需要选择CCE集群,其中CCE集群是什么?
  • [行业前沿] 华为云CCE Autopilot:从"黑盒运维"到"智能运维",重塑沙特家电零售巨头的数字引擎
    面对互联网大促,技术团队最为焦虑的莫过于“系统能否扛住”,如何打破“峰值体验差”与“资源成本失控”的魔咒?沙特家电零售巨头 Alsaif Gallery 借助华为云 CCE Autopilot,实现系统时延降低 75%、日常运维负担减少 80%、成本优化 30%。当2025年沙特国庆日销售战绩定格在单日5万订单时,Alsaif Gallery 技术团队感受到的不仅是喜悦,更是一种久违的从容。就在数月前,同样的流量洪峰还意味着紧绷的神经与对系统中断的深深焦虑。如今,这一切已成为历史。运维工作从过去如“黑盒”般不可预测,到如今“智驾”般自动高效,曾经困扰 Alsaif Gallery 许久的“流量峰值用户体验”和“失控的资源成本”两大难题,已不再是平台业务爆发增长的绊脚石。这家沙特家电零售巨头的数字化转型之路,因一次关键的云迁移而彻底提速。业务狂奔,技术绊脚作为沙特前三的家电零售商,Alsaif Gallery线上业务增长迅猛。日均超3万笔订单的电商平台,是其当之无愧的业务核心引擎。然而,这台引擎的基础设施却长期饱受压力。原有云架构的复杂性,让技术团队在每次大促前都如履薄冰。他们面临着三重挑战:排障如“黑盒”:平台故障排查依赖原第三方厂商跨国支持,响应迟缓,排障效率低,并且缺乏全链路观测工具,定位问题如同大海捞针。运维靠“人扛”:中东本地资深的K8s与SRE专家稀缺,导致现有K8s集群只能维持基本运行,无法进行深度性能优化。同时,高度复杂且耦合的系统,运维严重依赖少量核心人员,使得性能瓶颈与运维风险并存。成本“过山车”:面对突发流量,原有基于虚拟机的资源模式扩缩速度慢,人工配置的扩缩策略难以自适应多变的流量。促销时资源“扩不上去”,影响用户体验;促销后资源“缩不下来”,白白浪费成本。对于依赖“斋月”、“白色星期五”等关键销售季的中东零售业而言,这不仅是技术问题,更是直接关乎品牌声誉的业务风险。Alsaif Gallery&华为云:一场始于信任的“无感迁移”面对与旧云服务深度捆绑的复杂架构,Alsaif Gallery对迁移最初持谨慎态度。华为云团队用专业与诚意破除了这层顾虑。这不是简单搬家,而是联创设计。华为云交付团队与架构师提前介入,通过超10次的深度技术交流与业务梳理,将客户“提升系统稳定性、降低运维成本”的核心诉求,转化为一套量身定制的“上云+优化”组合方案。不回避难题,而是逐一攻克。针对容器搬迁、函数改造、安全配置等十余项具体技术挑战,华为云拉通产品专家驻场支持,将迁移风险一一化解。这种直面复杂性的务实态度,赢得了客户的最终信任,决心将核心容器业务迁至华为云CCE Autopilot。系统运维跃迁:从“手动挡”到“智能驾驶”系统整体迁移仅仅花费一个月,但变化效果立竿见影。华为云CCE Autopilot的Serverless能力,为Alsaif Gallery带来了运维模式的根本性变革:全面自动化:节点、操作系统、集群升级全面自动化,让技术团队从繁琐的基础设施维护中解放出来。无缝兼容:100%兼容K8s生态,原有应用平滑迁移,业务0改造。精准弹性:基于真实负载的秒级伸缩,实现所得即所需的理想状态。迁移后,Alsaif Gallery成果直接体现在三个关键指标上:负担锐减:日常运维工作量降低80%,让技术团队得以聚焦创新。成本优化:凭借按需计费与精准弹性,资源利用率提升20%,成本降低30%以上。体验提速:系统时延从120ms大幅降低至30ms以内,用户端操作响应更加流畅。通过此次迁移,让Alsaif Gallery技术专家角色由此转变:从过去疲于奔命的“消防员”,转型成为了驾驭高效引擎、驱动业务增长的“设计师”。持续共建:从云迁移到长期战略合作本次迁移的成功,不是终点,而是Alsaif Gallery与华为云更长远合作的起点。基于建立起的信任,双方合作正向纵深发展:从大数据治理中挖掘零售电商高增长业务,到构建AI知识库提升内部效率,一系列新的数字化规划已提上日程。而华为云在其中的独特价值在于:不仅是技术的提供者,更是深谙本地市场的同行者。在沙特,华为云拥有超过200名本地技术专家,能提供7*24小时无时差响应,并深刻理解区域合规与市场特性,真正做到了“全球能力,本地服务”。云计算新范式:从“资源开销”变成“业务引擎”在沙特“2030愿景”掀起的数字化浪潮中,企业的竞争本质上是效率与敏捷性的竞争。华为云通过CCE Autopilot,为Alsaif Gallery提供的不仅是一个更强大的云平台,更是一套将复杂运维自动化、让运营成本可视可控的系统。这标志着一种全新范式的转变:云计算从“资源开销”变为企业真正的“业务引擎”。当数字基石稳固而智能,企业的增长便只需聚焦于前方更广袤的市场。 
  • [技术干货] 华为云云容器引擎CCE调度篇——使用Volcano调度工作负载
    华为云云容器引擎CCE支持多种资源与任务调度策略,有助于提升应用性能和集群整体资源利用率,CPU资源调度、GPU/NPU异构资源调度以及Volcano调度的主要功能。本系列文章将介绍Volcano调度在华为云云容器引擎CCE中的运用。Volcano是一个基于Kubernetes的批处理平台,提供了机器学习、深度学习、生物信息学、基因组学及其他大数据应用所需要而Kubernetes当前缺失的一系列特性,提供了高性能任务调度引擎、高性能异构芯片管理、高性能任务运行管理等通用计算能力。一般情况下,Kubernetes在调度工作负载时会使用自带的默认调度器,若需要使用Volcano调度器的能力,您可以为工作负载指定调度器。关于Kubernetes调度器的详情请参见为Pod指定调度器。  约束与限制  调度大量工作负载的场景下,Volcano会打印较多的日志,建议搭配日志服务使用,否则可能导致日志过多占满所在节点磁盘。  使用Volcano调度工作负载  使用Volcano调度工作负载时,只需要在Pod的spec字段中设置schedulerName参数并指定参数值为volcano,示例如下:1、使用yaml创建queue:apiVersion: scheduling.volcano.sh/v1beta1kind: Queuemetadata:  name: q1spec:  reclaimable: true  weight: 12、在Pod的spec字段中设置schedulerName参数并指定参数值为volcano:apiVersion: apps/v1kind: Deploymentmetadata:  name: nginx  labels:    app: nginxspec:  replicas: 4  selector:    matchLabels:      app: nginx  template:    metadata:      annotations:        # 指定作业到q1队列        scheduling.volcano.sh/queue-name: "q1"        volcano.sh/preemptable: "true"      labels:        app: nginx    spec:      # 指定调度器为Volcano      schedulerName: volcano      containers:      - name: nginx        image: nginx        imagePullPolicy: IfNotPresent        resources:          limits:            cpu: 1            memory: 100Mi          requests:            cpu: 1            memory: 100Mi        ports:        - containerPort: 80 同时,Volcano还支持设置负载所属队列和抢占属性等,可通过Pod的注解实现。目前Volcano支持的Pod注解配置如下:Pod注解说明scheduling.volcano.sh/queue-name: "<queue-name>"指定负载所在队列,其中<queue-name>为队列名称。volcano.sh/preemptable: "true"表示作业是否可抢占。开启后,认为该作业可以被抢占。取值范围:true:开启抢占。(默认为开启状态)false:关闭抢占。 可通过查询Pod详情查看Pod是否由Volcano调度,以及被分配的队列:1、使用以下命令查询Pod详情并获取scheduling.k8s.io/group-name的值:kubectl describe pod <pod_name>Pod的scheduling.k8s.io/group-name值回显如下:2、查看Pod是否由Volcano调度,以及被分配的队列:kubectl describe pg <group_name>回显如下:Spec:  Min Member:  1  Min Resources:    Cpu:     100m    Memory:  100Mi  Queue:     q1Status:  Conditions:    Last Transition Time:  2023-05-30T01:54:43Z    Reason:                tasks in gang are ready to be scheduled    Status:                True    Transition ID:         70be1d7d-3532-41e0-8324-c7644026b38f    Type:                  Scheduled  Phase:                   RunningEvents:  Type    Reason     Age              From     Message  ----    ------     ----             ----     -------  Normal  Scheduled  0s (x3 over 2s)  volcano  pod group is ready 📌 更多Volcano云原生批量计算社区运用,请访问社区仓库或官网:Volcano云原生批量计算社区:https://volcano.shVolcano GitHub: cid:link_2Volcano云原生批量计算公开课:cid:link_0华为云云容器引擎CCE:cid:link_1 Volcano 是业界首个云原生批量计算引擎,也是 CNCF 首个和唯一的批量计算项目。项目主要用于 AI、大数据、基因、渲染等诸多高性能计算场景,对主流通用计算框架均有很好的支持。目前,Volcano在人工智能、大数据、基因测序等海量数据计算和分析场景已得到快速应用,已完成对 Spark、Flink、Ray、 Tensorflow、PyTorch、Argo、MindSpore、Paddlepaddle 、Kubeflow、MPI、Horovod、Mxnet、KubeGene 等众多主流计算框架的支持,并构建起完善的上下游生态。 更多云原生技术动向关注容器魔方 
  • [技术干货] 华为云云容器引擎CCE调度篇——Volcano调度概述
     Volcano 是一个基于Kubernetes的云原生批处理平台,提供了机器学习、深度学习、生物信息学、基因组学及其他大数据应用所需要而Kubernetes当前缺失的一系列特性,提供了高性能任务调度引擎、高性能异构芯片管理、高性能任务运行管理等通用计算能力。  Volcano Scheduler  Volcano Scheduler是负责Pod调度的组件,它由一系列action和plugin组成。action定义了调度各环节中需要执行的动作;plugin根据不同场景提供了action 中算法的具体实现细节。Volcano Scheduler具有高度的可扩展性,您可以根据需要实现自己的action和plugin。图1 Volcano Scheduler工作流 Volcano Scheduler的工作流程如下:客户端提交的Job被调度器识别到并缓存起来。周期性开启会话,一个调度周期开始。将没有被调度的Job发送到会话的待调度队列中。遍历所有的待调度Job,按照定义的次序依次执行enqueue、allocate、preempt、reclaim、backfill等动作,为每个Job找到一个最合适的节点。将该Job 绑定到这个节点。action中执行的具体算法逻辑取决于注册的plugin中各函数的实现。关闭本次会话。  Volcano自定义资源  Pod组(PodGroup):Pod组是Volcano自定义资源类型,代表一组强关联Pod的集合,主要用于批处理工作负载场景,比如Tensorflow中的一组ps和worker。队列(Queue):容纳一组PodGroup的队列,也是该组PodGroup获取集群资源的划分依据。作业(Volcano Job,简称vcjob):Volcano自定义的Job资源类型。区别于Kubernetes Job,vcjob提供了更多高级功能,如可指定调度器、支持最小运行Pod数、 支持task、支持生命周期管理、支持指定队列、支持优先级调度等。Volcano Job更加适用于机器学习、大数据、科学计算等高性能计算场景。应用扩缩容优先级策略(Balancer与BalancerPolicyTemplate):开启Volcano应用扩缩容优先级策略后,将会在集群中新增两类CRD资源,其中BalancerPolicyTemplate用来进行优先级策略定义,Balancer用来申明扩缩容优先级的作用范围。一个Balancer CR资源对应一个BalancerPolicyTemplate CR资源,两者结合共同申明哪些工作负载使用了哪些优先级策略。详情请参见应用扩缩容优先级策略。 Volcano 是业界首个云原生批量计算引擎,也是 CNCF 首个和唯一的批量计算项目。项目主要用于 AI、大数据、基因、渲染等诸多高性能计算场景,对主流通用计算框架均有很好的支持。目前,Volcano在人工智能、大数据、基因测序等海量数据计算和分析场景已得到快速应用,已完成对 Spark、Flink、Ray、 Tensorflow、PyTorch、Argo、MindSpore、Paddlepaddle 、Kubeflow、MPI、Horovod、Mxnet、KubeGene 等众多主流计算框架的支持,并构建起完善的上下游生态。更多信息,请访问:Volcano云原生批量计算社区:https://volcano.shVolcano GitHub: cid:link_2Volcano云原生批量计算公开课:cid:link_0华为云云容器引擎CCE:cid:link_1 添加云原生小助手k8s2222进入技术交流群
  • [技术干货] 华为云云容器引擎CCE调度概述:CPU资源调度、GPU/NPU异构资源调度及Volcano调度
    华为云云容器引擎CCE支持多种资源与任务调度策略,有助于提升应用性能和集群整体资源利用率。本文将重点介绍CPU资源调度、GPU/NPU异构资源调度以及Volcano调度的主要功能。  CPU调度  CCE提供CPU管理策略,可为应用分配完整的物理CPU核,从而提升性能并降低调度延迟。功能描述参考文档CPU管理策略当节点上运行大量CPU密集型Pod时,工作负载可能会在不同的CPU核之间迁移。对于CPU敏感型应用,可通过Kubernetes提供的CPU管理策略为其分配独占物理核,从而提升性能并降低调度延迟。CPU管理策略增强型CPU管理策略在传统的CPU管理策略基础上,该策略新增Burstable Pod(要求CPU的Request和Limit值都是正整数)的智能调度能力,允许这类Pod优先使用特定CPU,而非完全独占。增强型CPU管理策略  GPU调度  CCE为集群中的GPU异构资源提供调度能力,从而实现资源的精细化分配与高效利用,满足不同类型工作负载对GPU算力的差异化需求,提升整体集群的调度效率与业务运行性能。功能描述参考文档Kubernetes默认GPU调度该调度模式可以指定Pod申请的GPU显卡数量,支持申请设置为小于1的数量,实现多个Pod共享使用GPU。使用Kubernetes默认GPU调度GPU虚拟化GPU虚拟化能够动态对GPU设备显存与算力进行划分,单个GPU卡最多虚拟化成20个GPU虚拟设备。相对于静态分配来说,虚拟化的方案更加灵活,最大程度保证业务稳定的前提下,可以完全由用户自己定义使用的GPU量,提高GPU利用率。GPU虚拟化GPU监控GPU指标可分为CCE提供的GPU监控指标和DCGM提供的GPU监控指标。通过Prometheus和Grafana,可以实现这些GPU指标的全面监测,从而优化计算性能,快速定位故障,合理调度资源,进而提升GPU利用率并降低运维成本。GPU监控GPU弹性伸缩CCE支持通过GPU指标配置工作负载和节点弹性伸缩策略,从而实现资源的动态调度与优化,提高计算效率,保障业务稳定运行,并有效降低运维成本。GPU弹性伸缩GPU故障处理当GPU资源出现故障时,CCE集群会及时上报事件,并根据事件信息提供单GPU故障隔离功能,确保其他正常GPU继续提供服务,最大限度降低业务影响。GPU故障处理  NPU调度  CCE为集群中的NPU异构资源提供调度能力,从而实现对推理和图像识别等工作的高效处理。功能描述参考文档NPU芯级独占调度该调度模式可以根据Pod申请的NPU数量,为工作负载提供NPU资源。NPU芯级独占调度NPU拓扑感知调度该调度模式指结合昇腾AI处理器和节点间的拓扑结构灵活匹配调度策略,其能够有效减少计算资源碎片和网络拥塞,最大化提升NPU算力利用率。NPU拓扑感知调度NPU虚拟化NPU虚拟化指将通过资源虚拟化的方式将物理机中配置的NPU(昇腾AI产品)切分为多个虚拟NPU(vNPU),并挂载至容器中使用,以实现对硬件资源的灵活切分与动态管理。NPU虚拟化NPU监控当集群中包含NPU节点时,监控NPU指标可以帮助用户识别性能瓶颈、优化资源利用率、快速定位异常,从而提升系统的整体稳定性和效率。在CCE Standard和Turbo集群中,您可以使用npu-exporter组件将dcmi/hccn tool采集的NPU指标数据上传至云原生监控系统,实现NPU资源的实时监控与告警,从而提升系统的可靠性和性能。NPU监控  Volcano调度  Volcano是一个基于Kubernetes的批处理平台,提供了机器学习、深度学习、生物信息学、基因组学及其他大数据应用所需要而Kubernetes当前缺失的一系列特性,提供了高性能任务调度引擎、高性能异构芯片管理、高性能任务运行管理等通用计算能力。功能描述参考文档使用Volcano调度工作负载一般情况下,Kubernetes在调度工作负载时会使用自带的默认调度器,若需要使用Volcano调度器的能力,您可以为工作负载指定调度器。使用Volcano调度工作负载资源利用率优化调度针对计算资源进行优化的调度策略,可以有效减少各节点资源碎片,最大化地提高计算资源的利用率。资源利用率优化调度业务优先级保障调度根据业务的重要性和优先级,设置自定义的策略对业务占用的资源进行调度,确保关键业务的资源优先级得到保障。业务优先级保障调度AI任务性能增强调度根据AI任务的工作性质、资源的使用情况,设置对应的调度策略,可以增强集群业务的吞吐量,提高业务运行性能。AI任务性能增强调度任务队列调度通过队列资源管理机制,动态分配集群资源,确保高优先级任务优先执行,同时优化资源利用率和作业吞吐量。任务队列调度NUMA亲和性调度Volcano可解决调度程序NUMA拓扑感知的限制,实现以下目标:避免将Pod调度到NUMA拓扑不匹配的节点。将Pod调度到NUMA拓扑的最佳节点。NUMA亲和性调度应用扩缩容优先级策略通过应用扩缩容优先级策略,可以精确控制Pod在不同类型节点上的扩容与缩容顺序,从而实现资源管理的最优化。应用扩缩容优先级策略应用紧凑型缩容策略Volcano调度器会依据设定的紧凑型缩容策略,对由Deployment(也间接包括ReplicaSet)及其他指定工作负载类型管理的Pod进行评分。Pod所在节点的NPU占用率越低,其得分也越低。缩容时,控制器优先移除得分较低的Pod,若存在多个得分相同的Pod,则随机驱逐相应数量的Pod。这样有助于提高后续调度的成功率和整体NPU资源的使用效率。应用紧凑型缩容功能  云原生混部  云原生混部解决方案围绕Volcano和Kubernetes生态,帮助用户提升资源利用率,实现降本增效。功能描述参考文档动态资源超卖根据在线作业和离线作业类型,通过Volcano调度将集群中申请而未使用的资源(即申请量与使用量的差值)利用起来,实现资源超卖和混合部署,提升集群资源利用率。动态资源超卖基于Pod实例画像的资源超卖提供一种超卖算法,能够持续采集节点上Pod的CPU和内存利用率,统计资源使用的概率分布,并在一定置信度下评估节点资源占用。算法综合考虑资源使用的整体水平及波动,能够计算出稳定的超卖量,从而减少资源竞争,避免业务波动引起的Pod频繁驱逐。相比直接基于节点实时CPU和内存利用率的算法,该算法能有效减少超卖量波动,提升对突发资源尖峰的覆盖能力,从而在保障业务性能相对稳定的同时实现资源超卖。基于Pod实例画像的资源超卖CPU Burst弹性限流提供一种可以短暂突破CPU Limit值的弹性限流机制,以降低业务长尾响应时间,可以有效提升时延敏感型业务的服务质量。CPU Burst弹性限流出口网络带宽保障平衡在线业务与离线业务对出口网络带宽的使用,保证在线业务有足够的网络带宽。出口网络带宽保障 更多信息,请访问: 华为云云容器引擎CCE:cid:link_26Volcano云原生批量计算社区:https://volcano.shVolcano GitHub: cid:link_28Volcano云原生批量计算公开课:cid:link_25 添加云原生小助手k8s2222进入技术交流群  
  • [技术干货] Volcano社区网络拓扑感知调度解析:优化AI大模型训练性能
    📝摘要:Volcano云原生批量计算社区在业界率先提出网络拓扑感知调度(Network Topology Aware Scheduling)策略,通过统一的网络拓扑API和智能调度策略,解决大规模数据中心AI训练任务的网络通信性能问题,同时引入了基于节点标签(Label)的 超节点HyperNode 自动发现机制。该功能为用户提供了一种通用且灵活的方式来描述网络拓扑,将复杂的拓扑管理工作转变为简单的节点标签管理,确保在复杂工作负载管理中的实用性和易用性,为AI时代的基础设施提供关键调度支撑。Volcano (https://volcano.sh)是业界首个云原生批量计算引擎,也是 CNCF 首个和唯一的批量计算项目。作为云原生批量计算领域的事实标准,Volcano已经在AI、大数据及高性能计算 (HPC) 等多种场景中获得广泛应用,吸引了来自30多个国家的800多名贡献者,累计代码提交数万次。Volcano已在国内外60+企业进行了生产落地,赢得了用户的广泛赞誉,为业界提供了云原生批量计算的卓越实践标准与解决方案。本文解析Volcano社区的网络拓扑感知调度能力。早在2025年1月Volcano社区发布的v1.11版本中,社区聚焦AI与大数据的核心需求,推出网络拓扑感知调度、多集群AI作业调度等重磅特性,显著提升AI训练与推理任务的性能。同时,在离线混部与动态资源超卖及负载感知重调度功能进一步优化资源利用率,确保在线业务的高可用性。此外,弹性层级队列为大数据场景提供了更灵活的调度策略。    网络拓扑感知调度:优化AI大模型训练性能   在AI大模型训练场景中,模型并行(Model Parallelism)将模型分割到多个节点上,训练过程中这些节点需要频繁进行大量数据交互。此时,节点间的网络传输性能往往成为训练的瓶颈,显著影响训练效率。数据中心的网络类型多样,如InfiniBand (IB)、RoCE、NVSwitch等,且网络拓扑复杂,通常包含多层交换机。两个节点间跨的交换机越少,通信延迟越低,吞吐量越高。因此,用户希望将工作负载调度到具有最高吞吐量和最低延迟的最佳性能域,尽可能减少跨交换机的通信,以加速数据交换,提升训练效率。为此,Volcano提出了网络拓扑感知调度(Network Topology Aware Scheduling)策略,通过统一的网络拓扑API和智能调度策略,解决大规模数据中心AI训练任务的网络通信性能问题。▍统一的网络拓扑API:精准表达网络结构为了屏蔽数据中心网络类型的差异,Volcano定义了新的CRD HyperNode来表示网络拓扑,提供了标准化的API接口。与传统的通过节点标签(label)表示网络拓扑的方式相比,HyperNode具有以下优势:语义统一:HyperNode提供了标准化的网络拓扑描述方式,避免了标签方式的语义不一致问题。层级结构:HyperNode支持树状层级结构,能够更精确地表达实际的网络拓扑。易于管理:集群管理员可以手动创建HyperNode,或通过网络拓扑自动发现工具维护HyperNode。一个HyperNode表示一个网络拓扑性能域,通常映射到一个交换机。多个HyperNode通过层级连接,形成树状结构。例如,下图展示了由多个HyperNode构成的网络拓扑:叶子HyperNode(s0、s1、s2、s3):子节点为集群中的真实节点。非叶子HyperNode(s4、s5、s6):子节点为其他HyperNode。在这种结构中,节点间的通信效率取决于它们之间的HyperNode层级跨度。例如:node0和node1同属于s0,通信效率最高。node1和node2需要跨两层HyperNode(s0→s4→s1),通信效率较低。node0和node4需要跨三层HyperNode(s0→s4→s6),通信效率最差。💬 HyperNode配置示例以下是一个叶子HyperNode和非叶子HyperNode的配置示例:💬 叶子HyperNode示例:apiVersion: topology.volcano.sh/v1alpha1kind: HyperNodemetadata: name: s0spec: tier: 1 # HyperNode层级,层级越低通信效率越高 members: # 子节点列表 - type: Node # 子节点类型为Node selector: exactMatch: # 精确匹配 name: node-0 - type: Node selector: regexMatch: # 正则匹配 pattern: node-[01]💬 非叶子HyperNode示例:apiVersion: topology.volcano.sh/v1alpha1kind: HyperNodemetadata: name: s6spec: tier: 3 # HyperNode层级 members: # 子节点列表 - type: HyperNode # 子节点类型为HyperNode selector: exactMatch: # 精确匹配 name: s4 - type: HyperNode selector: exactMatch: name: s5▍ 基于网络拓扑的感知调度策略Volcano Job和PodGroup可以通过 networkTopology 字段设置作业的拓扑约束,支持以下配置:mode:支持 hard 和 soft 两种模式。hard:硬约束,作业内的任务必须部署在同一个HyperNode内。soft:软约束,尽可能将作业部署在同一个HyperNode下。highestTierAllowed:与 hard 模式配合使用,表示作业允许跨到哪层HyperNode部署。例如,以下配置表示作业只能部署在2层及以下的HyperNode内(如s4或s5),否则作业将处于Pending状态:spec:  networkTopology:    mode: hard    highestTierAllowed: 2通过这种调度策略,用户可以精确控制作业的网络拓扑约束,确保作业在满足条件的最佳性能域运行,从而显著提升训练效率。  网络拓扑感知调度 (Alpha Release) 在Volcano v1.12 中, 网络拓扑感知调度功能达到 Alpha 发布状态。此功能旨在优化大规模训练和推理场景(如模型并行训练、Leader-Worker 推理)中 AI 任务的部署。它通过将任务调度到同一网络拓扑性能域内,减少跨交换机通信,从而显著提升任务效率。Volcano 使用 超节点HyperNode CRD 来抽象和表示异构硬件网络拓扑,并支持层级结构以方便管理。v1.12 版本集成了以下关键特性:Volcano超节点 HyperNode 自动发现 (HyperNode Auto-Discovery): Volcano 提供了集群网络拓扑的自动发现能力。用户可配置发现类型,系统将自动创建和维护反映集群真实网络拓扑的层级 HyperNode。目前支持 InfiniBand (IB) 网络下通过 UFM (Unified Fabric Manager) 接口获取网络拓扑信息,并自动更新 HyperNode。未来计划支持 RoCE 等更多网络协议。 Volcano超节点 HyperNode 优选策略 (Prioritized HyperNode Selection): 引入了基于节点级别和 HyperNode 级别的打分策略,累加后作为 HyperNode 的最终得分。 节点级别 (Node-level): 建议配置 BinPack 插件以优先填满 HyperNode,减少资源碎片。 超节点HyperNode 级别 (HyperNode-level): 优先选择层级更低的 HyperNode 以获得更优性能,因其涉及的跨交换机次数较少;对于相同层级的 HyperNode,包含更多任务的 HyperNode 得分更高,旨在减少 HyperNode 级别的资源碎片。 支持通过 Label Selector 匹配节点 (Support for Label Selector Node Matching): HyperNode 叶子节点与集群中的物理节点关联,支持以下三种匹配策略: 精确匹配 (Exact Match): 直接匹配节点名称。 正则匹配 (Regex Match): 通过正则表达式匹配节点名称。 标签匹配 (Label Match): 通过标准 Label Selector 匹配节点。  Volcano v1.13 提供更灵活的网络拓扑发现机制  Volcano v1.13 提供更灵活的网络拓扑发现机制,并增强对主流AI计算框架的兼容性。继v1.12 版本中正式推出了网络拓扑感知调度能力,并率先实现了基于 InfiniBand (IB) 网络的 UFM 自动发现机制后,v1.13版本引入了基于节点标签(Label)的 超节点HyperNode 自动发现机制。该功能为用户提供了一种通用且灵活的方式来描述网络拓扑,将复杂的拓扑管理工作转变为简单的节点标签管理。该机制允许用户在 volcano-controller-configmap 中定义拓扑层级与节点标签的对应关系。Volcano 控制器会周期性地扫描集群中的所有节点,并根据其标签自动完成以下工作:自动构建拓扑:根据节点上的一组标签,从上至下(例如:机架 -> 交换机 -> 节点)自动构建出多层 HyperNode 拓扑结构。动态维护:当节点的标签发生变化,或节点被添加、移除时,控制器会自动更新 HyperNode 的成员和结构,确保拓扑信息始终与集群状态保持一致。支持多种拓扑类型:允许用户同时定义多种独立的网络拓扑,以适应不同的硬件集群(如 GPU 集群、NPU 集群等)或不同的网络分区。💬 配置示例:# volcano-controller-configmap.yamlapiVersion: v1kind: ConfigMapmetadata: name: volcano-controller-configmap namespace: volcano-systemdata: volcano-controller.conf: | networkTopologyDiscovery: - source: label enabled: true interval: 10m # 发现周期 config: networkTopologyTypes: # 定义一个名为 topology-A 的拓扑类型 topology-A: # 定义拓扑层级,顺序从上到下 - nodeLabel: "volcano.sh/hypercluster"# 顶层 HyperNode - nodeLabel: "volcano.sh/hypernode" # 中间层 HyperNode - nodeLabel: "kubernetes.io/hostname"# 底层物理节点 通过在 Volcano 控制器的 ConfigMap 中添加 label 源即可启用此功能。以下配置定义了一个名为 topology-A 的三层拓扑结构:顶层 (Tier 2) :由 volcano.sh/hypercluster 标签定义。中间层 (Tier 1) :由 volcano.sh/hypernode 标签定义。底层 :物理节点,由 Kubernetes 内置的 kubernetes.io/hostname 标签标识。当一个节点被打上如下标签时,它将被自动识别并归入 cluster-s4 -> node-group-s0 的拓扑路径下:# 节点 node-0 的标签labels: kubernetes.io/hostname: node-0 volcano.sh/hypernode: node-group-s0 volcano.sh/hypercluster: cluster-s4基于label的网络拓扑自动发现功能具有出色的通用性与灵活性,不依赖于特定的网络硬件(如 IB),因此适用于各类异构集群,并允许用户通过标签灵活定义任意深度的层级结构。它将复杂的拓扑维护工作转变为简单的节点标签管理,实现了自动化,从而显著降低运维成本和出错风险。此外,该机制能够动态适应集群节点和标签的变化,无需人工干预即可实时保持拓扑信息的准确性。📌 使用文档请参考:HyperNode Auto Discovery:cid:link_0相关PR:cid:link_1▍将网络拓扑感知调度能力扩展至 Kubernetes 标准工作负载在Volcano v1.13 版本中,Volcano 的网络拓扑感知调度能力不再局限于 Volcano Job。现在,也可以为 Kubernetes 的标准工作负载(如 Deployment、StatefulSet 等)配置网络拓扑约束。该功能通过 Pod 模板中的注解(Annotation)实现。当为 Deployment 或 StatefulSet 的 Pod 模板添加网络拓扑相关的注解后,Volcano 的 podgroup-controller 会自动为这些 Pod 创建一个PodGroup,并将注解中定义的网络拓扑约束继承到 PodGroup 的规约(Spec)中,从而在调度时应用相应的网络亲和性策略。可以通过以下两个注解来配置网络拓扑感知调度:Annotation Key描述示例值topology.volcano.sh/network-topology-mode定义网络拓扑约束的模式。hard 表示强制约束,Pod 必须满足拓扑要求才能被调度;soft 表示软约束,调度器会尽量满足,但不强制。默认为 hard。"hard"topology.volcano.sh/network-topology-highest-tier指定允许调度的最高网络层级。例如,设置为 "2" 表示 Pod 可以被调度到 2层及以下的HyperNode上,但不能调度到更高层级的HyperNode。"2"💬 Deployment 配置示例以下示例展示了如何为一个 Deployment 配置网络拓扑感知调度。调度器将把该 Deployment 的 Pod 调度到网络层级不超过 2 的节点上:apiVersion: apps/v1kind: Deploymentmetadata: name: network-aware-deploymentspec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app annotations: # 设置网络拓扑为硬约束 topology.volcano.sh/network-topology-mode: "hard" # 设置允许调度的最高网络层级为 2 topology.volcano.sh/network-topology-highest-tier: "2" spec: # 必须指定调度器为 volcano schedulerName: volcano containers: - name: main-container image: nginx:latest resources: requests: cpu: "1" memory: "1Gi" limits: cpu: "1" memory: "1Gi"Volcano社区网络拓扑感知调度能力大大提升了Volcano在复杂工作负载管理中的实用性和易用性,为AI时代的基础设施提供关键调度支撑。更多Volcano社区网络拓扑感知调度能力,可以访问🔗社区地址:cid:link_2  更多云原生技术动向关注容器魔方 
  • [互动交流] CCE Autopilot 是否提供对新兴技术或者趋势的支持和集成?
    CCE Autopilot 是否提供对新兴技术或者趋势的支持和集成?
  • [互动交流] 使用CCE Autopilot进行容器管理时,又哪些安全特性?
    使用CCE Autopilot进行容器管理时,又哪些安全特性?
  • [互动交流] CCE Autopilot 如何与云原生生态进行集成?
    CCE Autopilot 如何与云原生生态进行集成?
  • CCE集群界面的某个节点磁盘监控高达80%以上,而进入云监控界面看到的磁盘使用 率在40%不到
    CCE集群界面的某个节点磁盘监控高达80%以上,而进入云监控界面看到的磁盘使用率在40%不到