使用 NVIDIA DPU 和基于主机的网络 (HBN) 的 K8s 集群技术预览
范围 本文档为技术预览,旨在预览在 Kubernetes 用例中运行于 BlueField DPU 上的 NVIDIA 基于主机的网络 (HBN) 服务。
文档目录
范围
本文档为技术预览,旨在预览在 Kubernetes 用例中运行于 BlueField DPU 上的 NVIDIA 基于主机的网络 (HBN) 服务。
缩写和缩略语
| 术语 | 定义 | 术语 | 定义 |
|---|---|---|---|
| BGP | 边界网关协议 | LACP | 链路聚合控制协议 |
| CNI | 容器网络接口 | LAG | 链路聚合 |
| DOCA | 数据中心级架构 | PF | 物理功能 |
| DPU | 数据处理单元 | SDN | 软件定义网络 |
| ECMP | 等价多路径 | SRIOV | 单根输入输出虚拟化 |
| EVPN | 以太网虚拟专用网络 | VF | 虚拟功能 |
| HBN | 基于主机的网络 | VXLAN | 虚拟可扩展局域网 |
| K8s | Kubernetes |
引言
BlueField®-2 数据处理单元 (DPU) 在每个主机中提供创新的卸载、加速、安全性和效率。
BlueField-2 将 ConnectX®-6 的强大功能与可编程 Arm 内核和硬件加速引擎相结合,用于软件定义的存储、网络、安全和管理工作负载。
NVIDIA HBN 是一种运行在 DPU 上的服务,它通过在 DPU 中终止以太网第 2 层网络来简化网络配置,使物理网络通过 BGP 管理的第 3 层网络变得更加“即插即用”。
使用 HBN,工作负载服务器通过路由器端口连接到物理交换机,使用无编号 BGP 配置,该配置是自动的,不需要为底层网络分配任何 IP 子网和地址,并基于 ECMP 提供内置的主动-主动高可用性和负载均衡。
服务器中的 DPU 充当主机网络的虚拟隧道端点 (VTEP),通过使用 EVPN 技术的 VXLAN 在集群中的所有节点之间提供扩展的第 2 层网络。
DPU 上的 HBN 配置与物理 NVIDIA 交换机的配置几乎相同,因为它使用相同的 NVUE CLI 命令或 NVUE 编程 API。
注意: 在本文档发布时,HBN 存在一些吞吐量限制,将在后续版本中解决。HBN 对 RoCE 的支持也将在未来版本中添加。
参考文献
- NVIDIA HBN
- NVIDIA DOCA
- NVIDIA BlueField DPU
- NVIDIA Ethernet Switch
- NVIDIA Cumulus Linux Switch OS
- What is Kubernetes?
- Kubespray
- SRIOV Device Plugin
- Multus
解决方案架构
逻辑设计

