Cenots7.8 openstack rocky及mellanox cx5智能网卡基础环境搭建

发布时间 2023-09-28 16:04:21作者: stephigher

一.网卡SRIOV及虚拟化配置

1. Mellanox 网卡SRIOV开启配置

网卡安装之后需要到官方网站去下载相关网卡的驱动,然后才能进行下面的配置,本次实验环境使用的是centos7.8,自带了Mellanox CX系列网卡的驱动。

 

所以网卡驱动安装的部分先不涉及,需要下载的可以到nvdia的官方网站去下载:

https://www.mellanox.com/products/ethernet-drivers/linux/mlnx_en

本次实验搭建采用的是浪潮服务器,开启SRIOV需要以下几个步骤:

1.1 BIOS 设置虚拟化支持

 为了支持SRIOV首先要再BIOS中使能虚拟化相关的配置,在开启启动时候进行虚拟化支持的开关打开。

 

 

 

 

 

 

1.2 IOMMU支持配置

开启操作系统支持IOMMU的功能,

修改/etc/default/grub 文件

 

GRUB_TIMEOUT=5

GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"

GRUB_DEFAULT=saved

GRUB_DISABLE_SUBMENU=true

GRUB_TERMINAL_OUTPUT="console"

GRUB_CMDLINE_LINUX="crashkernel=auto spectre_v2=retpoline rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet intel_iommu=on iommu=pt"

GRUB_DISABLE_RECOVERY="true"

~

GRUB_CMDLINE_LINUX 这一行的最后添加intel_iommu=on iommu=pt

修改后保存,要将配置写入引导。

注意配置写入的时候一定要注意区分当前BIOS的引导是UEFI还是legacy模式。

UEFI模式:

grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

Legacy模式:

grub2-mkconfig -o /boot/grub2/grub.cfg

模式不同如果选择的方式错误,会导致IOMMU开启失败。写入配置之后设备进行重启,重启之后执行如下命令查询配置是否生效。

[root@controller ml2]# cat /proc/cmdline

BOOT_IMAGE=/vmlinuz-3.10.0-1160.6.1.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto spectre_v2=retpoline rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet intel_iommu=on iommu=pt

[root@controller ml2]#

1.1 SRIOV的参数配置

先确定支持SRIOV配置的网卡,通过lspci命令查询到网卡

[root@controller ml2]# lspci | grep Eth

1a:00.0 Ethernet controller: Intel Corporation Ethernet Connection X722 for 1GbE (rev 09)

 

1a:00.1 Ethernet controller: Intel Corporation Ethernet Connection X722 for 1GbE (rev 09)

 

1a:00.2 Ethernet controller: Intel Corporation Ethernet Connection X722 for 1GbE (rev 09)

 

1a:00.3 Ethernet controller: Intel Corporation Ethernet Connection X722 for 1GbE (rev 09)

 

3b:00.0 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01)

 

3b:00.1 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01)

 

af:00.0 Ethernet controller: Mellanox Technologies MT27800 Family [ConnectX-5]

确定网卡的接口名称:

将配置写入网卡,本次只创建了一个VF,所以只写入1.如果需要创建多个VF需要写入对应的数字。

echo '1' > /sys/class/net/enp175s0/device/sriov_numvfs

 

写入之后执行如下命令查询写入的结果:

[root@controller ml2]#cat /sys/class/net/enp175s0/device/sriov_totalvfs

1

查询VF创建情况:

[root@controller ml2]# ip link show enp175s0

7: enp175s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000

    link/ether 0c:42:a1:b3:2e:dc brd ff:ff:ff:ff:ff:ff

    vf 0 MAC fa:11:3c:47:ad:d5, spoof checking off, link-state auto, trust off, query_rss off

二.Openstack私有云环境部署

1. Openstack Rocky版本安装

本次卸载实验基于Rocky版本,之前整理过一个ubutun环境下的openstack Queen的安装手册,由于基础环境不同,很多配置有差异。再整理一份centos的配置文件。

1.基础环境配置

本次卸载采用的是overlayvxlan封装解封装,所以搭建的是overlay 租户网络类型是vxlan

 

 

不需要外部网络访问,所以采用双网卡,一个作为openstack的管理通道,另一个作为host之间的数据通道。

openstack的安装过程如果纯手工安装,过程及其的繁琐,而且非常容易出错,考虑到安装的复杂性及繁琐易错,我把安装过程用shell脚本进行了编写,参考了官方的openstack devstack的部分代码,脚本实现了租户网络为vxlan网络的openstack的部署,会脚本中会根据系统进行自动检查安装对应的openstack官方版本。

具体的代码可以到我的gitee中去下载,具体的使用可以参考脚本的配置说明。

https://gitee.com/blueGitRepo/falcon.git

配置完控制节点和计算节点的相关参数后,在控制节点和计算节点先后执行install脚本,等待安装完成即可。

云平台部署完成之后,下面进行智能网卡相关配置,也是参考了openstack官方链接进行配置的。

三.智能网卡卸载配置

1. 网卡SRIOV及ovs卸载配置

此步骤与文章开始部分相同,如果前面配置过,此部分就不需要重复配置

1.1 SRIOV开启

在计算节点开启sriov,执行

echo 1 > /sys/class/net/enp175s0/device/sriov_numvfs

cat /sys/class/net/enp175s0/device/sriov_totalvfs

执行ip link show enp175s0

 

 

 

 

本次实验仅开启了一个vf。

 

 

1.2 VF设置及PF offload配置

配置网卡的模式为switchdev模式,并支持offload

解绑定VF

echo 0000:af:00.1 > /sys/bus/pci/drivers/mlx5_core/unbind

修改PF的eswitch模式

devlink dev eswitch set pci/0000:af:00.0 mode switchdev

 ethtool -K enp175s0 hw-tc-offload on

 echo 0000:af:00.1 > /sys/bus/pci/drivers/mlx5_core/bind

1.3 配置之后

devlink dev eswitch show pci/0000:af:00.0

 

[root@controller openvswitch-2.11.1]# devlink dev eswitch show pci/0000:af:00.0

pci/0000:af:00.0: mode switchdev inline-mode none encap enable

配置switchdev之后会在设备上生成对应的VF的representor接口

Eth0为对应的VF生成的vf-Rep接口。

ls -l /sys/class/net/

查看vf接口的对应关系

 

1.4 Openstack neutron支持SRIOV的Passthrough配置

本次搭建的openstack设置的租户网络类型为vxlan类型。所以对应的设置都和vxlan的配置相关。

 

 

          4.修改/etc/nova/nova.conf on compute nodes

         [pci]

             passthrough_whitelist = {"address":":af:00.","physical_network":null}

 

配置完成之后在计算节点和控制节点分别重启以下服务

 

计算节点:

 

[root@computer1 ~]# systemctl restart openstack-nova-compute.service

 

控制器节点:

 

[root@controller ~]# systemctl restart openstack-nova-scheduler.service

 

[root@controller ~]# systemctl restart neutron-server.service

注意:此处大坑,如果是centos7系列,请关闭networkManger的服务,该服务会导致ovs下发到VF_REP接口上的的tc qdisc规则被删除,导致卸载失败。在无人指导的情况下,在坑中爬了2 周,苦苦思索,看日志看到头昏,毫无头绪,官方论坛发帖请教,无人知晓,最后通过重编译linux内核代码,在tc的模块中加日志才找到原因。

配置ovs执行卸载

ovs-vsctl set Open_vSwitch . Other_config:hw-offload=true

1.5 网络及端口创建

  1. 创建一个network,端口安全先做关闭

  2. 创建subnet,此部分参考openstack的命令
  3. 创建端口,管理创建的网络 openstack port create --network smart --vnic-type=direct --binding-profile '{"capabilities": ["switchdev"]}' direct_port1

 

 

        创建完成后在openstack dashborad中查询:

        

     基于该port创建实例1

      openstack server create --flavor m1.medium --image centos7 --nic  port-id=direct_port1  --availability-zone nova vm1  

   创建另一个port

   openstack port create --network smart --vnic-type=direct --binding-profile '{"capabilities": ["switchdev"]}' direct_port2

    创建另一个实例:

openstack server create --flavor m1.medium --image centos7 --nic  port-id=direct_port2  --availability-zone nova1 vm2

创建实例如果失败要注意查询下network agent是否离线,确认selinux和防火墙是否关闭,上述vm建立在两个不同的compute 节点上,vm之间通过vxlan网络互通。

     4 验证

登录openstack dashboard 查询两个vm实例

 

两台vm的互ping测试,通过在VF-Representor接口进行抓包

 

 

Icmp已经卸载到网卡,在设备上抓不到报文。

查询ovs的流表卸载情况:

 

[root@controller site-packages]# ovs-dpctl show

 

2021-01-15T08:07:40Z|00001|dpif_netlink|INFO|The kernel module does not support meters.

 

system@ovs-system:

 

  lookups: hit:42730 missed:5059 lost:0

 

  flows: 0

 

  masks: hit:103169 total:0 hit/pkt:2.16

 

  port 0: ovs-system (internal)

 

  port 1: br-tun (internal)

 

  port 2: tapc5531a2d-f5 (internal)

 

  port 3: br-int (internal)

 

  port 4: tapbe3b80ef-de (internal)

 

  port 5: enp175s0_0

 

  port 6: vxlan_sys_4789 (vxlan: packet_type=ptap)

 

[root@controller site-packages]#

 

 

 

[root@controller site-packages]# ovs-dpctl dump-flows type=offloaded

 

2021-01-15T08:07:14Z|00001|dpif_netlink|INFO|The kernel module does not support meters.

 

tunnel(tun_id=0x5f,src=192.168.20.241,dst=192.168.20.242,tp_dst=4789,flags(+key)),in_port(6),eth(src=fa:16:3e:58:c7:02,dst=fa:16:3e:7e:72:26),eth_type(0x0800),ipv4(frag=no), packets:109, bytes:10682, used:0.720s, actions:5

 

tunnel(tun_id=0x5f,src=192.168.20.241,dst=192.168.20.242,tp_dst=4789,flags(+key)),in_port(6),eth(src=fa:16:3e:58:c7:02,dst=fa:16:3e:7e:72:26),eth_type(0x0806), packets:1, bytes:60, used:1.730s, actions:5

 

in_port(5),eth(src=fa:16:3e:7e:72:26,dst=fa:16:3e:58:c7:02),eth_type(0x0800),ipv4(tos=0/0x3,frag=no), packets:109, bytes:16132, used:0.720s, actions:set(tunnel(tun_id=0x5f,src=192.168.20.242,dst=192.168.20.241,tp_dst=4789,flags(key))),6

 

in_port(5),eth(src=fa:16:3e:7e:72:26,dst=fa:16:3e:58:c7:02),eth_type(0x0806), packets:1, bytes:110, used:1.730s, actions:set(tunnel(tun_id=0x5f,src=192.168.20.242,dst=192.168.20.241,tp_dst=4789,flags(key))),6

 

 

 

 

 

 

 

Ovs2.13 采用下面的命令:

 

ovs-appctl dpctl/dump-flows type=offloaded

 

 

 

[root@compute1 neutron]#

 

[root@compute1 neutron]#  ovs-appctl dpctl/dump-flows type=offloaded

 

recirc_id(0),in_port(3),eth(src=fa:16:3e:e9:6a:ad,dst=fa:16:3e:03:f1:71),eth_type(0x0800),ipv4(tos=0/0x3,frag=no), packets:161, bytes:23828, used:0.070s, actions:set(tunnel(tun_id=0x1,src=192.168.20.241,dst=192.168.20.242,ttl=64,tp_dst=4789,flags(key))),4

 

recirc_id(0),in_port(3),eth(src=fa:16:3e:e9:6a:ad,dst=fa:16:3e:03:f1:71),eth_type(0x0806), packets:1, bytes:110, used:2.120s, actions:set(tunnel(tun_id=0x1,src=192.168.20.241,dst=192.168.20.242,ttl=64,tp_dst=4789,flags(key))),4

 

tunnel(tun_id=0x1,src=192.168.20.242,dst=192.168.20.241,tp_dst=4789,flags(+key)),recirc_id(0),in_port(4),eth(src=fa:16:3e:03:f1:71,dst=fa:16:3e:e9:6a:ad),eth_type(0x0800),ipv4(frag=no), packets:161, bytes:15778, used:0.070s, actions:3

 

tunnel(tun_id=0x1,src=192.168.20.242,dst=192.168.20.241,tp_dst=4789,flags(+key)),recirc_id(0),in_port(4),eth(src=fa:16:3e:03:f1:71,dst=fa:16:3e:e9:6a:ad),eth_type(0x0806), packets:1, bytes:60, used:2.120s, actions:3

 

[root@compute1 neutron]#

 

 

经过上述网卡的基本配置,修改openstack nova的passthrough,创建VF端口 进行openstack云主机 vm passthrough,实现了主机之间通信的流表offload到网卡。