DPF零信任(DPF-ZT)与virtio-fs模式下SNAP DPU服务的技术预览

本技术预览(TP)指南提供了在裸金属高性能基础设施上以零信任模式部署NVIDIA DOCA平台框架(DPF)的全面说明。重点是在NVIDIA® BlueField®-3 DPU上以virtio-fs模式部署NVIDIA DOCA SNAP服务,以提供安全、隔离且硬件加速的环境。

文档目录

范围

本技术预览(TP)指南提供了在裸金属高性能基础设施上以零信任模式部署NVIDIA DOCA平台框架(DPF)的全面说明。本指南重点介绍在NVIDIA® BlueField®-3 DPU上以virtio-fs模式部署NVIDIA DOCA SNAP服务,以提供安全、隔离且硬件加速的环境。

本指南面向经验丰富的系统管理员、系统工程师和解决方案架构师,旨在构建由NFS存储支持的高度安全的裸金属环境。我们将充分利用NVIDIA DPU的硬件加速和卸载能力,最大化数据中心工作负载的效率和性能。

警告

  • 顾名思义,此参考实现是一个特定且固执的部署示例,旨在解决上述用例。
  • 虽然可能存在其他方法来实现类似解决方案,但本文档提供了此特定方法的详细指南。

缩写和首字母缩略词

术语 定义 术语 定义
BFB BlueField启动流 NFS 网络文件系统
BGP 边界网关协议 PVC 持久卷声明
CNI 容器网络接口 RDG 参考部署指南
CRD 自定义资源定义 RDMA 远程直接内存访问
CSI 容器存储接口 SF 可扩展功能
DOCA 数据中心基础设施片上架构 SFC 服务功能链
DOCA SNAP NVIDIA® DOCA™ 存储定义网络加速处理 SR-IOV 单根输入/输出虚拟化
DPF DOCA平台框架 TOR 架顶式
DPU 数据处理单元 VF 虚拟功能
HBN 基于主机的网络 VLAN 虚拟局域网
IPAM IP地址管理 VRR 虚拟路由器冗余
K8S Kubernetes VTEP 虚拟隧道端点
MAAS 金属即服务 VXLAN 虚拟可扩展局域网

引言

NVIDIA BlueField-3数据处理单元是一个强大的基础设施计算平台,专为高速处理软件定义的网络、存储和网络安全而设计。BlueField-3具有400 Gb/s的容量,结合了强大的计算能力、高速网络和广泛的可编程性,为要求苛刻的工作负载提供硬件加速的软件定义解决方案

部署和管理DPU及其相关的DOCA服务,尤其是在大规模环境中,可能相当具有挑战性。如果没有适当的配置和编排系统,处理DPU生命周期和配置DOCA服务会给系统管理员带来沉重的运营负担。NVIDIA DOCA平台基础架构通过简化和自动化DOCA服务的生命周期管理来解决这一挑战。

NVIDIA DOCA释放了BlueField平台的全部潜力,支持快速开发卸载、加速和隔离数据中心工作负载的应用程序和服务。其中一个例子是NVIDIA DOCA SNAP,这是一种DPU存储服务,旨在通过利用NVIDIA BlueField DPU的能力来加速和优化存储协议NVIDIA DOCA SNAP技术包含一系列服务,可在NVIDIA BlueField产品上实现本地存储的硬件加速虚拟化。DOCA SNAP服务将基于NFS的网络存储作为本地卷呈现给主机,由DPU上的DOCA SNAP服务模拟。其核心是,DOCA SNAP允许应用程序直接与原始远程文件系统卷交互,从而绕过传统文件系统开销,实现高性能、低延迟的存储访问。作为DPF部署模型的一部分,DOCA SNAP解决方案由多个功能组件组成,这些组件打包为容器,部署在x86 Kubernetes管理和DPU Kubernetes集群上。

此参考实现利用开源组件,并提供部署过程的端到端演练,包括:

  • 使用MAAS进行基础设施配置
  • NVIDIA的DPF进行集成
  • 在Kubernetes集群内部署和编排基于DPU的服务
  • 配置启用了NFS(virtio-fs)模拟的BlueField设备,用于DOCA SNAP服务
  • 使用Kubernetes原生结构管理DPU资源和工作负载

本指南提供了一个全面的实际示例,展示了如何在“裸金属”基础设施上安装带有NVIDIA DOCA SNAP服务DPF系统

Kubernetes集群,详见存储开发指南。

注意:本指南以NFS服务器作为存储后端服务示例,仅用于演示目的,不适用于生产环境。

参考文献

解决方案架构

关键组件与技术

  • NVIDIA BlueField® DPU:NVIDIA BlueField数据处理器(DPU)为现代数据中心和超级计算集群带来前所未有的创新,凭借强大的计算能力和集成的软件定义硬件加速器,为任何环境中的任何工作负载创建安全加速的基础设施。

  • NVIDIA DOCA软件框架:NVIDIA DOCA释放NVIDIA BlueField网络平台的潜力,通过利用BlueField DPU和SuperNIC,实现快速创建卸载、加速和隔离数据中心工作负载的应用和服务,支持零信任保护。

  • NVIDIA ConnectX SmartNICs:10/25/40/50/100/200和400G以太网网卡,提供高级硬件卸载和加速。

  • NVIDIA LinkX线缆:提供10至400GbE以太网和InfiniBand产品,适用于云、HPC、超大规模、企业、电信、存储和AI数据中心。

  • NVIDIA Spectrum以太网交换机:灵活的外形,支持1GbE至400GbE速度,基于突破性硅技术,适用于高性能云数据中心网络、以太网存储结构和深度学习互连。

  • NVIDIA Cumulus Linux:业界最具创新性的开放网络操作系统,支持自动化、定制化和扩展。

  • Kubernetes:开源容器编排平台,用于自动化部署、扩展和管理容器化应用。

  • Kubespray:由Ansible playbooks、清单、配置工具和领域知识组成,用于通用OS/Kubernetes集群配置管理,提供高可用集群、可组合属性和对主流Linux发行版的支持。

  • RDMA:远程直接内存访问技术,允许网络中的计算机在不涉及处理器、缓存或操作系统的情况下交换数据,提高吞吐量和性能。

解决方案设计

解决方案逻辑设计

逻辑设计包含以下组件:

  • 1个Hypervisor节点(基于KVM),配备ConnectX-7
    • 1个防火墙VM
    • 1个Jump VM
    • 1个MAAS VM
    • 3个VM,运行所有K8s管理组件(用于Host/DPU集群)
  • 2个工作节点,每个配备1个BlueField-3网卡
  • 存储目标节点,配备ConnectX-7和NFS服务器应用
  • 单个200GbE高速(HS)交换机
  • 1GbE主机管理网络

image-2025-9-29_11-32-8.png

SFC逻辑图

DOCA平台框架通过K8s API简化DPU管理,处理DPU的配置和生命周期管理,编排专用DPU服务,并自动化**服务功能链(SFC)**任务,确保NVIDIA DOCA服务的无缝部署,实现HBN数据平面上的高效卸载和流量路由。本指南实现的SFC逻辑图如下。

image-2025-9-29_11-56-51.png

卷仿真逻辑图

卷仿真逻辑图

下图展示了卷挂载到租户主机过程中的主要组件。

收到新的仿真VIRTIO-FS卷请求后,DOCA SNAP组件通过SNAP NFS客户端将NFS卷引入所需的DPU K8s工作节点。然后DPU将其仿真为VIRTIO-FS卷,挂载(手动操作)到同一x86主机上。

image-2025-9-29_12-1-27.png

防火墙设计

此解决方案中的pfSense防火墙具有双重用途:

  • 防火墙 – 为DPF系统提供隔离环境,确保安全操作
  • 路由器 – 实现互联网访问以及主机管理网络与高速网络之间的连接

防火墙配置了SSH和RDP的端口转发规则,将流量路由到跳转节点在主机管理网络中的IP地址。管理员可通过跳转节点管理并访问设置中的各种设备,以及处理Kubernetes(K8s)集群和DPF组件的部署。

下图展示了此解决方案中使用的防火墙设计:

image-2025-5-6_11-12-39-1.png

软件栈组件

image-2025-9-9_9-17-48-1.png

注意: 请确保使用上述完全相同的版本作为软件栈。

物料清单

image-2025-10-20_11-0-32-1.png

部署与配置

节点与交换机定义

以下是部署所演示网络所用的定义和参数:

交换机端口使用
mgmt-switch 1 swp1-6
hs-switch 1 swp1,11-14,32
机架 服务器类型 服务器名称 交换机端口 IP和网卡 默认网关
Rack1 虚拟机管理节点 hypervisor mgmt-switch: swp1hs-switch: swp1 lab-br (接口 eno1): 可信LAN IPmgmt-br (接口 eno2): -hs-br (接口 ens2f0np0): 可信LAN GW
Rack1 存储目标节点 target mgmt-switch: swp4hs-switch: swp32 enp1s0f0: 10.0.110.25/24enp144s0f0np0: 10.0.124.1/24 10.0.110.254
Rack1 工作节点 worker1 mgmt-switch: swp2hs-switch: swp11-swp12mgmt-switch: swp5 ens15f0: 10.0.110.21/24ens5f0np0/ens5f1np1: 10.0.120.0/22dpubmc: 10.0.110.201/24dpuoob: 10.0.110.89/24 10.0.110.254
Rack1 工作节点 worker2 mgmt-switch: swp3hs-switch: swp13-swp14mgmt-switch: swp6 ens15f0: 10.0.110.22/24ens5f0np0/ens5f1np1: 10.0.120.0/22dpubmc: 10.0.110.202/24dpuoob: 10.0.110.80/24 10.0.110.254
Rack1 防火墙(虚拟) fw - WAN (lab-br): 可信LAN IPLAN (mgmt-br): 10.0.110.254/24OPT1

布线

虚拟机管理程序节点

image-2025-6-8_15-6-14-1.png

裸金属工作节点

image-2025-9-29_10-18-58-1.png

存储目标节点

image-2025-6-8_15-5-42-1.png

网络结构配置

更新Cumulus Linux

最佳实践是使用最新发布的Cumulus Linux NOS版本。

有关如何升级Cumulus Linux的信息,请参阅Cumulus Linux用户指南

配置Cumulus Linux交换机

SN3700交换机(hs-switch)配置如下:

以下命令在hs-switch上配置BGP无编号。 Cumulus Linux默认启用BGP等价多路径(ECMP)选项。

nv set bridge domain br_default vlan 10 vni 10
nv set evpn enable on
nv set interface lo ip address 11.0.0.101/32
nv set interface lo type loopback
nv set interface swp1 ip address 172.169.50.2/30
nv set interface swp1 link speed auto
nv set interface swp1-32 type swp
nv set interface swp32 bridge domain br_default access 10
nv set nve vxlan enable on
nv set nve vxlan source address 11.0.0.101
nv set qos roce enable on
nv set qos roce mode lossless
nv set router bgp autonomous-system 65001
nv set router bgp enable on
nv set router bgp graceful-restart mode full
nv set router bgp router-id 11.0.0.101
nv set system hostname hs-switch
nv set vrf default router bgp address-family ipv4-unicast enable on
nv set vrf default router bgp address-family ipv4-unicast redistribute connected enable on
nv set vrf default router bgp address-family ipv4-unicast redistribute static enable on
nv set vrf default router bgp address-family ipv6-unicast enable on
nv set vrf default router bgp address-family ipv6-unicast redistribute connected enable on
nv set vrf default router bgp address-family l2vpn-evpn enable on
nv set vrf default router bgp enable on
nv set vrf default router bgp neighbor swp11 peer-group hbn
nv set vrf default router bgp neighbor swp11 type unnumbered
nv set vrf default router bgp neighbor swp12 peer-group hbn
nv set vrf default router bgp neighbor swp12 type unnumbered
nv set vrf default router bgp neighbor swp13 peer-group hbn
nv set vrf default router bgp neighbor swp13 type unnumbered
nv set vrf default router bgp neighbor swp14 peer-group hbn
nv set vrf default router bgp neighbor swp14 type unnumbered
nv set vrf default router bgp path-selection multipath aspath-ignore on
nv set vrf default router bgp peer-group hbn address-family l2vpn-evpn enable on
nv set vrf default router bgp peer-group hbn remote-as external
nv set vrf default router static 0.0.0.0/0 address-family ipv4-unicast
nv set vrf default router static 0.0.0.0/0 via 172.169.50.1 type ipv4-address
nv set vrf default router static 10.0.110.0/24 address-family ipv4-unicast
nv set vrf default router static 10.0.110.0/24 via 172.169.50.1 type ipv4-address

nv config apply -y

SN2201交换机(mgmt-switch)配置如下:

nv set bridge domain br_default untagged 1
nv set interface swp1-4 link state up
nv set interface swp1-4 type swp
nv set interface swp1-4 bridge domain br_default
nv config apply -y

安装与配置

确保工作节点服务器的BIOS设置已启用SR-IOV,并且服务器已调整为最大性能。 所有工作节点必须具有相同的BlueField-3网卡PCIe位置,并且必须显示相同的接口名称。 确保拥有DPU BMC和OOB MAC地址。

使用此参考部署指南(RDG)进行:

  • 主机配置
  • K8s集群部署与配置
  • DPF安装

DPU服务安装

前提条件

在开始部署之前,需要进行一些调整。

  1. 每个K8s控制平面节点上添加到目标节点的额外路由:
network:
  version: 2
  ethernets:
    enp1s0:
      match:
        macaddress: "52:54:00:cf:1d:38"
      addresses:
      - "10.0.110.1/24"
      nameservers:
        addresses:
        - 10.0.110.252
        search:
        - dpf.rdg.local.domain
      set-name: "enp1s0"
      mtu: 1500
      routes:
  • to: default via: 10.0.110.254 metric: 50 - to: 10.0.124.1 via: 10.0.110.25

应用新配置,运行命令:

netplan apply

  1. 构建并推送 nfs-csi-controller Helm chart

    从DPF仓库根目录(~/doca-platform)运行以下命令。

    export HELM_REGISTRY=<your-registry> 例如:export HELM_REGISTRY="oci://cr.example.com"
    export TAG="v0.1.0"
    make helm-package-nfs-csi-controller
    make helm-push-nfs-csi-controller
    

    之后,你的Helm仓库将在 dpuservicetemplate_nfs-csi-controller.yamldpuservicetemplate_nfs-csi-controller-dpu.yaml 中被引用。

    安装GO

    构建机器上应安装GO语言。 在Ubuntu 24.04上安装Go(Golang)有两种主要方法:使用 apt包管理器 或使用 snap

    • 使用 apt 安装Go(来自Ubuntu仓库):

      sudo apt install golang-go -y

    • 使用snap安装Go(可能获得更新版本):

      sudo snap install go --classic

      --classic 参数授予snap包经典限制,允许其更广泛地访问系统。

    • 验证安装:

      go version

  2. 下载 snap-virtiofs.zip 文件,其中包含本指南所需的YAML部署文件,然后解压。

    跳板节点控制台

    $ cd ~
    $ unzip snap-virtiofs.zip
    $ cd snap-virtiofs
    
    $ ls -R manifests
    manifests:
    00-env-vars
    00-high-speed-switch-configuration
    04-dpudeployment-installation
    
    manifests/00-env-vars:
    envvars.env
    
    manifests/00-high-speed-switch-configuration:
    switch-hs.conf
    
    manifests/04-dpudeployment-installation:
    bfb.yaml                                             dpuserviceconfiguration_snap-node-driver.yaml        dpuservicetemplate_snap-node-driver.yaml
    dpudeployment.yaml                                   dpuservicecredentialrequest_nfs-csi-controller.yaml  dpustoragepolicy_policy-fs.yaml
    dpuflavor.yaml                                       dpuservicecredentialrequest_snap-controller.yaml     dpustoragevendor_nfs-csi.yaml
    dpuserviceconfiguration_doca-snap.yaml               dpuservicetemplate_doca-snap.yaml                    hbn-dpuserviceconfig.yaml
    dpuserviceconfiguration_fs-storage-dpu-plugin.yaml   dpuservicetemplate_fs-storage-dpu-plugin.yaml        hbn-dpuservicetemplate.yaml
    dpuserviceconfiguration_nfs-csi-controller-dpu.yaml  dpuservicetemplate_nfs-csi-controller-dpu.yaml       hbn-ipam.yaml
    dpuserviceconfiguration_nfs-csi-controller.yaml      dpuservicetemplate_nfs-csi-controller.yaml           hbn-loopback-ipam.yaml
    dpuserviceconfiguration_snap-configuration.yaml      dpuservicetemplate_snap-configuration.yaml           physical-ifaces.yaml
    dpuserviceconfiguration_snap-controller.yaml         dpuservicetemplate_snap-controller.yaml              storage-ipam.yaml
    dpuserviceconfiguration_snap-host-controller.yaml    dpuservicetemplate_snap-host-controller.yaml
    
  3. 修改 manifests/00-env-vars/envvars.env 中的变量以适配你的环境,然后加载该文件:

    将以下文件中的变量值替换为适合你设置的值。特别注意 DPUCLUSTER_INTERFACEBMC_ROOT_PASSWORD

    运行此命令前,需要设置多个环境变量

    $ source manifests/00-env-vars/envvars.env

修改DPUDeployment、DPUServiceConfig、DPUServiceTemplate及其他必要对象。

  1. 在部署 manifests/04-dpudeployment-installation 目录下的对象之前,需要进行一些调整。

    1. 检查 dpudeployment.yaml,确保引用了适合SNAP的 DPUFlavor

      ---
      apiVersion: svc.dpu.nvidia.com/v1alpha1
      kind: DPUDeployment
      metadata:
        name: hbn-storage
        namespace: dpf-operator-system
      spec:
        dpus:
          bfb: bf-bundle
          flavor: dpf-provisioning-hbn-storage
          nodeEffect:
            noEffect: true
          dpuSets:
          - nameSuffix: "dpuset1"
            nodeSelector:
              matchLabels:
                feature.node.kubernetes.io/dpu-enabled: "true"
        services:
          doca-hbn:
            serviceTemplate: doca-hbn
            serviceConfiguration: doca-hbn
          snap-host-controller:
            serviceTemplate: snap-host-controller
            serviceConfiguration: snap-host-controller
          snap-controller:
            serviceTemplate: snap-controller
            serviceConfiguration: snap-controller
          snap-node-driver:
            serviceTemplate: snap-node-driver
            serviceConfiguration: snap-node-driver
          snap-configuration:
            serviceTemplate: snap-configuration
            serviceConfiguration: snap-configuration
          doca-snap:
            serviceTemplate: doca-snap
            serviceConfiguration: doca-snap
          fs-storage-dpu-plugin:
            serviceTemplate: fs-storage-dpu-plugin
            serviceConfiguration: fs-storage-dpu-plugin
          nfs-csi-controller:
            serviceTemplate: nfs-csi-controller
            serviceConfiguration: nfs-csi-controller
          nfs-csi-controller-dpu:
            serviceTemplate: nfs-csi-controller-dpu
            serviceConfiguration: nfs-csi-controller-dpu
        serviceChains:
          switches:
            - ports:
              - serviceInterface:
                  matchLabels:
                    uplink: p0
              - service:
                  name: doca-hbn
                  interface: p0_if
            - ports:
              - serviceInterface:
                  matchLabels:
                    uplink: p1
              - service:
                  name: doca-hbn
                  interface: p1_if
            - ports:
              - serviceInterface:
                  matchLabels:
                    interface: hostpf0
              - service:
                  interface: pf0hpf_if
                  name: doca-hbn
            - ports:
              - service:
                  name: doca-snap
                  interface: app_sf
                  ipam:
                    matchLabels:
                      svc.dpu.nvidia.com/pool: storage-pool
              - service:
                  name: fs-storage-dpu-plugin
                  interface: app_sf
                  ipam:
                    matchLabels:
                      svc.dpu.nvidia.com/pool: storage-pool
              - service:
                  name: doca-hbn
                  interface: snap_if
      
    2. 设置 storage-poolipv4Subnet 设置(注意:GW IP应分配给存储目标节点安装中的DATA接口)。

      以下是IPAM配置文件:

      • hbn-ipam.yaml
      • hbn-loopback-ipam.yaml
      • storage-ipam.yaml
      ---
      apiVersion: svc.dpu.nvidia.com/v1alpha1
      kind: DPUServiceIPAM
      metadata:
        name: pool1
        namespace: dpf-operator-system
      spec:
        ipv4Network:
          network: "10.0.120.0/22"
          gatewayIndex: 1
          prefixSize: 29
      
      ---
      apiVersion: svc.dpu.nvidia.com/v1alpha1
      kind: DPUServiceIPAM
      metadata:
        name: loopback
        namespace: dpf-operator-system
      spec:
        ipv4Network:
          network: "11.0.0.0/24"
          prefixSize: 32
      ---
      apiVersion: svc.dpu.nvidia.com/v1alpha1
      kind: DPUServiceIPAM
      metadata:
        name: storage-pool
        namespace: dpf-operator-system
      spec:
        metadata:
          labels:
            svc.dpu.nvidia.com/pool: storage-pool
        ipv4Subnet:
          subnet: "10.0.124.0/24"
          gateway: "10.0.124.1"
          perNodeIPCount: 8
      
    3. 根据你的环境在 dpuserviceconfiguration_nfs-csi-controller-dpu.yaml 中设置 storageClasses。目标服务器节点上应存在适当的 NFS共享文件夹。你可以配置多个storageClasses:

      ---
      apiVersion: svc.dpu.nvidia.com/v1alpha1
      kind: DPUServiceConfiguration
      metadata:
        name: nfs-csi-controller-dpu
        namespace: dpf-operator-system
      spec:
        deploymentServiceName: nfs-csi-controller-dpu
        serviceConfiguration:
          helmChart:
            values:
              dpu:
                enabled: true
                storageClasses:
                  # 要为nfs-csi创建的存储类列表
                  # 这些StorageClass名称应在StorageVendor设置中使用
                  - name: nfs-csi
                    parameters:
                      server: 10.0.124.1
      

share: /srv/nfs/share

  • name: nfs-csi-nvme parameters: server: 10.0.124.1 share: /srv/nfs/nvmeshare rbacRoles: nfsCsiController: serviceAccount: nfs-csi-controller-sa

manifest/04-dpudeployment-installation/ 文件夹中的其余配置文件保持不变,包括:

  • BFB 配置 YAML:bfb.yaml
  • DPUFlavor 配置 YAML:dpuflavor.yaml
  • DOCA-SNAP DPUService 部署和配置 YAML:dpuserviceconfig_doca-snap.yamldpuservicetemplate_doca-snap.yaml
  • HBN DPUService 部署和配置 YAML:hbn-dpuserviceconfig.yamlhbn-dpuservicetemplate.yaml
  • SNAP 配置 DPUService 部署和配置 YAML:dpuserviceconfig_snap-configuration.yamldpuservicetemplate_snap-configuration.yaml
  • SNAP 控制器 DPUService 部署和配置 YAML:dpuserviceconfig_snap-controller.yamldpuservicetemplate_snap-controller.yaml
  • SNAP 主机控制器 DPUService 部署和配置 YAML:dpuserviceconfiguration_snap-host-controller.yamldpuservicetemplate_snap-host-controller.yaml
  • SNAP 节点驱动 DPUService 部署和配置 YAML:dpuserviceconfig_snap-node-driver.yamldpuservicetemplate_snap-node-driver.yaml
  • NFS CSI 控制器 DPUService 部署和配置 YAML:dpuserviceconfiguration_nfs-csi-controller.yamldpuservicetemplate_nfs-csi-controller.yaml需要更新仓库
  • NFS CSI DPU 控制器 DPUService 部署和配置 YAML:dpuserviceconfiguration_nfs-csi-controller-dpu.yamldpuservicetemplate_nfs-csi-controller-dpu.yaml需要更新仓库
  • 存储供应商 DPU 插件 DPUService 部署和配置 YAML:dpuserviceconfiguration_fs-storage-dpu-plugin.yamldpuservicetemplate_fs-storage-dpu-plugin.yaml
  • DPUServiceIPAM 部署和配置 YAML:hbn-loopback-ipam.yamlstorage-ipam.yamlhbn-ipam.yaml
  • DPUServiceInterfaces 用于 DPU 物理端口:physical-ifaces.yaml
  • SNAP DPUServiceCredentialRequest 用于跨集群通信:dpuservicecredentialrequest_nfs-csi-controller.yamldpuservicecredentialrequest_snap-controller.yaml
  • StoragePolicy 部署和配置 YAML:dpustoragepolicy_policy-fs.yaml
  • StorageVendor 部署和配置 YAML:dpustoragevendor_nfs-csi.yaml

应用上述所有 YAML 文件:

$ cd manifest/04-dpudeployment-installation
$ cat *.yaml | envsubst | kubectl apply -f -
bfb.provisioning.dpu.nvidia.com/bf-bundle created
dpudeployment.svc.dpu.nvidia.com/hbn-storage created
dpuflavor.provisioning.dpu.nvidia.com/dpf-provisioning-hbn-storage created
dpuserviceconfiguration.svc.dpu.nvidia.com/doca-snap created
dpuserviceconfiguration.svc.dpu.nvidia.com/fs-storage-dpu-plugin created
dpuserviceconfiguration.svc.dpu.nvidia.com/nfs-csi-controller-dpu created
dpuserviceconfiguration.svc.dpu.nvidia.com/nfs-csi-controller created
dpuserviceconfiguration.svc.dpu.nvidia.com/snap-configuration created
dpuserviceconfiguration.svc.dpu.nvidia.com/snap-controller created
dpuserviceconfiguration.svc.dpu.nvidia.com/snap-host-controller created
dpuserviceconfiguration.svc.dpu.nvidia.com/snap-node-driver created
dpuservicecredentialrequest.svc.dpu.nvidia.com/nfs-csi-controller-credentials created
dpuservicecredentialrequest.svc.dpu.nvidia.com/snap-controller-credentials created
dpuservicetemplate.svc.dpu.nvidia.com/doca-snap created
dpuservicetemplate.svc.dpu.nvidia.com/fs-storage-dpu-plugin created
dpuservicetemplate.svc.dpu.nvidia.com/nfs-csi-controller-dpu created
dpuservicetemplate.svc.dpu.nvidia.com/nfs-csi-controller created
dpuservicetemplate.svc.dpu.nvidia.com/snap-configuration created
dpuservicetemplate.svc.dpu.nvidia.com/snap-controller created
dpuservicetemplate.svc.dpu.nvidia.com/snap-host-controller created
dpuservicetemplate.svc.dpu.nvidia.com/snap-node-driver created
dpustoragepolicy.storage.dpu.nvidia.com/policy-fs created
dpustoragepolicy.storage.dpu.nvidia.com/policy-fs-nvme created
dpustoragevendor.storage.dpu.nvidia.com/nfs-csi created
dpustoragevendor.storage.dpu.nvidia.com/nfs-csi-nvme created
dpuserviceconfiguration.svc.dpu.nvidia.com/doca-hbn created
dpuservicetemplate.svc.dpu.nvidia.com/doca-hbn created
dpuserviceipam.svc.dpu.nvidia.com/pool1 created
dpuserviceipam.svc.dpu.nvidia.com/loopback created
dpuserviceinterface.svc.dpu.nvidia.com/p0 created
dpuserviceinterface.svc.dpu.nvidia.com/p1 created
dpuserviceinterface.svc.dpu.nvidia.com/hostpf0 created
dpuserviceipam.svc.dpu.nvidia.com/storage-pool created

要跟踪 DPU 配置的进度,请运行以下命令检查其当前阶段:

跳转节点控制台

$ watch -n10 "kubectl describe dpu -n dpf-operator-system | grep 'Node Name\|Type\|Last\|Phase'"
Every 10.0s: kubectl describe dpu -n dpf-operator-system | grep 'Node Name\|Type\|Last\|Phase'
  Dpu Node Name:                                                     dpu-node-mt2334xz09f0
    Last Transition Time:  2025-09-28T11:43:57Z
    Type:                  Initialized
    Last Transition Time:  2025-09-28T11:43:57Z
    Type:                  BFBReady
    Last Transition Time:  2025-09-28T11:43:57Z
    Type:                  NodeEffectReady
    Last Transition Time:  2025-09-28T11:43:59Z
    Type:                  InterfaceInitialized
    Last Transition Time:  2025-09-28T11:44:00Z
    Type:                  FWConfigured
    Last Transition Time:  2025-09-28T11:44:00Z
    Type:                  BFBPrepared
    Last Transition Time:  2025-09-28T11:56:32Z
    Type:                  OSInstalled
    Last Transition Time:  2025-09-28T11:59:32Z
    Type:                  Rebooted
  Phase:  Rebooting
  Dpu Node Name:                                                     dpu-node-mt2334xz09f1
    Last Transition Time:  2025-09-28T11:43:57Z
    Type:                  Initialized
    Last Transition Time:  2025-09-28T11:43:57Z
    Type:                  BFBReady
    Last Transition Time:  2025-09-28T11:43:57Z
    Type:                  NodeEffectReady
    Last Transition Time:  2025-09-28T11:43:58Z
    Type:                  InterfaceInitialized
    Last Transition Time:  2025-09-28T11:44:00Z
    Type:                  FWConfigured
    Last Transition Time:  2025-09-28T11:44:00Z
    Type:                  BFBPrepared
    Last Transition Time:  2025-09-28T11:56:46Z
    Type:                  OSInstalled
    Last Transition Time:  2025-09-28T11:59:49Z
    Type:                  Rebooted
  Phase:  Rebooting