我们的部署使用 HBN 创建两个扩展的第 2 层网络:一个用于主网络(Calico 以 IP-in-IP 配置运行),使用 VLAN 60;另一个用于辅助 SR-IOV 网络,使用 VLAN 50。
主网络运行在 DPU 的物理功能 (PF) 上,使用基于 veth 的内核接口(虚拟以太网接口)用于名为 eth0 的 Pod,而辅助网络为每个 Pod 分配虚拟功能 (VF),命名为 net1,这些 VF 从 HBN 每个 DPU 支持的多达 16 个 VF 池中分配。该网络可以利用 DPU 的硬件加速能力。对 RoCE 流量的支持将很快通过它添加。
部署的外部访问(即实验室网络访问和互联网连接)通过连接到叶交换机的网关节点实现,该节点充当 VLAN 60 上管理网络 172.60.0.0/24 的默认网关。
通过叶交换机在服务器之间传输的流量(网关节点除外)仅使用第 3 层(在 BGP 邻居之间路由的数据包),并利用 ECMP 实现高可用性和负载均衡。
此设置中使用的网关节点使用叶中的 VTEP。
注意: 请注意,本示例中用于提供外部访问的网关节点的配置和部署不在本文档范围内。 注意: 请注意,本示例中使用的网关解决方案不支持高可用性场景。建议在生产环境中使用高可用性网关部署(即连接到多个叶交换机)。
所展示的部署代表一个单机架规模的部署,可以通过添加额外的交换机轻松扩展,创建一个可容纳数百个节点的大规模多机架部署。
在部署中使用 HBN 的主要优点是只需要很少的交换机配置:每个添加的交换机需要一个唯一的 /32 地址和可能的 AS 号(叶交换机),但除此之外不需要额外的配置。
这同样适用于每个 DPU 上的 HBN 配置,因为它只需要一个唯一的 /32 地址和一个唯一的 AS 号。
BGP 邻居使用“无编号”模式,该模式自动识别邻居并在每条链路上分配本地 IPv6 子网——一种“即插即用”的连接。
使用的 IP 地址
以下是设置中各种接口上设置的 IP 地址。
注意: 请注意,tmfifo_net0 接口是在主机和 DPU 之间的 RShim 连接上自动创建的虚拟接口,位于两侧。 我们可以使用这些接口从主机安装 DPU 软件,作为 DPU 上带外 1GbE 物理端口的替代方案。
| 设备 | 描述 | 接口 | IP 地址 |
|---|---|---|---|
| Master | K8s 主节点和部署节点 | ens2f0np0 |
172.60.0.11/24 |
tmfifo_net0 |
192.168.100.1/30 | ||
| Worker1 | K8s 工作节点 1 |
ens2f0np0
tmfifo_net0
| 节点 | 描述 | 接口 | IP 地址 |
|---|---|---|---|
| Worker2 | K8s worker 节点 2 | ens2f0np0tmfifo_net0 |
172.60.0.13/24192.168.100.1/30 |
| DPU | 任意使用的 DPU | tmfifo_net0 |
192.168.100.2/30 |
交换机与 HBN 配置及连接:
| 交换机 | 描述 | 路由器 ID | AS 号 | 链路 |
|---|---|---|---|---|
| Leaf1 | 叶 (TOR) 交换机 1 | 10.10.10.1/32 | 65101 | 到 DPU:swp1-3到脊:swp31-32到网关节点:swp30 |
| Leaf2 | 叶 (TOR) 交换机 2 | 10.10.10.2/32 | 65102 | 到 DPU:swp1-3到脊:swp31-32 |
| Spine1 | 脊交换机 1 | 10.10.10.101/32 | 65199 | 到叶:swp1-2 |
| Spine2 | 脊交换机 2 | 10.10.10.102/32 | 65199 | 到叶:swp1-2 |
| Master HBN | 主节点 DPU 上的 HBN | 10.10.10.11/32 | 65111 | 到叶:p0_sf,p1_sf |
| Worker 1 HBN | Worker1 节点 DPU 上的 HBN | 10.10.10.12/32 | 65112 | 到叶:p0_sf,p1_sf |
| Worker 2 HBN | Worker2 节点 DPU 上的 HBN | 10.10.10.13/32 | 65113 | 到叶:p0_sf,p1_sf |
VTEP 配置:
| VTEP | 接口 | VLAN | VNI |
|---|---|---|---|
| Leaf1 | swp30 |
60 | 10060 |
| HBN (任意) | pf0vf0_sf - pf0vf15_sf |
50 | 10050 |
| HBN (任意) | pf0hpf_sf |
60 | 10060 |
软件栈组件

物料清单

部署与配置
配置网络交换机
- NVIDIA® SN3700 交换机安装有 NVIDIA® Cumulus® Linux 5.3 操作系统
- 每个节点通过两个 100Gb/s 路由器端口(TOR 交换机上的接口
swp1-3)连接到两台 TOR 交换机 - TOR 交换机通过路由器端口(TOR 上的接口
swp31-32和脊上的swp1-2)连接到两台脊交换机 - 此外,一个网关节点通过 VTEP 连接到其中一个 TOR,提供外部网络访问和互联网连接(管理网络 VLAN60,Leaf1 上的接口
swp30)
使用以下 NVUE 命令配置交换机:
nv set interface lo ip address 10.10.10.1/32
nv set interface swp30,swp31-32,swp1-3
nv set interface swp30 link mtu 9000
nv set interface swp30 bridge domain br_default
nv set interface swp30 bridge domain br_default access 60
nv set bridge domain br_default vlan 60
nv set bridge domain br_default vlan 60 vni 10060
nv set nve vxlan source address 10.10.10.1
nv set nve vxlan arp-nd-suppress on
nv set system global anycast-mac 44:38:39:BE:EF:AA
nv set evpn enable on
nv set router bgp autonomous-system 65101
nv set router bgp router-id 10.10.10.1
nv set vrf default router bgp peer-group underlay remote-as external
nv set vrf default router bgp neighbor swp31 peer-group underlay
nv set vrf default router bgp neighbor swp32 peer-group underlay
nv set vrf default router bgp peer-group underlay address-family l2vpn-evpn enable on
nv set vrf default router bgp peer-group hbn remote-as external
nv set vrf default router bgp neighbor swp1 peer-group hbn
nv set vrf default router bgp neighbor swp2 peer-group hbn
nv set vrf default router bgp neighbor swp3 peer-group hbn
nv set vrf default router bgp peer-group hbn address-family l2vpn-evpn enable on
nv set vrf default router bgp address-family ipv4-unicast redistribute connected enable on
nv config apply -y
nv set interface lo ip address 10.10.10.2/32
nv set interface swp31-32,swp1-3
nv set router bgp autonomous-system 65102
nv set router bgp router-id 10.10.10.2
nv set vrf default router bgp peer-group underlay remote-as external
nv set vrf default router bgp neighbor swp31 peer-group underlay
nv set vrf default router bgp neighbor swp32 peer-group underlay
nv set vrf default router bgp peer-group underlay address-family l2vpn-evpn enable on
nv set vrf default router bgp peer-group hbn remote-as external
nv set vrf default router bgp neighbor swp1 peer-group hbn
nv set vrf default router bgp neighbor swp2 peer-group hbn
nv set vrf default router bgp neighbor swp3 peer-group hbn
nv set vrf default router bgp peer-group hbn address-family l2vpn-evpn enable on
nv set vrf default router bgp address-family ipv4-unicast redistribute connected enable on
nv config apply -y
nv set interface lo ip address 10.10.10.101/32
nv set interface swp1-2
nv set router bgp autonomous-system 65199
nv set router bgp router-id 10.10.10.101
nv set vrf default router bgp peer-group underlay remote-as external
nv set vrf default router bgp neighbor swp1 peer-group underlay
nv set vrf default router bgp neighbor swp2 peer-group underlay
nv set vrf default router bgp address-family l2vpn-evpn enable on
nv set vrf default router bgp peer-group underlay address-family l2vpn-evpn enable on
nv set vrf default router bgp address-family ipv4-unicast redistribute connected enable on
nv config apply -y
nv set interface lo ip address 10.10.10.102/32
nv set interface swp1-2
nv set router bgp autonomous-system 65199
nv set router bgp router-id 10.10.10.102
nv set vrf default router bgp peer-group underlay remote-as external
nv set vrf default router bgp neighbor swp1 peer-group underlay
nv set vrf default router bgp neighbor swp2 peer-group underlay
nv set vrf default router bgp address-family l2vpn-evpn enable on
nv set vrf default router bgp peer-group underlay address-family l2vpn-evpn enable on
nv set vrf default router bgp address-family ipv4-unicast redistribute connected enable on
nv config apply -y
技术预览:使用 NVIDIA DPU 和主机基础网络 (HBN) 的 K8s 集群
交换机配置
在交换机上配置 BGP 和 EVPN。
交换机控制台
swp1-4
nv set router bgp autonomous-system 65199
nv set router bgp router-id 10.10.10.102
nv set vrf default router bgp peer-group underlay remote-as external
nv set vrf default router bgp neighbor swp1 peer-group underlay
nv set vrf default router bgp neighbor swp2 peer-group underlay
nv set vrf default router bgp address-family l2vpn-evpn enable on
nv set vrf default router bgp peer-group underlay address-family l2vpn-evpn enable on
nv set vrf default router bgp address-family ipv4-unicast redistribute connected enable on
nv config apply -y
主机准备
-
在服务器上安装 Ubuntu 22.04 并确保其已更新至最新版本:
服务器控制台
$ sudo apt update $ sudo apt upgrade $ sudo reboot -
为允许免密码
sudo,在每个主机上将本地用户添加到 sudoers 文件:服务器控制台
$ sudo vi /etc/sudoers #includedir /etc/sudoers.d #K8s集群部署用户,具有免密码sudo权限 user ALL=(ALL) NOPASSWD:ALL -
在部署节点上生成 SSH 密钥并将其复制到每个节点。例如:
部署节点控制台(使用主节点)
$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/user/.ssh/id_rsa): Created directory '/home/user/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/user/.ssh/id_rsa. Your public key has been saved in /home/user/.ssh/id_rsa.pub. The key fingerprint is: SHA256:PaZkvxV4K/h8q32zPWdZhG1VS0DSisAlehXVuiseLgA user@master The key's randomart image is: +---[RSA 2048]----+ | ...+oo+o..o| | .oo .o. o| | . .. . o +.| | E . o + . +| | . S = + o | | . o = + o .| | . o.o + o| | ..+.*. o+o| | oo*ooo.++| +----[SHA256]-----+ $ ssh-copy-id -i ~/.ssh/id_rsa user@10.10.0.1 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user/.ssh/id_rsa.pub" The authenticity of host 10.10.0.1 (10.10.0.1)' can't be established. ECDSA key fingerprint is SHA256:uyglY5g0CgPNGDm+XKuSkFAbx0RLaPijpktANgXRlD8. Are you sure you want to continue connecting (yes/no)? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys user@10.10.0.1's password: Number of key(s) added: 1 -
现在尝试登录该机器,并验证无需密码即可登录。
部署 BFB
-
从 DOCA 网页 下载 DOCA 主机驱动程序包,向下滚动到页面底部并选择相关包。它将安装从主机访问和安装 DPU 所需的所有必要软件。

