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 DOCA
- NVIDIA DOCA HBN Service
- NVIDIA DOCA SNAP Service
- NVIDIA DPF Release Notes
- NVIDIA DPF GitHub Repository
- NVIDIA DPF System Overview
- NVIDIA Ethernet Switching
- NVIDIA Cumulus Linux
- NVIDIA Network Operator
- What is K8s?
- Kubespray
解决方案架构
关键组件与技术
-
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主机管理网络

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

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

防火墙设计
此解决方案中的pfSense防火墙具有双重用途:
- 防火墙 – 为DPF系统提供隔离环境,确保安全操作
- 路由器 – 实现互联网访问以及主机管理网络与高速网络之间的连接
防火墙配置了SSH和RDP的端口转发规则,将流量路由到跳转节点在主机管理网络中的IP地址。管理员可通过跳转节点管理并访问设置中的各种设备,以及处理Kubernetes(K8s)集群和DPF组件的部署。
下图展示了此解决方案中使用的防火墙设计:

软件栈组件

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

部署与配置
节点与交换机定义
以下是部署所演示网络所用的定义和参数:
| 交换机端口使用 | ||
|---|---|---|
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 |
布线
虚拟机管理程序节点

裸金属工作节点

存储目标节点

网络结构配置
更新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服务安装
前提条件
在开始部署之前,需要进行一些调整。
- 在每个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
-
构建并推送 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.yaml 和 dpuservicetemplate_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
-
-
下载 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 -
修改
manifests/00-env-vars/envvars.env中的变量以适配你的环境,然后加载该文件:将以下文件中的变量值替换为适合你设置的值。特别注意
DPUCLUSTER_INTERFACE和BMC_ROOT_PASSWORD。运行此命令前,需要设置多个环境变量。
$ source manifests/00-env-vars/envvars.env
修改DPUDeployment、DPUServiceConfig、DPUServiceTemplate及其他必要对象。
-
在部署
manifests/04-dpudeployment-installation目录下的对象之前,需要进行一些调整。-
检查
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 -
设置 storage-pool 的
ipv4Subnet设置(注意:GW IP应分配给存储目标节点安装中的DATA接口)。以下是IPAM配置文件:
hbn-ipam.yamlhbn-loopback-ipam.yamlstorage-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 -
根据你的环境在
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.yaml、dpuservicetemplate_doca-snap.yaml - HBN DPUService 部署和配置 YAML:
hbn-dpuserviceconfig.yaml、hbn-dpuservicetemplate.yaml - SNAP 配置 DPUService 部署和配置 YAML:
dpuserviceconfig_snap-configuration.yaml、dpuservicetemplate_snap-configuration.yaml - SNAP 控制器 DPUService 部署和配置 YAML:
dpuserviceconfig_snap-controller.yaml、dpuservicetemplate_snap-controller.yaml - SNAP 主机控制器 DPUService 部署和配置 YAML:
dpuserviceconfiguration_snap-host-controller.yaml、dpuservicetemplate_snap-host-controller.yaml - SNAP 节点驱动 DPUService 部署和配置 YAML:
dpuserviceconfig_snap-node-driver.yaml、dpuservicetemplate_snap-node-driver.yaml - NFS CSI 控制器 DPUService 部署和配置 YAML:
dpuserviceconfiguration_nfs-csi-controller.yaml、dpuservicetemplate_nfs-csi-controller.yaml(需要更新仓库) - NFS CSI DPU 控制器 DPUService 部署和配置 YAML:
dpuserviceconfiguration_nfs-csi-controller-dpu.yaml、dpuservicetemplate_nfs-csi-controller-dpu.yaml(需要更新仓库) - 存储供应商 DPU 插件 DPUService 部署和配置 YAML:
dpuserviceconfiguration_fs-storage-dpu-plugin.yaml、dpuservicetemplate_fs-storage-dpu-plugin.yaml - DPUServiceIPAM 部署和配置 YAML:
hbn-loopback-ipam.yaml、storage-ipam.yaml、hbn-ipam.yaml - DPUServiceInterfaces 用于 DPU 物理端口:
physical-ifaces.yaml - SNAP DPUServiceCredentialRequest 用于跨集群通信:
dpuservicecredentialrequest_nfs-csi-controller.yaml、dpuservicecredentialrequest_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
-
创建卷:
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/ -
创建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 -
将卷附加到两个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 -
检查卷附加:
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. -
在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 -
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
完成。
作者
![]() |
Vitaliy Razinkov |
Vitaliy Razinkov 是 NVIDIA 网络团队的一名解决方案架构师,专注于复杂的 Kubernetes、OpenShift 和 Microsoft 解决方案。凭借超过 25 年的高级技术职位经验,他在设计和实施先进基础设施方面拥有深厚的专业知识。Vitaliy 撰写了多份关于 Microsoft 技术、Kubernetes/OpenShift 中 RoCE/RDMA 加速机器学习以及容器化解决方案的参考设计指南——所有这些均可在 NVIDIA 网络文档网站上获取。 |


