配置 SR-IOV
通过配置物理服务器节点支持创建带有 SR-IOV(Single Root I/O Virtualization)网卡的虚拟机,实现虚拟机的更低延迟,同时支持独立 IPv6 以及双栈 IPv4/IPv6 功能。
术语
约束与限制
SR-IOV 功能依赖于 glibc,仅支持 glibc 版本 2.34 及以上。但 Kylin V10 和 CentOS 7.x 操作系统均不支持该版本,因此这两种操作系统无法使用 SR-IOV 功能。
前提条件
获取以下 charts 和镜像并上传至镜像仓库。本文档以仓库地址 build-harbor.example.cn 为例。具体获取 charts 和镜像的方法,请联系相关人员。
Chart
build-harbor.example.cn/example/chart-sriov-network-operator:v3.15.0
镜像
build-harbor.example.cn/3rdparty/sriov/sriov-network-operator:4.13build-harbor.example.cn/3rdparty/sriov/sriov-network-operator-config-daemon:4.13build-harbor.example.cn/3rdparty/sriov/sriov-cni:4.13build-harbor.example.cn/3rdparty/sriov/ib-sriov-cni:4.13build-harbor.example.cn/3rdparty/sriov/sriov-network-device-plugin:4.13build-harbor.example.cn/3rdparty/sriov/network-resources-injector:4.13build-harbor.example.cn/3rdparty/sriov/sriov-network-operator-webhook:4.13build-harbor.example.cn/3rdparty/kubectl:v3.15.1
操作步骤
注意:以下所有命令均在终端执行。
在物理机 BIOS 中启用 SR-IOV
配置前,使用以下命令查看主板信息。
BIOS 中启用 SR-IOV 的操作因服务器厂商不同而异,请参考对应厂商文档。一般步骤如下:
-
重启服务器。
-
BIOS POST 期间屏幕显示品牌 Logo 时,按 F2 键进入系统设置。
-
点击 Processor Settings > Virtualization Technology,将 Virtualization Technology 设置为
Enabled。 -
点击 Settings > Integrated devices,将 SR-IOV Global Enable 设置为
Enabled。 -
保存配置并重启服务器。
启用 IOMMU
启用 IOMMU 的操作因操作系统不同而异,请参考对应操作系统文档。本文档以 CentOS 为例。
-
编辑
/etc/default/grub文件,在GRUB_CMDLINE_LINUX配置项中添加intel_iommu=on iommu=pt。 -
执行以下命令生成
grub.cfg文件。 -
重启服务器。
-
执行以下命令,若输出包含
IOMMU enabled,则表示启用成功。
在系统内核加载 VFIO 模块
-
执行以下命令加载 vfio-pci 模块。
-
加载后执行以下命令,若能正常显示配置信息,则表示 VFIO 内核模块加载成功。
创建 VF 设备
-
执行以下命令查看当前支持的 VF 设备。
输出信息说明:
-
0000:05:00 .1:SR-IOV 物理网卡 enp5s0f1 的 PCI 地址。
-
0000:05:00 .0:SR-IOV 物理网卡 enp5s0f0 的 PCI 地址。
-
sriov_totalvfs:支持的 VF 数量。
-
sriov_numvfs:当前 VF 数量。
-
-
执行以下命令查看物理机的网卡信息。
-
执行命令
ethtool -i <NIC name>获取对应物理网卡的 PCI 地址,如下所示。 -
执行以下命令创建 VF。本文档以配置 enp5s0f1 网卡为例,若需虚拟化多个网卡,则需全部配置。
-
执行以下命令检查 VF 是否创建成功。
注意:可看到配置的 8 个 VF 地址,如
05:10.1,这些 VF 地址需补充 Domain Identifier,最终格式为:0000:05:10.1。
绑定 VFIO 驱动
-
下载 绑定脚本,执行
python3 dpdk-devbind.py -b vfio-pci <带域标识的 VF 地址>命令,将 enp5s0f1 网卡的 8 个 VF 绑定到 vfio-pci 驱动,示例如下。 -
绑定成功后,执行以下命令检查绑定结果。在输出结果的 Network devices using DPDK-compatible driver 区域查找已绑定的 VF,其中 VF 设备 ID 为
10ed。
部署 Multus CNI 插件
-
进入 Administrator。
-
在左侧导航栏点击 Cluster Management > Clusters。
-
点击虚拟机集群名称,切换到 Plugins 标签页。
- 部署 Multus CNI 插件。
部署 sriov-network-operator
执行以下命令部署 sriov-network-operator。
为物理节点设置 Node Role 标识标签
注意:执行此操作前,确保 sriov-network-operator 的 Pod 正常运行。
-
进入 Administrator。
-
在左侧导航栏点击 Cluster Management > Clusters。
-
点击集群名称,切换到 Nodes 标签页。
-
点击支持 SR-IOV 的物理节点 ⋮ > Update Node Labels。
-
设置节点标签如下:
node-role.kubernetes.io/worker: ""
-
点击 Update。
检查资源是否创建成功
在 CLI 工具中执行命令 kubectl -n cpaas-system get sriovnetworknodestates,检查是否成功创建了 sriovnetworknodestates 资源。如果看到如下类似输出,表示创建成功。若资源创建失败,请检查 Multus CNI 插件和 sriov-network-operator 是否部署成功。
为物理节点设置 SR-IOV 节点特性标签
注意:执行此操作前,确保已成功创建 sriovnetworknodestates 资源。
-
进入 Administrator。
-
在左侧导航栏点击 Cluster Management > Clusters。
-
点击集群名称,切换到 Nodes 标签页。
-
点击支持 SR-IOV 的物理节点 ⋮ > Update Node Labels。
-
设置节点标签如下:
feature.node.kubernetes.io/network-sriov.capable: "true"
检查网卡设备支持情况
-
执行命令
lspci -n -s <带域标识的 VF 地址>获取当前网卡设备的厂商 ID 和设备 ID,如下所示。输出说明:
- 8086:厂商 ID。
- 154d:设备 ID。
-
执行命令
lspci -s <带域标识的 VF 地址> -vvv | grep Ethernet获取当前网卡名称,如下所示。 -
在 cpaas-system 命名空间中,找到名为
supported-nic-ids的 ConfigMap 配置文件,检查其 data 部分是否包含当前网卡的配置信息。 -
以
<NIC 名称>: <厂商 ID> <设备 ID> <VF 设备 ID>格式,将当前网卡添加到支持列表的 data 部分,如下所示。参数配置说明:
- Intel_Corporation_X520:网卡名称,可自定义。
- 8086:厂商 ID。
- 154d:设备 ID。
- 10ed:VF 设备 ID,可在绑定结果中找到。
配置 IP 地址
登录交换机配置 DHCP(动态主机配置协议)。
注意:若无法使用 DHCP,请在虚拟机中手动配置 IP 地址。
结果验证
-
进入 Container Platform。
-
在左侧导航栏点击 Virtualization > Virtual Machines。
-
点击 Create Virtual Machine,添加辅助网卡时,选择 SR-IOV 作为 Network Type。
-
完成虚拟机创建。
-
通过 VNC 访问虚拟机,应该能看到 eth1 成功获取 IP 地址,表示配置成功。
相关说明
CentOS 虚拟机内核参数配置
CentOS 虚拟机使用 SR-IOV 网卡后,需要修改对应网卡的内核参数,具体步骤如下。
-
打开终端,执行以下命令修改对应网卡的内核参数。将命令中的
<NIC Name>替换为实际网卡名称。 -
执行以下命令加载并应用 /etc/sysctl.conf 文件中的所有内核参数命令,使内核配置生效。输出信息中的值为 2 表示修改成功。
输出信息: