Install and configure the DPF Operator¶
After setting up the environment, install the NVIDIA DPF Operator and create the required DPF resources and DPU services.
Warning
You must install the DPF Operator before the DPF HCP Provisioner Operator because that Operator requires DPF CRDs such as DPUCluster, DPUFlavor, DPUDeployment, and DPFOperatorConfig.
DPF Operator installation environment variables¶
Set the following required environment variables before you install and configure the DPF Operator on OpenShift Container Platform. The values of these variables are used in multiple DPF Operator installation and configuration procedures.
DPF Operator environment variables
| Variable | Description | Example value |
|---|---|---|
CLUSTER_NAME |
The name of the management cluster. | <YOUR_CLUSTER_NAME> |
BASE_DOMAIN |
The base domain for the management cluster. | example.com |
HOST_CLUSTER_API |
The API server hostname of the management cluster. Derived from CLUSTER_NAME and BASE_DOMAIN. |
api.mycluster.example.com |
REGISTRY |
The Helm chart registry URL for the DPF Operator. | https://helm.ngc.nvidia.com/nvidia/doca |
TAG |
The version tag for the DPF Operator Helm chart. | v26.4.1 |
TARGETCLUSTER_API_SERVER_PORT |
The port number of the hosted cluster API server. | 6443 |
VTEP_CIDR |
A dedicated IP range allocated from the DPU high-speed network for VTEP (tunnel endpoint) IPs. Used for DPU service IPs by HBN and OVN-Kubernetes tunnels. The management network and this VTEP CIDR network must be routable to each other in both directions. | 10.0.120.0/22 |
NUM_VFS |
Number of SR-IOV VFs per physical function. Sets NUM_OF_VFS in the DPUFlavor nvconfig. The NodeSRIOVDevicePluginConfig allocates these VFs as VF0 (DPF communication channel), VF1 (OVN-Kubernetes management), and the remainder (workload and RDMA). |
46 |
NODES_MTU |
The MTU value for the node network interfaces. Use 1500 for standard MTU environments or 9000 for jumbo frame environments. This value must be consistent across all DPF networking configuration. |
1500 (standard) or 9000 (jumbo frames) |
OVN_TEMPLATE_CHART_URL |
The OCI chart URL for the OVN-Kubernetes Helm chart. | oci://ghcr.io/mellanox/charts |
OVN_CHART_VERSION |
The version of the OVN-Kubernetes Helm chart. | v26.4.1-ocp-release-v4.22 |
OVN_MTU |
The MTU value for OVN-Kubernetes overlay networking. Set to 1400 for standard MTU (1500 minus encapsulation overhead) or 8900 for jumbo frames (9000 minus encapsulation overhead). Must be kept consistent with NODES_MTU. |
1400 or 8900 |
DPU_HOST_CIDR |
The CIDR range of the subnet where the DPU host nodes reside. Used as the OVN hostCIDR. You must set this to your actual host subnet; the example value is illustrative only and is not a usable default. |
10.0.110.0/24 |
FLANNEL_POD_CIDR |
The pod CIDR for the Flannel network in the hosted cluster. Required for OpenShift Container Platform 4.22 and later. | 10.132.0.0/14 |
BFB_URL |
The download URL for the BlueField Bootstream File image used to provision DPUs. | https://rhcos.mirror.openshift.com/art/storage/prod/streams/rhel-10.2/builds/10.2.20260715-0/aarch64/rhcos-10.2.20260715-0-nvidiabluefield.aarch64.bfb |
You must set the following environment variables in your terminal session before you proceed.
$ export CLUSTER_NAME="<YOUR_CLUSTER_NAME>"
$ export BASE_DOMAIN="example.com"
$ export HOST_CLUSTER_API="api.${CLUSTER_NAME}.${BASE_DOMAIN}"
$ export REGISTRY="https://helm.ngc.nvidia.com/nvidia/doca"
$ export TAG="v26.4.1"
$ export TARGETCLUSTER_API_SERVER_PORT="6443"
$ export VTEP_CIDR="10.0.120.0/22"
$ export NUM_VFS="46"
$ export NODES_MTU="1500"
$ export OVN_TEMPLATE_CHART_URL="oci://ghcr.io/mellanox/charts"
$ export OVN_CHART_VERSION="v26.4.1-ocp-release-v4.22"
$ export OVN_MTU=1400
$ export DPU_HOST_CIDR="10.0.110.0/24"
$ export FLANNEL_POD_CIDR="10.132.0.0/14"
$ export BFB_URL="https://rhcos.mirror.openshift.com/art/storage/prod/streams/rhel-10.2/builds/10.2.20260715-0/aarch64/rhcos-10.2.20260715-0-nvidiabluefield.aarch64.bfb"
Install the DPF Operator¶
You can install the DPF Operator by using Helm to deploy the Operator into the dpf-operator-system namespace on your management cluster.
Warning
You must install the DPF Operator before the DPF HCP Provisioner Operator because that Operator requires the following DPF custom resource definitions to be available: DPUCluster, DPUFlavor, DPUDeployment, and DPFOperatorConfig.
Prerequisites
- You have access to the management cluster as a user with the
cluster-adminrole. - You have installed the
ocCLI. - You have installed the
helmCLI. - You have set the DPF Operator environment variables. For details, see "DPF Operator installation environment variables".
Procedure
-
Add the DPF Helm repository and update the local cache:
-
Install the DPF Operator by using Helm:
Verification
-
Verify that the Operator controller manager deployment has rolled out successfully:
-
Verify that all pods in the
dpf-operator-systemnamespace are ready:Example outputpod/argocd-application-controller-0 condition met pod/argocd-dex-server-6dd56c8469-bhsq4 condition met pod/argocd-redis-b4f94bb8d-wr86b condition met pod/argocd-repo-server-96765f997-79k9q condition met pod/argocd-server-648c7ff85f-7frtg condition met pod/dpf-operator-controller-manager-7bf9744c5f-cwrgc condition met pod/maintenance-operator-585767f779-8k2lx condition met
Create the DPFOperatorConfig custom resource¶
Create a DPFOperatorConfig custom resource to configure the DPF Operator components, including the provisioning controller, static cluster manager, and SR-IOV device plugin controller.
Prerequisites
- You have installed the DPF Operator.
- You have set the DPF Operator environment variables. For details, see "DPF Operator installation environment variables".
Procedure
-
Create a file named
dpfoperatorconfig.yamlwith the following content:Note
MTU Configuration: Set
NODES_MTUto1500for standard MTU environments or9000for jumbo frame environments. This value must be consistent across:- Assisted Installer host configuration
- DPFOperatorConfig networking section (this step)
- DPUServiceNAD configuration
Choose based on your network infrastructure capabilities.
apiVersion: operator.dpu.nvidia.com/v1alpha1 kind: DPFOperatorConfig metadata: name: dpfoperatorconfig namespace: dpf-operator-system spec: kamajiClusterManager: disable: true multus: disable: true cniInstaller: disable: true networking: controlPlaneMTU: $NODES_MTU # management/OOB MTU (= NODES_MTU: 1500 standard, 9000 jumbo) highSpeedMTU: $NODES_MTU # high-speed fabric MTU (= NODES_MTU; must match controlPlaneMTU) dpuNodeOOBBridgeName: br-ex # OOB bridge for DPU provisioning; br-ex on OpenShift overrides: dpuCNIBinPath: /var/lib/cni/bin/ dpuCNIPath: /run/multus/cni/net.d/ dpuOpenvSwitchSystemSharedLib64Path: /lib64 flannelSkipCNIConfigInstallation: false kubernetesAPIServerPort: $TARGETCLUSTER_API_SERVER_PORT kubernetesAPIServerVIP: $HOST_CLUSTER_API dpuLinkerCachePath: /etc/ld.so.cache dpuOptLibraryPath: /usr/opt provisioningController: enableDynamicBFCFGTemplates: true hostAgentDNSPolicy: Default dmsTimeout: 900 nodeSRIOVDevicePluginController: devicePlugin: defaultResourcePrefix: openshift.io disable: false replicas: 1 staticClusterManager: disable: false dpuServiceController: disableHostNetworkReadyNoExecuteTaints: false flannel: podCIDR: $FLANNEL_POD_CIDR -
Apply the resource file:
Verification
-
Verify that the provisioning controller manager deployment has rolled out:
-
Verify that the DPU service controller manager deployment has rolled out:
-
Verify that all Operator deployments in the
dpf-operator-systemnamespace have rolled out:Note
You might need to run this command more than once, because the deployments become available at different times as the Operator reconciles its resources.
-
Optional: List the pods in the
dpf-operator-systemnamespace to review their status:Example outputNAME READY STATUS RESTARTS AGE argocd-application-controller-0 1/1 Running 0 64m argocd-dex-server-9dd99cc6c-pkl6j 1/1 Running 0 64m argocd-redis-6749d85f98-mw9rc 1/1 Running 0 64m argocd-repo-server-5fd79d655c-9rl26 1/1 Running 0 64m argocd-server-5cc4f69c45-hzgm9 1/1 Running 0 64m bfb-registry 1/1 Running 0 98s dpf-nodesriovdeviceplugin-controller-7c7bb889f6-xk6nm 1/1 Running 0 107s dpf-operator-controller-manager-6969c6d8bc-4njxd 1/1 Running 0 4m54s dpf-provisioning-controller-manager-54b6bdc57f-69lr7 1/1 Running 0 109s dpf-provisioning-controller-manager-54b6bdc57f-fg9f6 1/1 Running 0 109s dpuservice-controller-manager-5d9c4f6f67-wsdzt 1/1 Running 0 108s maintenance-operator-68c794b549-pp2dp 1/1 Running 0 74m static-cm-controller-manager-745c8fd7d5-n8d2z 1/1 Running 0 110s
Create the NodeSRIOVDevicePluginConfig custom resource¶
You can create a NodeSRIOVDevicePluginConfig custom resource to define how SR-IOV virtual functions on the management cluster worker nodes are allocated to DPF components.
Prerequisites
- You have installed the DPF Operator.
- You have created the
DPFOperatorConfigresource.
Procedure
-
Create a file named
nodesriovdevicepluginconfig.yamlwith the following content:apiVersion: noderesources.dpu.nvidia.com/v1alpha1 kind: NodeSRIOVDevicePluginConfig metadata: name: bf3-vfs namespace: dpf-operator-system spec: devicePluginResources: - name: bf3-p0-vfs-mgmt type: vf ranges: - pfIndex: 0 start: 1 end: 1 - name: bf3_vfs type: vf options: isRdma: true ranges: - pfIndex: 0 start: 2 end: 45 - pfIndex: 1 start: 0 end: 45where:
bf3-p0-vfs-mgmt- Reserves VF index
1on PF0 for DPU management connectivity. bf3_vfs- Allocates VF indices
2-45on PF0 and VF indices0-45on PF1 for workload traffic with RDMA enabled. pfIndex- The
pfIndexvalues refer to the first (0) and second (1) physical functions of the BlueField-3 DPU.
-
Apply the resource file:
Verification
-
Verify that the
NodeSRIOVDevicePluginConfigresource is created:
Create the DPUFlavor custom resource¶
You can create a DPUFlavor custom resource to define the DPU configuration, including NVConfig parameters, kernel arguments, hugepages settings, and the OVS initialization script. The DPUFlavor also supports an optional configFiles field for custom DPU configuration files.
The nvconfig section contains BlueField-3 firmware parameters that the DPU agent applies by using mlxconfig during provisioning. If any parameter differs from the current firmware configuration, the provisioning controller triggers a system-level reset so that the changes take effect. The following parameters are required for DPF operation:
Required BlueField-3 NVConfig parameters
| Parameter | Value | Description |
|---|---|---|
INTERNAL_CPU_MODEL |
1 |
Switches the BlueField-3 to DPU mode where the ARM cores are active. A value of 0 keeps the card in NIC-only mode, which does not support DPF. |
SRIOV_EN |
1 |
Enables SR-IOV on both physical functions. The host agent creates Virtual Functions (VFs) that carry tenant traffic between the host and the DPU. |
NUM_OF_VFS |
Variable | Number of VFs per physical function. Set this value by using the $NUM_VFS environment variable. The default is 46. |
LINK_TYPE_P1 / LINK_TYPE_P2 |
ETH |
Sets both ports to Ethernet mode. DPF requires Ethernet. InfiniBand (IB) mode is not supported. |
Note
If BlueField-3 already has the correct values, the DPU agent reports that no action is required and does not trigger a reset.
Prerequisites
- You have installed the DPF Operator.
- You have created the
DPFOperatorConfigresource. - You have set the DPF Operator environment variables. For details, see "DPF Operator installation environment variables".
Procedure
-
Create a file named
dpuflavor.yamlfor your MTU configuration and apply it.-
For Standard MTU (1500):
apiVersion: provisioning.dpu.nvidia.com/v1alpha1 kind: DPUFlavor metadata: name: hbn-ovnk namespace: dpf-operator-system annotations: # Required when flavor bfcfg exceeds the DPF limit of 128K provisioning.dpu.nvidia.com/skip-bfcfg-size-check: "" spec: grub: kernelParameters: - console=hvc0 - console=ttyAMA0 - earlycon=pl011,0x13010000 - iommu.passthrough=1 - cgroup_no_v1=net_prio,net_cls - hugepagesz=2048kB - hugepages=250 nvconfig: - device: "*" parameters: - PF_BAR2_ENABLE=0 - PER_PF_NUM_SF=1 - PF_TOTAL_SF=20 - PF_SF_BAR_SIZE=10 - NUM_PF_MSIX_VALID=0 - PF_NUM_PF_MSIX_VALID=1 - PF_NUM_PF_MSIX=228 - INTERNAL_CPU_MODEL=1 - INTERNAL_CPU_OFFLOAD_ENGINE=0 - SRIOV_EN=1 - NUM_OF_VFS=$NUM_VFS - LAG_RESOURCE_ALLOCATION=1 - LINK_TYPE_P1=ETH - LINK_TYPE_P2=ETH ovs: rawConfigScript: | #!/bin/bash set -e _ovs-vsctl() { ovs-vsctl --timeout 15 "$@" } restart_ovs=false _ovs-get-other-config() { _ovs-vsctl --if-exists get Open_vSwitch . "other_config:$1" 2>/dev/null | tr -d '"' } _ovs-set-other-config() { if [ "$(_ovs-get-other-config "$1")" != "$2" ]; then _ovs-vsctl set Open_vSwitch . "other_config:$1=$2" restart_ovs=true fi } _ovs-remove-other-config() { if [ -n "$(_ovs-get-other-config "$1")" ]; then _ovs-vsctl remove Open_vSwitch . other_config "$1" restart_ovs=true fi } _ovs-set-other-config doca-init true _ovs-set-other-config dpdk-max-memzones 50000 _ovs-set-other-config hw-offload true _ovs-set-other-config pmd-quiet-idle true _ovs-set-other-config max-idle 20000 _ovs-set-other-config max-revalidator 5000 _ovs-set-other-config doca-congestion-threshold 60 _ovs-set-other-config flow-limit 500000 _ovs-set-other-config hw-offload-ct-unidir-udp-enabled true _ovs-remove-other-config default-datapath-type if [ "$restart_ovs" = true ]; then if systemctl list-unit-files openvswitch-switch.service &>/dev/null; then systemctl restart openvswitch-switch elif systemctl list-unit-files openvswitch.service &>/dev/null; then systemctl restart openvswitch fi fi _ovs-vsctl --may-exist add-br br-sfc _ovs-vsctl set bridge br-sfc datapath_type=netdev _ovs-vsctl set bridge br-sfc fail_mode=secure _ovs-vsctl --if-exists del-br br-hbn _ovs-vsctl --may-exist add-br br-hbn _ovs-vsctl set bridge br-hbn datapath_type=netdev _ovs-vsctl set bridge br-hbn fail_mode=secure _ovs-vsctl --may-exist add-port br-sfc p0 _ovs-vsctl set Interface p0 type=dpdk _ovs-vsctl set Interface p0 mtu_request=9216 _ovs-vsctl set Port p0 external_ids:dpf-type=physical # Activate DOCA for OVNK _ovs-vsctl set Open_vSwitch . external-ids:ovn-bridge-datapath-type=netdev # setup ovnkube managed bridge, br-dpu (this corresponds to br-ex on ovnk docs) _ovs-vsctl --may-exist add-br br-dpu _ovs-vsctl br-set-external-id br-dpu bridge-id br-dpu _ovs-vsctl br-set-external-id br-dpu bridge-uplink pbrdputobrovn _ovs-vsctl set bridge br-dpu datapath_type=netdev _ovs-vsctl --may-exist add-port br-dpu pf0hpf _ovs-vsctl set Interface pf0hpf type=dpdk # Create OVS bridge (br-ovn) in between the SC managed bridge and OVNK _ovs-vsctl --may-exist add-br br-ovn _ovs-vsctl set bridge br-ovn datapath_type=netdev _ovs-vsctl --may-exist add-port br-ovn pbrovntobrdpu _ovs-vsctl --may-exist add-port br-dpu pbrdputobrovn # Patch br-ovn and br-dpu together _ovs-vsctl set Interface pbrovntobrdpu type=patch options:peer=pbrdputobrovn _ovs-vsctl set Interface pbrdputobrovn type=patch options:peer=pbrovntobrdpu -
For Jumbo frames (MTU 9000):
apiVersion: provisioning.dpu.nvidia.com/v1alpha1 kind: DPUFlavor metadata: name: hbn-ovnk namespace: dpf-operator-system annotations: # Required when flavor bfcfg exceeds the DPF limit of 128K provisioning.dpu.nvidia.com/skip-bfcfg-size-check: "" spec: grub: kernelParameters: - console=hvc0 - console=ttyAMA0 - earlycon=pl011,0x13010000 - iommu.passthrough=1 - cgroup_no_v1=net_prio,net_cls - hugepagesz=2048kB - hugepages=250 nvconfig: - device: "*" parameters: - PF_BAR2_ENABLE=0 - PER_PF_NUM_SF=1 - PF_TOTAL_SF=20 - PF_SF_BAR_SIZE=10 - NUM_PF_MSIX_VALID=0 - PF_NUM_PF_MSIX_VALID=1 - PF_NUM_PF_MSIX=228 - INTERNAL_CPU_MODEL=1 - INTERNAL_CPU_OFFLOAD_ENGINE=0 - SRIOV_EN=1 - NUM_OF_VFS=$NUM_VFS - LAG_RESOURCE_ALLOCATION=1 - NUM_VF_MSIX=30 - LINK_TYPE_P1=ETH - LINK_TYPE_P2=ETH ovs: rawConfigScript: | #!/bin/bash set -e _ovs-vsctl() { ovs-vsctl --timeout 15 "$@" } restart_ovs=false _ovs-get-other-config() { _ovs-vsctl --if-exists get Open_vSwitch . "other_config:$1" 2>/dev/null | tr -d '"' } _ovs-set-other-config() { if [ "$(_ovs-get-other-config "$1")" != "$2" ]; then _ovs-vsctl set Open_vSwitch . "other_config:$1=$2" restart_ovs=true fi } _ovs-remove-other-config() { if [ -n "$(_ovs-get-other-config "$1")" ]; then _ovs-vsctl remove Open_vSwitch . other_config "$1" restart_ovs=true fi } _ovs-set-other-config doca-init true _ovs-set-other-config dpdk-max-memzones 50000 _ovs-set-other-config hw-offload true _ovs-set-other-config pmd-quiet-idle true _ovs-set-other-config max-idle 20000 _ovs-set-other-config max-revalidator 5000 _ovs-set-other-config doca-congestion-threshold 60 _ovs-set-other-config flow-limit 500000 _ovs-set-other-config hw-offload-ct-unidir-udp-enabled true _ovs-remove-other-config default-datapath-type if [ "$restart_ovs" = true ]; then if systemctl list-unit-files openvswitch-switch.service &>/dev/null; then systemctl restart openvswitch-switch elif systemctl list-unit-files openvswitch.service &>/dev/null; then systemctl restart openvswitch fi fi _ovs-vsctl --may-exist add-br br-sfc _ovs-vsctl set bridge br-sfc datapath_type=netdev _ovs-vsctl set bridge br-sfc fail_mode=secure _ovs-vsctl --if-exists del-br br-hbn _ovs-vsctl --may-exist add-br br-hbn _ovs-vsctl set bridge br-hbn datapath_type=netdev _ovs-vsctl set bridge br-hbn fail_mode=secure _ovs-vsctl --may-exist add-port br-sfc p0 _ovs-vsctl set Interface p0 type=dpdk _ovs-vsctl set Interface p0 mtu_request=9216 _ovs-vsctl set Port p0 external_ids:dpf-type=physical # Activate DOCA for OVNK _ovs-vsctl set Open_vSwitch . external-ids:ovn-bridge-datapath-type=netdev # setup ovnkube managed bridge, br-dpu (this corresponds to br-ex on ovnk docs) _ovs-vsctl --may-exist add-br br-dpu _ovs-vsctl br-set-external-id br-dpu bridge-id br-dpu _ovs-vsctl br-set-external-id br-dpu bridge-uplink pbrdputobrovn _ovs-vsctl set bridge br-dpu datapath_type=netdev _ovs-vsctl set Interface br-dpu mtu_request=9000 _ovs-vsctl --may-exist add-port br-dpu pf0hpf _ovs-vsctl set Interface pf0hpf type=dpdk # Create OVS bridge (br-ovn) in between the SC managed bridge and OVNK _ovs-vsctl --may-exist add-br br-ovn _ovs-vsctl set bridge br-ovn datapath_type=netdev _ovs-vsctl set Interface br-ovn mtu_request=9000 _ovs-vsctl --may-exist add-port br-ovn pbrovntobrdpu _ovs-vsctl --may-exist add-port br-dpu pbrdputobrovn # Patch br-ovn and br-dpu together _ovs-vsctl set Interface pbrovntobrdpu type=patch options:peer=pbrdputobrovn _ovs-vsctl set Interface pbrdputobrovn type=patch options:peer=pbrovntobrdpu
-
-
Apply the resource file:
Verification
-
Verify that the
DPUFlavorresource is created:
Create the BFB resource¶
You can create a BFB custom resource to define the DPU image, known as a BlueField Bootstream File, that is downloaded and placed on shared storage for DPU provisioning.
Prerequisites
- You have installed the DPF Operator.
- You have created the
DPFOperatorConfigresource. - You have set the DPF Operator environment variables. For details, see "DPF Operator installation environment variables".
Procedure
-
Create a file named
bfb.yamlwith the following content: -
Apply the resource file:
Verification
-
Verify that the BFB image phase is
Ready:
Create the DPUDeployment custom resource¶
You can create a DPUDeployment custom resource as the main orchestration object that connects DPU services with specific BFB images and DPU flavors. The DPUDeployment defines DPU sets for DPU provisioning and configures service chains to deploy services across DPUs.
Prerequisites
- You have installed the DPF Operator.
- You have created the
DPFOperatorConfigresource. - You have created the
NodeSRIOVDevicePluginConfigresource. - You have created the
DPUFlavorresource. - You have created the
BFBresource and it is in theReadyphase.
Procedure
-
Create a file named
dpudeployment.yamlwith the following content:apiVersion: svc.dpu.nvidia.com/v1alpha1 kind: DPUDeployment metadata: name: dpudeployment namespace: dpf-operator-system spec: dpus: nodeEffect: drain: true dpuSetStrategy: type: RollingUpdate bfb: bf-bundle flavor: hbn-ovnk dpuSets: - nameSuffix: "dpuset1" dpuNodeSelector: matchLabels: feature.node.kubernetes.io/dpu-enabled: "" dpuAnnotations: noderesources.dpu.nvidia.com/nodesriovdevicepluginconfig: bf3-vfs services: hbn: serviceTemplate: hbn serviceConfiguration: hbn ovn: serviceTemplate: ovn serviceConfiguration: ovn doca-telemetry-service: serviceTemplate: doca-telemetry-service serviceConfiguration: doca-telemetry-service serviceChains: switches: - ports: - serviceInterface: matchLabels: uplink: p0 - service: name: hbn interface: p0_if - ports: - serviceInterface: matchLabels: uplink: p1 - service: name: hbn interface: p1_if - ports: - serviceInterface: matchLabels: port: ovn - service: name: hbn interface: pf2dpu2_if -
Apply the resource file:
Verification
-
Verify the
DPUDeploymentstate:Note
A
Pendingphase is expected at this stage. TheDPUDeploymenttransitions toReadyafter DPU provisioning is complete and all services are deployed.
Create the HBN DPU service configuration¶
You can create a DPUServiceConfiguration custom resource for the Host-Based Networking (HBN) DPU service. The HBN service provides BGP-based networking on the DPU with ECMP routing support.
Note
HBN and OVN-Kubernetes are currently the only supported DPU network services. The DOCA Telemetry Service (DTS), which you configure in a later step, is deployed for observability and is not a network service.
Note
The DPUServiceTemplate resources are automatically created and managed by the dpf-hcp-provisioner-operator. You only need to create the DPUServiceConfiguration resources.
Prerequisites
- The DPF Operator is installed.
- The
DPFOperatorConfigresource is created. - The DPF Operator environment variables are set. For details, see "DPF Operator installation environment variables".
Procedure
-
Create a file named
hbn.yamlwith the following content:apiVersion: svc.dpu.nvidia.com/v1alpha1 kind: DPUServiceConfiguration metadata: name: hbn namespace: dpf-operator-system spec: deploymentServiceName: "hbn" serviceConfiguration: serviceDaemonSet: annotations: k8s.v1.cni.cncf.io/networks: |- [ {"name": "iprequest", "interface": "ip_lo", "cni-args": {"poolNames": ["loopback"], "poolType": "cidrpool"}}, {"name": "iprequest", "interface": "ip_pf2dpu2", "cni-args": {"poolNames": ["pool1"], "poolType": "cidrpool", "allocateDefaultGateway": true}} ] helmChart: values: configuration: perDPUValuesYAML: | - hostnamePattern: "*" values: bgp_peer_group: hbn startupYAMLJ2: | - header: model: BLUEFIELD nvue-api-version: nvue_v1 rev-id: 1.0 version: HBN 2.4.0 - set: interface: lo: ip: address: {{ ipaddresses.ip_lo.ip }}/32: {} type: loopback p0_if,p1_if: type: swp link: mtu: 9216 pf2dpu2_if: ip: address: {{ ipaddresses.ip_pf2dpu2.cidr }}: {} type: swp link: mtu: 9216 router: bgp: autonomous-system: {{ ( ipaddresses.ip_lo.ip.split(".")[3] | int ) + 65101 }} enable: on graceful-restart: mode: full router-id: {{ ipaddresses.ip_lo.ip }} vrf: default: router: bgp: address-family: ipv4-unicast: enable: on redistribute: connected: enable: on ipv6-unicast: enable: on redistribute: connected: enable: on enable: on neighbor: p0_if: peer-group: {{ config.bgp_peer_group }} type: unnumbered p1_if: peer-group: {{ config.bgp_peer_group }} type: unnumbered path-selection: multipath: aspath-ignore: on peer-group: {{ config.bgp_peer_group }}: remote-as: external interfaces: - name: p0_if network: mybrhbn - name: p1_if network: mybrhbn - name: pf2dpu2_if network: mybrhbn -
Apply the resource file:
Create the OVN-Kubernetes DPU service configuration¶
You can create a DPUServiceConfiguration custom resource for the OVN-Kubernetes DPU service. The OVN-Kubernetes service provides pod networking on the DPU.
Prerequisites
- You have installed the DPF Operator.
- You have created the
DPFOperatorConfigresource. - You have created the HBN
DPUServiceConfigurationresource. - You have set the DPF Operator environment variables. For details, see "DPF Operator installation environment variables".
Procedure
-
Create a file named
ovn-k.yamlwith the following content:apiVersion: svc.dpu.nvidia.com/v1alpha1 kind: DPUServiceConfiguration metadata: name: ovn namespace: dpf-operator-system spec: deploymentServiceName: "ovn" serviceConfiguration: helmChart: values: global: enableOvnKubeIdentity: false k8sAPIServer: https://$HOST_CLUSTER_API:6443 podNetwork: 10.128.0.0/14/23 serviceNetwork: 172.30.0.0/16 hostNetworkNamespace: "openshift-host-network" mtu: $OVN_MTU dpuManifests: kubernetesSecretName: "ovn-dpu" vtepCIDR: $VTEP_CIDR hostCIDR: $DPU_HOST_CIDR ipamPool: "pool1" ipamPoolType: "cidrpool" ipamVTEPIPIndex: 0 ipamPFIPIndex: 1 cniBinDir: "/var/lib/cni/bin/" cniConfDir: "/run/multus/cni/net.d" -
Apply the resource file:
Verification
-
Verify that the HBN and OVN-Kubernetes service configurations are created:
Create the DOCA Telemetry Service DPU service configuration¶
You can create a DPUServiceConfiguration custom resource for the DOCA Telemetry Service. The DOCA Telemetry Service provides metrics collection from the DPUs by using Prometheus.
Note
The DPUServiceTemplate for DOCA Telemetry Service is automatically created and managed by the dpf-hcp-provisioner-operator controller. The operator uses the correct chart and image versions for the installed DPF version. You only need to create the DPUServiceConfiguration resource.
Prerequisites
- You have installed the DPF Operator.
- You have created the
DPFOperatorConfigresource. - You have set the DPF Operator environment variables. For details, see "DPF Operator installation environment variables".
Procedure
-
Create a file named
dts.yamlwith the following content:apiVersion: svc.dpu.nvidia.com/v1alpha1 kind: DPUServiceConfiguration metadata: name: doca-telemetry-service namespace: dpf-operator-system spec: deploymentServiceName: "doca-telemetry-service" serviceConfiguration: configPorts: ports: - name: httpserverport port: 9189 protocol: TCP serviceType: None -
Apply the resource file:
Verification
-
Verify that the DOCA Telemetry Service configuration is created:
Create the OVN-Kubernetes credential request and role bindings¶
To authenticate with the management cluster API server, create a DPUServiceCredentialRequest custom resource and the associated role bindings to enable the OVN-Kubernetes DPU service on the hosted cluster. The ClusterRoleBinding grants the required permissions for OVN node network operations.
Prerequisites
- You have installed the DPF Operator.
- You have created the
DPFOperatorConfigresource.
Procedure
-
Create a file named
dpucredentialreq.yamlwith the following content:apiVersion: svc.dpu.nvidia.com/v1alpha1 kind: DPUServiceCredentialRequest metadata: name: ovn-dpu namespace: dpf-operator-system spec: serviceAccount: name: ovn-kubernetes-node-dpu-service namespace: openshift-ovn-kubernetes duration: 24h type: tokenFile secret: name: ovn-dpu namespace: dpf-operator-system metadata: labels: dpu.nvidia.com/image-pull-secret: "" --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: openshift-ovn-kubernetes-node-limited-dpu-service namespace: openshift-ovn-kubernetes roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: openshift-ovn-kubernetes-node-limited subjects: - kind: ServiceAccount name: ovn-kubernetes-node-dpu-service namespace: openshift-ovn-kubernetes --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: ovn-kubernetes-node-limited-binding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: openshift-ovn-kubernetes-node-limited subjects: - kind: ServiceAccount name: ovn-kubernetes-node-dpu-service namespace: openshift-ovn-kubernetes -
Apply the resource file:
Verification
-
Verify that the credential request and role bindings are created:
Create the DPUServiceInterface custom resources¶
You can create DPUServiceInterface custom resources to define interface objects that are specified in service chains. You must create physical interface resources for the DPU ports and an OVN-Kubernetes interface resource for host workloads.
Prerequisites
- You have installed the DPF Operator.
- You have created the
DPFOperatorConfigresource.
Procedure
-
Create a file named
physical-if.yamlwith the following content to define the physical DPU port interfaces:apiVersion: svc.dpu.nvidia.com/v1alpha1 kind: DPUServiceInterface metadata: name: p0 namespace: dpf-operator-system spec: template: spec: template: metadata: labels: uplink: "p0" spec: interfaceType: physical physical: interfaceName: p0 --- apiVersion: svc.dpu.nvidia.com/v1alpha1 kind: DPUServiceInterface metadata: name: p1 namespace: dpf-operator-system spec: template: spec: template: metadata: labels: uplink: "p1" spec: interfaceType: physical physical: interfaceName: p1 -
Apply the physical interface resource file:
-
Create a file named
ovnk-if.yamlwith the following content to define the OVN-Kubernetes interface: -
Apply the OVN-Kubernetes interface resource file:
Verification
-
Verify that all
DPUServiceInterfaceresources are created:
Create the DPUServiceNAD resource¶
Create a DPUServiceNAD custom resource to define the network attachment available to DPU services on the hosted cluster. The DPUServiceNAD resource maps to an Open vSwitch (OVS) bridge on the DPU and specifies the resource type, IP address management (IPAM) mode, and maximum transmission unit (MTU) configuration:
mybrhbnmaps to thebr-hbnbridge, used by the HBN service. IPAM is disabled because IP allocation is handled byDPUServiceIPAM.
Prerequisites
- You have installed the DPF Operator.
- You have created the
DPFOperatorConfigresource. - You have set the DPF Operator environment variables. For details, see "DPF Operator installation environment variables".
Procedure
-
Create a file named
dpuservice-nad.yamlwith the following content: -
Apply the resource file:
Verification
-
Verify that the
DPUServiceNADresource is created:
Create the DPUServiceIPAM resources¶
You can create DPUServiceIPAM custom resources to configure IP address management for DPU services. Two IPAM pools are required: one for the VTEP network used by the high-speed data plane, and one for loopback addresses used by the HBN service.
Prerequisites
- You have installed the DPF Operator.
- You have created the
DPFOperatorConfigresource. - You have set the DPF Operator environment variables. For details, see "DPF Operator installation environment variables".
Procedure
-
Create a file named
dpuservice-ipam.yamlwith the following content:--- apiVersion: svc.dpu.nvidia.com/v1alpha1 kind: DPUServiceIPAM metadata: name: pool1 namespace: dpf-operator-system spec: ipv4Network: network: $VTEP_CIDR gatewayIndex: 3 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 -
Apply the resource file:
Verification
-
Verify that the
DPUServiceIPAMresources are created: