使用 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 的支持也将在未来版本中添加。

参考文献

解决方案架构

逻辑设计

HBN.png

我们的部署使用 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 物理端口的替代方案。

interfaces.png

设备 描述 接口 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_sfp1_sf
Worker 1 HBN Worker1 节点 DPU 上的 HBN 10.10.10.12/32 65112 到叶:p0_sfp1_sf
Worker 2 HBN Worker2 节点 DPU 上的 HBN 10.10.10.13/32 65113 到叶:p0_sfp1_sf

VTEP 配置:

VTEP 接口 VLAN VNI
Leaf1 swp30 60 10060
HBN (任意) pf0vf0_sf - pf0vf15_sf 50 10050
HBN (任意) pf0hpf_sf 60 10060

软件栈组件

hbn-sw-stack.png

物料清单

bom.png

部署与配置

配置网络交换机

  • 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

主机准备

  1. 在服务器上安装 Ubuntu 22.04 并确保其已更新至最新版本:

    服务器控制台

    $ sudo apt update
    $ sudo apt upgrade
    $ sudo reboot
    
  2. 为允许免密码 sudo,在每个主机上将本地用户添加到 sudoers 文件:

    服务器控制台

    $ sudo vi /etc/sudoers
    
    #includedir /etc/sudoers.d
    #K8s集群部署用户,具有免密码sudo权限
    user ALL=(ALL) NOPASSWD:ALL
    
  3. 在部署节点上生成 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
    
  4. 现在尝试登录该机器,并验证无需密码即可登录。

部署 BFB

  1. DOCA 网页 下载 DOCA 主机驱动程序包,向下滚动到页面底部并选择相关包。它将安装从主机访问和安装 DPU 所需的所有必要软件。

    doca-host.png

  2. 安装下载的 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
    
  3. 下载 BFB 4.0.3(含 DOCA 2.0.2v2):

    bfb.png

  4. 创建配置文件 bf.cfg

    服务器控制台

    # echo 'ENABLE_SFC_HBN=yes' > bf.cfg
    
  5. 安装 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
    
  6. 安装完成后,对服务器执行完全断电重启,以便 DPU 固件在需要时重新启动和升级。

  7. 服务器重启后,使用 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
    
  8. 应用设置:

    服务器控制台

    # netplan apply
    

安装 DOCA 容器配置包

通过以下方式之一登录 DPU:

  • 使用 OOB 管理接口(如果已连接并通过 DHCP 获取 IP 地址)
  • 使用通过 RShim 的内置网络接口(tmfifo_net0

本示例使用 RShim 选项:

  1. 使用以下命令为 tmfifo_net0 接口分配 IP 地址:

    服务器控制台

    # ip address add 192.168.100.1/30 dev tmfifo_net0
    

    首次登录 DPU 时,使用 ubuntu/ubuntu 作为凭据。

  2. 系统会要求您修改密码:

    服务器控制台

    # 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.
    
  3. 登录 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/
  1. 重启 DPU:

    DPU 控制台

    # reboot
    

配置 HBN

DPU 重启后,将运行 "doca-hbn" 容器。

  1. 要查找其 ID(将出现在 CONTAINER 下的第一列),运行:

    DPU 控制台

    # crictl ps
    
  2. 连接到该容器:

    DPU 控制台

    # crictl exec -it <container-id> bash
    
  3. 使用以下 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 -y
    
    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.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 -y
    
    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.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
    
  4. 您可以退出回到主机,并通过高速接口 ping 主机来验证它们之间的连通性:

    服务器控制台

    $ ping 172.60.0.11
    $ ping 172.60.0.12
    $ ping 172.60.0.13
    

部署 Kubernetes

现在我们将使用 kubespray 在主机上部署 Kubernetes。

  1. 在部署节点上(主节点也可用作部署节点),运行:

    部署节点控制台(使用主节点)

    $ 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
    
  2. 为三个节点创建初始集群配置。我们使用分配给 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[@]}
    
  3. 按如下方式编辑主机列表:

    部署节点控制台(使用主节点)

    $ 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: {}
    
  4. 编辑 Calico 配置以使用 IP-in-IP:

    部署节点控制台(主节点)

使用 NVIDIA DPU 和主机基础网络 (HBN) 的 K8s 集群技术预览

安装 Kubernetes 集群

  1. 配置 Calico 网络后端(使用主节点):

    $ vi inventory/mycluster/group_vars/k8s_cluster/k8s-net-calico.yml
    
    calico_network_backend: "bird"
    calico_ipip_mode: "Always"
    calico_vxlan_mode: "Never"
    
  2. 部署集群:

    部署节点控制台(使用主节点)

    $ ansible-playbook -i inventory/mycluster/hosts.yaml --become --become-user=root cluster.yml
    
  3. 将工作节点标记为 worker:

    主节点控制台

    # kubectl label nodes worker1 node-role.kubernetes.io/worker=
    # kubectl label nodes worker2 node-role.kubernetes.io/worker=
    

安装 NVIDIA Network Operator

  1. 在主节点上安装 helm 并添加 Mellanox 仓库:

    主节点控制台

    # snap install helm --classic
    # helm repo add mellanox https://mellanox.github.io/network-operator && helm repo update
    
  2. 创建 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
    
  3. 安装 operator:

    主节点控制台

    # helm install -f ./values.yaml -n network-operator --create-namespace --wait mellanox/network-operator --generate-name
    
  4. 验证安装:

    主节点控制台

    # kubectl -n network-operator get pods
    
  5. 创建 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
    
  6. 应用它:

    主节点控制台

    # kubectl apply -f policy.yaml
    
  7. 创建 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
    
  8. 应用它:

    主节点控制台

    # kubectl apply -f network.yaml
    
  9. 等待几分钟让配置完成,然后验证网络及其资源:

    主节点控制台

    # 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

在主节点上:

  1. 创建以下 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
    
  2. 然后创建部署:

    主节点控制台

    # kubectl create -f testds.yaml
    

运行 TCP 吞吐量测试

现在,我们将在不同工作节点上运行的 Pod 之间的高速辅助网络上运行 TCP 吞吐量测试。

打开另一个终端窗口连接到主节点,并连接到每个 Pod:

  1. 检查 Pod 的名称:

    主节点控制台

    # kubectl get pods
    
  2. 连接到目标 Pod:

    主节点控制台

    # kubectl exec -it <pod-name> -- bash
    
  3. 在高速辅助网络上安装并运行 iperf TCP 测试:

    第一个 Pod 控制台

    # apt update
    # apt install iproute2 iperf -y
    
  4. 检查第一个 Pod 在高速辅助网络 net1 上的 IP 地址:

    第一个 Pod 控制台

    # ip addr
    
  5. 在其上运行 iperf

    第一个 Pod 控制台

    # iperf -s
    
  6. 在第二个 Pod 上安装 iperf 并以客户端模式运行,连接到第一个 Pod:

    第二个 Pod 控制台

    # apt update
    # apt install iperf -y
    # iperf -c <server-address> -P 10
    

    完成!

作者

SD.jpg Shachar DorShachar Dor 在加入解决方案实验室团队之前,曾在 NVIDIA Networking(前 Mellanox Technologies)担任软件架构师超过十年,负责网络管理产品和解决方案的架构。Shachar 专注于网络技术,特别是网络启动、配置、监控和生命周期管理。Shachar 在加入公司之前,通过参与多个项目和技术的开发,拥有扎实的软件架构、设计和编程背景。