-
安装下载的 DOCA 主机驱动程序包:
服务器控制台
# wget https://www.mellanox.com/downloads/DOCA/DOCA_v1.5.1/doca-host-repo-ubuntu2204_1.5.1-0.1.8.1.5.1007.1.5.8.1.1.2.1_amd64.deb # dpkg -i doca-host-repo-ubuntu2204_1.5.1-0.1.8.1.5.1007.1.5.8.1.1.2.1_amd64.deb # apt-get update # apt install doca-runtime # apt install doca-tools -
下载 BFB 4.0.3(含 DOCA 2.0.2v2):

-
创建配置文件
bf.cfg:服务器控制台
# echo 'ENABLE_SFC_HBN=yes' > bf.cfg -
安装 BFB(DPU 的操作系统镜像):
服务器控制台
# bfb-install -c bf.cfg -r rshim0 -b DOCA_2.0.2_BSP_4.0.3_Ubuntu_22.04-10.23-04.prod.bfb -
安装完成后,对服务器执行完全断电重启,以便 DPU 固件在需要时重新启动和升级。
-
服务器重启后,使用 netplan 为每个主机上的 DPU 第一个接口分配 IP 地址。以下是主节点的示例。工作节点(172.60.0.12 和 172.60.0.13)也应执行相同操作。注意指向网关节点(172.60.0.254)的默认路由,以提供外部/互联网连接:
服务器控制台
# vi /etc/netplan/00-installer-config.yaml network: ethernets: eno1: dhcp4: true eno2: dhcp4: true eno3: dhcp4: true eno4: dhcp4: true ens2f0np0: dhcp4: false mtu: 9000 addresses: [172.60.0.11/24] nameservers: addresses: [8.8.8.8] search: [] routes: - to: default via: 172.60.0.254 ens2f1np1: dhcp4: false version: 2 -
应用设置:
服务器控制台
# netplan apply
安装 DOCA 容器配置包
通过以下方式之一登录 DPU:
- 使用 OOB 管理接口(如果已连接并通过 DHCP 获取 IP 地址)
- 使用通过 RShim 的内置网络接口(
tmfifo_net0)
本示例使用 RShim 选项:
-
使用以下命令为
tmfifo_net0接口分配 IP 地址:服务器控制台
# ip address add 192.168.100.1/30 dev tmfifo_net0首次登录 DPU 时,使用 ubuntu/ubuntu 作为凭据。
-
系统会要求您修改密码:
服务器控制台
# ssh ubuntu@192.168.100.2 The authenticity of host '192.168.100.2 (192.168.100.2)' can't be established. ED25519 key fingerprint is SHA256:S2gzl4QzVUY0g3GRsl9VLi3tYHQdIe7oQ+8I8tr95c4. This key is not known by any other names Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added '192.168.100.2' (ED25519) to the list of known hosts. ubuntu@192.168.100.2's password: You are required to change your password immediately (administrator enforced) Welcome to Ubuntu 20.04.5 LTS (GNU/Linux 5.4.0-1049-bluefield aarch64) * 文档: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage System information as of Mon Jan 16 12:53:57 UTC 2023 System load: 0.09 Usage of /: 6.7% of 58.00GB Memory usage: 13% Swap usage: 0% Processes: 485 Users logged in: 0 IPv4 address for docker0: 172.17.0.1 IPv4 address for mgmt: 127.0.0.1 IPv6 address for mgmt: ::1 IPv4 address for oob_net0: 10.10.7.37 IPv4 address for tmfifo_net0: 192.168.100.2 0 updates can be applied immediately. The programs included with the Ubuntu system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. WARNING: Your password has expired. You must change your password now and login again! Changing password for ubuntu. Current password: New password: Retype new password: passwd: password updated successfully Connection to 192.168.100.2 closed. -
登录 DPU 后,下载 DOCA 容器配置包并安装。该包包含在 DPU 上激活 HBN 容器所需的脚本和配置:
DPU 控制台
# wget --content-disposition https://api.ngc.nvidia.com/v2/resources/nvidia/doca/doca_container_configs/versions/2.0.2v2/zip -O doca_container_configs_2.0.2v2.zip --no-check-certificate # unzip -o doca_container_configs_2.0.2v2.zip -d doca_container_configs_2.0.2v2 # cd doca_container_configs_2.0.2v2/scripts/doca_hbn/1.4.0 # chmod +x hbn-dpu-setup.sh # ./hbn-dpu-setup.sh # cd ../../../configs/2.0.2/ # cp doca_hbn.yaml /etc/kubelet.d/警告:如果您的设置中未使用 DPU 的带外管理接口,您将无法从互联网拉取 zip 文件。 在这种情况下,请将其拉取到主机,然后使用
scp通过 RShim 网络将其复制到 DPU。
接口 (tmfifo_net0)。
在主机控制台上:
# wget --content-disposition https://api.ngc.nvidia.com/v2/resources/nvidia/doca/doca_container_configs/versions/2.0.2v2/zip -O doca_container_configs_2.0.2v2.zip --no-check-certificate
# scp doca_container_configs_2.0.2v2.zip ubuntu@192.168.100.2:/home/ubuntu/
-
重启 DPU:
DPU 控制台
# reboot
配置 HBN
DPU 重启后,将运行 "doca-hbn" 容器。
-
要查找其 ID(将出现在
CONTAINER下的第一列),运行:DPU 控制台
# crictl ps -
连接到该容器:
DPU 控制台
# crictl exec -it <container-id> bash -
使用以下 NVUE 命令配置 HBN(必须在每个 DPU 上执行):
nv set bridge domain br_default vlan 50 vni 10050 nv set bridge domain br_default vlan 60 vni 10060 nv set evpn enable on nv set interface lo ip address 10.10.10.11/32 nv set interface p0_sf,p1_sf link state up nv set interface p0_sf,p1_sf,pf0hpf_sf,pf0vf0_sf,pf0vf10_sf,pf0vf11_sf,pf0vf12_sf,pf0vf13_sf,pf0vf1_sf,pf0vf2_sf,pf0vf3_sf,pf0vf4_sf,pf0vf5_sf,pf0vf6_sf,pf0vf7_sf,pf0vf8_sf,pf0vf9_sf type swp nv set interface pf0vf0_sf,pf0vf10_sf,pf0vf11_sf,pf0vf12_sf,pf0vf13_sf,pf0vf1_sf,pf0vf2_sf,pf0vf3_sf,pf0vf4_sf,pf0vf5_sf,pf0vf6_sf,pf0vf7_sf,pf0vf8_sf,pf0vf9_sf bridge domain br_default access 50 nv set interface pf0hpf_sf,pf1hpf_sf bridge domain br_default access 60 nv set nve vxlan arp-nd-suppress on nv set nve vxlan enable on nv set nve vxlan source address 10.10.10.11 nv set vrf default router bgp peer-group underlay remote-as external nv set vrf default router bgp neighbor p0_sf peer-group underlay nv set vrf default router bgp neighbor p1_sf peer-group underlay nv set router bgp autonomous-system 65111 nv set router bgp enable on nv set router bgp router-id 10.10.10.11 nv set router policy route-map LOOPBACK rule 1 action permit nv set router policy route-map LOOPBACK rule 1 match interface lo nv set system global anycast-mac 44:38:39:BE:EF:AA 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 l2vpn-evpn enable on nv set vrf default router bgp enable on nv set vrf default router bgp neighbor p0_sf type unnumbered nv set vrf default router bgp neighbor p1_sf type unnumbered nv set vrf default router bgp path-selection multipath aspath-ignore on nv set vrf default router bgp peer-group underlay address-family ipv4-unicast policy outbound route-map LOOPBACK nv set vrf default router bgp peer-group underlay address-family ipv4-unicast soft-reconfiguration on nv set vrf default router bgp peer-group underlay address-family l2vpn-evpn enable on nv config apply -ynv set bridge domain br_default vlan 50 vni 10050 nv set bridge domain br_default vlan 60 vni 10060 nv set evpn enable on nv set interface lo ip address 10.10.10.12/32 nv set interface p0_sf,p1_sf link state up nv set interface p0_sf,p1_sf,pf0hpf_sf,pf0vf0_sf,pf0vf10_sf,pf0vf11_sf,pf0vf12_sf,pf0vf13_sf,pf0vf1_sf,pf0vf2_sf,pf0vf3_sf,pf0vf4_sf,pf0vf5_sf,pf0vf6_sf,pf0vf7_sf,pf0vf8_sf,pf0vf9_sf type swp nv set interface pf0vf0_sf,pf0vf10_sf,pf0vf11_sf,pf0vf12_sf,pf0vf13_sf,pf0vf1_sf,pf0vf2_sf,pf0vf3_sf,pf0vf4_sf,pf0vf5_sf,pf0vf6_sf,pf0vf7_sf,pf0vf8_sf,pf0vf9_sf bridge domain br_default access 50 nv set interface pf0hpf_sf,pf1hpf_sf bridge domain br_default access 60 nv set nve vxlan arp-nd-suppress on nv set nve vxlan enable on nv set nve vxlan source address 10.10.10.12 nv set vrf default router bgp peer-group underlay remote-as external nv set vrf default router bgp neighbor p0_sf peer-group underlay nv set vrf default router bgp neighbor p1_sf peer-group underlay nv set router bgp autonomous-system 65112 nv set router bgp enable on nv set router bgp router-id 10.10.10.12 nv set router policy route-map LOOPBACK rule 1 action permit nv set router policy route-map LOOPBACK rule 1 match interface lo nv set system global anycast-mac 44:38:39:BE:EF:AA 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 l2vpn-evpn enable on nv set vrf default router bgp enable on nv set vrf default router bgp neighbor p0_sf type unnumbered nv set vrf default router bgp neighbor p1_sf type unnumbered nv set vrf default router bgp path-selection multipath aspath-ignore on nv set vrf default router bgp peer-group underlay address-family ipv4-unicast policy outbound route-map LOOPBACK nv set vrf default router bgp peer-group underlay address-family ipv4-unicast soft-reconfiguration on nv set vrf default router bgp peer-group underlay address-family l2vpn-evpn enable on nv config apply -ynv set bridge domain br_default vlan 50 vni 10050 nv set bridge domain br_default vlan 60 vni 10060 nv set evpn enable on nv set interface lo ip address 10.10.10.13/32 nv set interface p0_sf,p1_sf link state up nv set interface p0_sf,p1_sf,pf0hpf_sf,pf0vf0_sf,pf0vf10_sf,pf0vf11_sf,pf0vf12_sf,pf0vf13_sf,pf0vf1_sf,pf0vf2_sf,pf0vf3_sf,pf0vf4_sf,pf0vf5_sf,pf0vf6_sf,pf0vf7_sf,pf0vf8_sf,pf0vf9_sf type swp nv set interface pf0vf0_sf,pf0vf10_sf,pf0vf11_sf,pf0vf12_sf,pf0vf13_sf,pf0vf1_sf,pf0vf2_sf,pf0vf3_sf,pf0vf4_sf,pf0vf5_sf,pf0vf6_sf,pf0vf7_sf,pf0vf8_sf,pf0vf9_sf bridge domain br_default access 50 nv set interface pf0hpf_sf,pf1hpf_sf bridge domain br_default access 60 nv set nve vxlan arp-nd-suppress on nv set nve vxlan enable on nv set nve vxlan source address 10.10.10.13 nv set vrf default router bgp peer-group underlay remote-as external nv set vrf default router bgp neighbor p0_sf peer-group underlay nv set vrf default router bgp neighbor p1_sf peer-group underlay nv set router bgp autonomous-system 65113 nv set router bgp enable on nv set router bgp router-id 10.10.10.13 nv set router policy route-map LOOPBACK rule 1 action permit nv set router policy route-map LOOPBACK rule 1 match interface lo nv set system global anycast-mac 44:38:39:BE:EF:AA 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 l2vpn-evpn enable on nv set vrf default router bgp enable on nv set vrf default router bgp neighbor p0_sf type unnumbered nv set vrf default router bgp neighbor p1_sf type unnumbered nv set vrf default router bgp path-selection multipath aspath-ignore on nv set vrf default router bgp peer-group underlay address-family ipv4-unicast policy outbound route-map LOOPBACK nv set vrf default router bgp peer-group underlay address-family ipv4-unicast soft-reconfiguration on nv set vrf default router bgp peer-group underlay address-family l2vpn-evpn enable on nv config apply -y -
您可以退出回到主机,并通过高速接口 ping 主机来验证它们之间的连通性:
服务器控制台
$ ping 172.60.0.11 $ ping 172.60.0.12 $ ping 172.60.0.13
部署 Kubernetes
现在我们将使用 kubespray 在主机上部署 Kubernetes。
-
在部署节点上(主节点也可用作部署节点),运行:
部署节点控制台(使用主节点)
$ cd ~ $ sudo apt -y install python3-pip jq $ wget https://github.com/kubernetes-sigs/kubespray/archive/refs/tags/v2.22.0.tar.gz $ tar -zxf v2.20.0.tar.gz $ cd kubespray-2.20.0 $ sudo pip3 install -r requirements.txt -
为三个节点创建初始集群配置。我们使用分配给 DPU 接口的地址。高速网络用于 Kubernetes 集群的主网络和辅助网络:
部署节点控制台(使用主节点)
$ cp -rfp inventory/sample inventory/mycluster $ declare -a IPS=(172.60.0.11 172.60.0.12 172.60.0.13) $ CONFIG_FILE=inventory/mycluster/hosts.yaml python3 contrib/inventory_builder/inventory.py ${IPS[@]} -
按如下方式编辑主机列表:
部署节点控制台(使用主节点)
$ vi inventory/mycluster/hosts.yaml all: hosts: master: ansible_host: 172.60.0.11 ip: 172.60.0.11 access_ip: 172.60.0.11 worker1: ansible_host: 172.60.0.12 ip: 172.60.0.12 access_ip: 172.60.0.12 worker2: ansible_host: 172.60.0.13 ip: 172.60.0.13 access_ip: 172.60.0.13 children: kube_control_plane: hosts: master: kube_node: hosts: worker1: worker2: etcd: hosts: master: k8s_cluster: children: kube_control_plane: kube_node: calico_rr: hosts: {} -
编辑 Calico 配置以使用 IP-in-IP:
部署节点控制台(主节点)
使用 NVIDIA DPU 和主机基础网络 (HBN) 的 K8s 集群技术预览
安装 Kubernetes 集群
-
配置 Calico 网络后端(使用主节点):
$ vi inventory/mycluster/group_vars/k8s_cluster/k8s-net-calico.yml calico_network_backend: "bird" calico_ipip_mode: "Always" calico_vxlan_mode: "Never" -
部署集群:
部署节点控制台(使用主节点)
$ ansible-playbook -i inventory/mycluster/hosts.yaml --become --become-user=root cluster.yml -
将工作节点标记为 worker:
主节点控制台
# kubectl label nodes worker1 node-role.kubernetes.io/worker= # kubectl label nodes worker2 node-role.kubernetes.io/worker=
安装 NVIDIA Network Operator
-
在主节点上安装
helm并添加 Mellanox 仓库:主节点控制台
# snap install helm --classic # helm repo add mellanox https://mellanox.github.io/network-operator && helm repo update -
创建
values.yaml文件:# nano values.yaml nfd: enabled: true sriovNetworkOperator: enabled: true deployCR: true ofedDriver: deploy: false nvPeerDriver: deploy: false rdmaSharedDevicePlugin: deploy: false sriovDevicePlugin: deploy: false secondaryNetwork: deploy: true -
安装 operator:
主节点控制台
# helm install -f ./values.yaml -n network-operator --create-namespace --wait mellanox/network-operator --generate-name -
验证安装:
主节点控制台
# kubectl -n network-operator get pods -
创建
policy.yaml文件:# nano policy.yaml apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: mlnxnic namespace: network-operator spec: nodeSelector: feature.node.kubernetes.io/custom-rdma.capable: "true" resourceName: mlnxnet priority: 99 mtu: 9000 numVfs: 16 nicSelector: pfNames: [ "ens2f0np0" ] deviceType: netdevice isRdma: true -
应用它:
主节点控制台
# kubectl apply -f policy.yaml -
创建
network.yaml文件:# nano network.yaml apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetwork metadata: name: mlnx-network namespace: network-operator spec: ipam: | { "datastore": "kubernetes", "kubernetes": { "kubeconfig": "/etc/cni/net.d/whereabouts.d/whereabouts.kubeconfig" }, "log_file": "/tmp/whereabouts.log", "log_level": "debug", "type": "whereabouts", "range": "172.50.0.0/24" } networkNamespace: default resourceName: mlnxnet -
应用它:
主节点控制台
# kubectl apply -f network.yaml -
等待几分钟让配置完成,然后验证网络及其资源:
主节点控制台
# kubectl get network-attachment-definitions.k8s.cni.cncf.io # kubectl get node worker1 -o json | jq '.status.allocatable' # kubectl get node worker2 -o json | jq '.status.allocatable'警告:如果需要进行固件配置更改,可能需要对服务器执行完全断电重启。
验证部署
运行测试 DaemonSet
在主节点上:
-
创建以下
yaml文件:# nano testds.yaml apiVersion: apps/v1 kind: DaemonSet metadata: name: example-daemon labels: app: example-ds spec: selector: matchLabels: app: example-ds template: metadata: labels: app: example-ds annotations: k8s.v1.cni.cncf.io/networks: mlnx-network spec: containers: - image: ubuntu name: example-ds-pod securityContext: capabilities: add: [ "IPC_LOCK" ] resources: limits: memory: 16Gi cpu: 8 nvidia.com/mlnxnet: '1' requests: memory: 16Gi cpu: 8 nvidia.com/mlnxnet: '1' command: - sleep - inf -
然后创建部署:
主节点控制台
# kubectl create -f testds.yaml
运行 TCP 吞吐量测试
现在,我们将在不同工作节点上运行的 Pod 之间的高速辅助网络上运行 TCP 吞吐量测试。
打开另一个终端窗口连接到主节点,并连接到每个 Pod:
-
检查 Pod 的名称:
主节点控制台
# kubectl get pods -
连接到目标 Pod:
主节点控制台
# kubectl exec -it <pod-name> -- bash -
在高速辅助网络上安装并运行
iperfTCP 测试:第一个 Pod 控制台
# apt update # apt install iproute2 iperf -y -
检查第一个 Pod 在高速辅助网络 net1 上的 IP 地址:
第一个 Pod 控制台
# ip addr -
在其上运行
iperf:第一个 Pod 控制台
# iperf -s -
在第二个 Pod 上安装
iperf并以客户端模式运行,连接到第一个 Pod:第二个 Pod 控制台
# apt update # apt install iperf -y # iperf -c <server-address> -P 10完成!
作者
![]() |
Shachar DorShachar Dor 在加入解决方案实验室团队之前,曾在 NVIDIA Networking(前 Mellanox Technologies)担任软件架构师超过十年,负责网络管理产品和解决方案的架构。Shachar 专注于网络技术,特别是网络启动、配置、监控和生命周期管理。Shachar 在加入公司之前,通过参与多个项目和技术的开发,拥有扎实的软件架构、设计和编程背景。 |