等待 Rebooted 阶段,然后手动对裸金属主机执行 Power Cycle。 DPU 启动后,为每个 DPU 工作节点运行以下命令:

跳转节点控制台

kubectl annotate dpunodes dpu-node-mt2334xz09f0 -n dpf-operator-system  provisioning.dpu.nvidia.com/dpunode-external-reboot-required-
kubectl annotate dpunodes dpu-node-mt2334xz09f1 -n dpf-operator-system  provisioning.dpu.nvidia.com/dpunode-external-reboot-required-

此时,DPU 工作节点应已添加到集群。随着它们被添加到集群,DPU 即完成配置。

跳转节点控制台

$ watch -n10 "kubectl describe dpu -n dpf-operator-system | grep 'Node Name\|Type\|Last\|Phase'"
Every 10.0s: kubectl describe dpu -n dpf-operator-system | grep 'Node Name\|Type\|Last\|Phase'
  Dpu Node Name:                                                     dpu-node-mt2334xz09f0
    Type:       InternalIP
    Type:       Hostname
    Last Transition Time:  2025-09-28T11:43:57Z
    Type:                  Initialized
    Last Transition Time:  2025-09-28T11:43:57Z
    Type:                  BFBReady
    Last Transition Time:  2025-09-28T11:43:57Z
    Type:                  NodeEffectReady
    Last Transition Time:  2025-09-28T11:43:59Z
    Type:                  InterfaceInitialized
    Last Transition Time:  2025-09-28T11:44:00Z
    Type:                  FWConfigured
    Last Transition Time:  2025-09-28T11:44:00Z
    Type:                  BFBPrepared
    Last Transition Time:  2025-09-28T11:56:32Z
    Type:                  OSInstalled
    Last Transition Time:  2025-09-28T12:37:26Z

类型: 已重启 最后转换时间: 2025-09-28T12:37:26Z 类型: DPUClusterReady 最后转换时间: 2025-09-28T12:37:26Z 类型: 就绪 阶段: 就绪 DPU节点名称: dpu-node-mt2334xz09f1 类型: InternalIP 类型: Hostname 最后转换时间: 2025-09-28T11:43:57Z 类型: 已初始化 最后转换时间: 2025-09-28T11:43:57Z 类型: BFBReady 最后转换时间: 2025-09-28T11:43:57Z 类型: NodeEffectReady 最后转换时间: 2025-09-28T11:43:58Z 类型: InterfaceInitialized 最后转换时间: 2025-09-28T11:44:00Z 类型: FWConfigured 最后转换时间: 2025-09-28T11:44:00Z 类型: BFBPrepared 最后转换时间: 2025-09-28T11:56:46Z 类型: OSInstalled 最后转换时间: 2025-09-28T12:37:26Z 类型: 已重启 最后转换时间: 2025-09-28T13:38:23Z 类型: DPUClusterReady 最后转换时间: 2025-09-28T13:38:23Z 类型: 就绪 阶段: 就绪

最后,验证所有不同的DPU相关对象现在都处于就绪状态:

跳转节点控制台

$ kubectl get secrets -n dpu-cplane-tenant1 dpu-cplane-tenant1-admin-kubeconfig -o json | jq -r '.data["admin.conf"]' | base64 --decode > /home/depuser/dpu-cluster.config
$ echo "alias ki='KUBECONFIG=/home/depuser/dpu-cluster.config kubectl'" >> ~/.bashrc

$ kubectl -n dpf-operator-system exec deploy/dpf-operator-controller-manager -- /dpfctl describe dpudeployments
NAME                                                 NAMESPACE            STATUS       REASON    SINCE  MESSAGE
DPFOperatorConfig/dpfoperatorconfig                  dpf-operator-system  Ready: True  Success   28m
└─DPUDeployments
  └─DPUDeployment/hbn-storage                        dpf-operator-system  Ready: True  Success   27m
    ├─DPUServiceChains
    | └─DPUServiceChain/hbn-storage-b782l            dpf-operator-system  Ready: True  Success   144m
    ├─DPUServiceInterfaces
    │ └─6 DPUServiceInterfaces...                    dpf-operator-system  Ready: True  Success   144m   See doca-hbn-p0-if-z2g6t, doca-hbn-p1-if-pbp47, doca-hbn-pf0hpf-if-qnzsw, doca-hbn-snap-if-qs22b,
    │                                                                                                   doca-snap-app-sf-72zh7, fs-storage-dpu-plugin-app-sf-pcvc5
    ├─DPUSets
    │ └─DPUSet/hbn-storage-dpuset1                   dpf-operator-system
    │   └─BFB/bf-bundle                              dpf-operator-system  Ready: True  Ready     144m   File: bf-bundle-3.0.0-135_25.04_ubuntu-22.04_prod.bfb, DOCA: 3.0.0
    │   └─DPU
    │     └─2 DPU...                                dpf-operator-system  Ready: True  DPUReady  90m    See dpu-node-mt2334xz09f0-mt2334xz09f0, dpu-node-mt2334xz09f1-mt2334xz09f1
    └─Services
      ├─DPUServiceTemplates
      │ ├─DPUServiceTemplate/doca-hbn                dpf-operator-system  Ready: True  Success   144m
      │ ├─DPUServiceTemplate/doca-snap               dpf-operator-system  Ready: True  Success   144m
      │ ├─DPUServiceTemplate/fs-storage-dpu-plugin   dpf-operator-system  Ready: True  Success   144m
      │ ├─DPUServiceTemplate/nfs-csi-controller      dpf-operator-system  Ready: True  Success   144m
      │ ├─DPUServiceTemplate/nfs-csi-controller-dpu  dpf-operator-system  Ready: True  Success   144m
      │ ├─DPUServiceTemplate/snap-configuration      dpf-operator-system  Ready: True  Success   144m
      │ ├─DPUServiceTemplate/snap-controller         dpf-operator-system  Ready: True  Success   144m
      │ ├─DPUServiceTemplate/snap-host-controller    dpf-operator-system  Ready: True  Success   144m
      │ └─DPUServiceTemplate/snap-node-driver        dpf-operator-system  Ready: True  Success   144m
      └─DPUServices
        └─9 DPUServices...                           dpf-operator-system  Ready: True  Success   144m   See doca-hbn-k9xdp, doca-snap-nnj2t, fs-storage-dpu-plugin-cqqfn, nfs-csi-controller-dpu-nzrqn,
                                                                                                        nfs-csi-controller-w992c, snap-configuration-vz4gc, snap-controller-jr5c7,
                                                                                                        snap-host-controller-z7jds, snap-node-driver-gtsds

$ kubectl get dpu -A
NAMESPACE             NAME                                 READY   PHASE   AGE
dpf-operator-system   dpu-node-mt2334xz09f0-mt2334xz09f0   True    Ready   161m
dpf-operator-system   dpu-node-mt2334xz09f1-mt2334xz09f1   True    Ready   161m

$ kubectl wait --for=condition=ready --namespace dpf-operator-system dpu --all
dpu.provisioning.dpu.nvidia.com/dpu-node-mt2334xz09f0-mt2334xz09f0 condition met
dpu.provisioning.dpu.nvidia.com/dpu-node-mt2334xz09f1-mt2334xz09f1 condition met

$ ki get pod -o wide -A
NAMESPACE             NAME                                                              READY   STATUS    RESTARTS   AGE    IP            NODE                                 NOMINATED NODE   READINESS GATES
dpf-operator-system   dpu-cplane-tenant1-doca-hbn-k9xdp-ds-bhtcx                        2/2     Running   0          49m    10.244.6.20   dpu-node-mt2334xz09f1-mt2334xz09f1   <none>           <none>
dpf-operator-system   dpu-cplane-tenant1-doca-hbn-k9xdp-ds-q5kb5                        2/2     Running   0          110m   10.244.4.10   dpu-node-mt2334xz09f0-mt2334xz09f0   <none>           <none>
dpf-operator-system   dpu-cplane-tenant1-doca-snap-nnj2t-8g9pb                          1/1     Running   0          49m    10.244.6.22   dpu-node-mt2334xz09f1-mt2334xz09f1   <none>           <none>
dpf-operator-system   dpu-cplane-tenant1-doca-snap-nnj2t-zg8s8                          1/1     Running   0          110m   10.244.4.11   dpu-node-mt2334xz09f0-mt2334xz09f0   <none>           <none>
dpf-operator-system   dpu-cplane-tenant1-fs-storage-dpu-plugin-cqqfn-fs-storage-79nb4   1/1     Running   0          110m   10.244.4.12   dpu-node-mt2334xz09f0-mt2334xz09f0   <none>           <none>
dpf-operator-system   dpu-cplane-tenant1-fs-storage-dpu-plugin-cqqfn-fs-storage-vbr4j   1/1     Running   0          49m    10.244.6.21   dpu-node-mt2334xz09f1-mt2334xz09f1   <none>           <none>
dpf-operator-system   dpu-cplane-tenant1-nvidia-k8s-ipam-controller-6cb8f65fc5-lnxcm    1/1     Running   0          7d1h   10.244.4.2    dpu-node-mt2334xz09f0-mt2334xz09f0   <none>

# DPF零信任(DPF-ZT)与SNAP DPU服务在virtio-fs模式下的技术预览

## 部署验证

要验证带有DOCA SNAP存储服务的DPF部署,请使用以下简单工作负载:

1. 创建带有PVC存储配置的简单DPU卷:

   **dpuvolume-nvme.yaml**

   ```yaml
   ---
   apiVersion: storage.dpu.nvidia.com/v1alpha1
   kind: DPUVolume
   metadata:
     name: test-volume-virtiofs-hotplug-pf-nvme
     namespace: dpf-operator-system
   spec:
     dpuStoragePolicyName: policy-fs-nvme
     resources:
       requests:
         storage: 100Gi
     accessModes:
     - ReadWriteOnce
     volumeMode: Filesystem
  1. 创建卷:

    Jump console

    $ kubectl apply -f dpuvolume-nvme.yaml
    dpuvolume.storage.dpu.nvidia.com/test-volume-virtiofs-hotplug-pf-nvme created
    
    Look NFS share folder on Target Node:
    root@target:~# ll /srv/nfs/nvmeshare
    total 4
    drwxr-xr-x 3 root root   54 Sep 28 14:40 ./
    drwxr-xr-x 4 root root 4096 Jul 22 08:30 ../
    drwxr-xr-x 2 root root    6 Sep 28 14:40 pvc-a988763f-9d84-4dc2-930b-86657a931895/
    
  2. 创建DPUVolumeAttachment以将DPU卷附加到两个Worker节点:

    Jump console

    ---
    apiVersion: storage.dpu.nvidia.com/v1alpha1
    kind: DPUVolumeAttachment
    metadata:
      name: test-volume-attachment-virtiofs-hotplug-pf-nvme-w1
      namespace: dpf-operator-system
    spec:
      dpuNodeName: dpu-node-mt2334xz09f0 # change to actual worker node name
      dpuVolumeName: test-volume-virtiofs-hotplug-pf-nvme
      functionType: pf
      hotplugFunction: true
    
    ---
    apiVersion: storage.dpu.nvidia.com/v1alpha1
    kind: DPUVolumeAttachment
    metadata:
      name: test-volume-attachment-virtiofs-hotplug-pf-nvme-w2
      namespace: dpf-operator-system
    spec:
      dpuNodeName: dpu-node-mt2334xz09f1 # change to actual worker node name
      dpuVolumeName: test-volume-virtiofs-hotplug-pf-nvme
      functionType: pf
      hotplugFunction: true
    
  3. 将卷附加到两个Worker节点:

    Jump console

    $ kubectl apply -f dpuvolumeattachment-nvme.yaml
    dpuvolumeattachment.storage.dpu.nvidia.com/test-volume-attachment-virtiofs-hotplug-pf-nvme-w1 created
    dpuvolumeattachment.storage.dpu.nvidia.com/test-volume-attachment-virtiofs-hotplug-pf-nvme-w2 created
    
  4. 检查卷附加:

    Jump console

    $ kubectl get dpuvolumeattachment -n dpf-operator-system -o yaml | grep filesystemTag
            filesystemTag: d8dffc9d64fbf39btag
            filesystemTag: d8dffc9d64fbf39btag
    
    The output above indicates that the DPUVolume has been successfully mounted on the DPU and the VirtIO-FS
    emulation has successfully published the TAG, making it available for mounting on the x86 Worker node.
    
  5. 在X86主机上挂载VIRTIO-FS卷:

    Jump console

    For Worker1:
    
    $ ssh worker1
    depuser@worker1:~$ sudo mkdir /mnt/virtio
    depuser@worker1:~$ sudo mount -t virtiofs d8dffc9d64fbf39btag /mnt/virtio
    
    depuser@worker1:~$ mount | grep virtio
    d8dffc9d64fbf39btag on /mnt/virtio type virtiofs (rw,relatime)
    
    depuser@worker1:~$ cd /mnt/virtio/
    
    depuser@worker1:/mnt/virtio$ sudo touch worker1.file
    
    depuser@worker1:/mnt/virtio$ ls
    worker1.file
    
    For Worker2:
    
    $ ssh worker2
    depuser@worker2:~$ sudo mkdir /mnt/virtio
    depuser@worker2:~$ sudo mount -t virtiofs d8dffc9d64fbf39btag /mnt/virtio
    
    depuser@worker2:~$ mount | grep virtio
    d8dffc9d64fbf39btag on /mnt/virtio type virtiofs (rw,relatime)
    
    depuser@worker2:~$ cd /mnt/virtio/
    
    depuser@worker2:/mnt/virtio$ sudo touch worker2.file
    
    depuser@worker1:/mnt/virtio$ ls
    worker1.file worker2.file
    
  6. FIO性能测试:

    Jump console

    Create FIO job file.
    
    cat /mnt/virtio/job-4k.fio
    
    [global]
    ioengine=libaio
    direct=1
    iodepth=32
    rw=read
    bs=4k
    size=10G
    numjobs=8
    runtime=60
    time_based
    group_reporting
    
    [job1]
    filename=/mnt/virtio/test.fio
    
    Run FIO job.
    
    $ sudo fio /mnt/virtio/job-4k.fio
    job1: (g=0): rw=read, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=32
    ...
    fio-3.36
    Starting 8 processes
    job1: Laying out IO file (1 file / 10240MiB)
    Jobs: 8 (f=8): [R(8)][100.0%][r=491MiB/s][r=126k IOPS][eta 00m:00s]
    job1: (groupid=0, jobs=8): err= 0: pid=3636: Mon Sep 29 05:25:21 2025
    read: IOPS=126k, BW=492MiB/s (516MB/s)(28.8GiB/60006msec)
    slat (usec): min=2, max=538, avg=12.48, stdev=16.18
    clat (usec): min=82, max=432099, avg=2006.02, stdev=5859.85
    lat (usec): min=316, max=432109, avg=2018.50, stdev=5858.35
    clat percentiles (usec):
    | 1.00th=[ 420], 5.00th=[ 449], 10.00th=[ 465], 20.00th=[ 478],
    | 30.00th=[ 490], 40.00th=[ 498], 50.00th=[ 506], 60.00th=[ 519],
    | 70.00th=[ 537], 80.00th=[ 562], 90.00th=[ 644], 95.00th=[18744],
    | 99.00th=[27395], 99.50th=[30802], 99.90th=[44827], 99.95th=[49546],
    | 99.99th=[60031]
    bw ( KiB/s): min=57640, max=586624, per=100.00%, avg=504163.97, stdev=6096.69, samples=952
    iops : min=14410, max=146656, avg=126040.96, stdev=1524.17, samples=952
    lat (usec) : 100=0.01%, 250=0.01%, 500=42.67%, 750=49.16%, 1000=1.25%
    lat (msec) : 2=0.20%, 4=0.01%, 10=0.01%, 20=2.32%, 50=4.33%
    lat (msec) : 100=0.05%, 250=0.01%, 500=0.01%
    cpu : usr=2.47%, sys=25.21%, ctx=6479868, majf=0, minf=968
    IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=100.0%, >=64=0.0%
    submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
    complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.1%, 64=0.0%, >=64=0.0%
    issued rwts: total=7560139,0,0,0 short=0,0,0,0 dropped=0,0,0,0
    latency : target=0, window=0, percentile=100.00%, depth=32
    
    Run status
    

group 0 (all jobs): READ: bw=492MiB/s (516MB/s), 492MiB/s-492MiB/s (516MB/s-516MB/s), io=28.8GiB (31.0GB), run=60006-60006msec

完成。

作者

VR.jpg Vitaliy Razinkov

Vitaliy Razinkov 是 NVIDIA 网络团队的一名解决方案架构师,专注于复杂的 Kubernetes、OpenShift 和 Microsoft 解决方案。凭借超过 25 年的高级技术职位经验,他在设计和实施先进基础设施方面拥有深厚的专业知识。Vitaliy 撰写了多份关于 Microsoft 技术、Kubernetes/OpenShift 中 RoCE/RDMA 加速机器学习以及容器化解决方案的参考设计指南——所有这些均可在 NVIDIA 网络文档网站上获取。 |