配置 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 物理 NIC enp5s0f1 的 PCI 地址。
-
0000:05:00 .0:SR-IOV 物理 NIC enp5s0f0 的 PCI 地址。
-
sriov_totalvfs:支持的 VF 数量。
-
sriov_numvfs:当前 VF 数量。
-
-
执行以下命令查看物理机的 NIC 信息。
-
执行命令
ethtool -i <NIC 名称>获取对应物理 NIC 的 PCI 地址,如下所示。 -
执行以下命令创建 VF。本文档以配置 enp5s0f1 NIC 为例,若需虚拟化多个 NIC,需全部配置。
-
执行以下命令检查 VF 是否创建成功。
注意:可看到配置的 8 个 VF 地址,如
05:10.1,这些 VF 地址需补充 域标识符,最终格式为:0000:05:10.1。
绑定 VFIO 驱动
-
下载 绑定脚本,执行
python3 dpdk-devbind.py -b vfio-pci <带域标识符的 VF 地址>命令,将 enp5s0f1 NIC 的 8 个 VF 绑定到 vfio-pci 驱动,示例如下。 -
绑定成功后,执行以下命令检查绑定结果。在输出结果的 Network devices using DPDK-compatible driver 区域查找已绑定的 VF,其中 VF 设备 ID 为
10ed。
部署 Multus CNI 插件
-
进入 平台管理。
-
在左侧导航栏点击 集群管理 > 集群。
-
点击虚拟机集群名称,切换到 插件 标签页。
- 部署 Multus CNI 插件。
部署 sriov-network-operator
执行以下命令部署 sriov-network-operator。
为物理节点设置节点角色标识标签
注意:执行此操作前,确保 sriov-network-operator 的 Pod 正常运行。
-
进入 平台管理。
-
在左侧导航栏点击 集群管理 > 集群。
-
点击集群名称,切换到 节点 标签页。
-
点击支持 SR-IOV 的物理节点 ⋮ > 更新节点标签。
-
设置节点标签如下:
node-role.kubernetes.io/worker: ""
-
点击 更新。
检查资源是否创建成功
在 CLI 工具中执行命令 kubectl -n cpaas-system get sriovnetworknodestates,检查是否成功创建 sriovnetworknodestates 资源。若看到如下类似输出,表示创建成功。若资源创建失败,请检查 Multus CNI 插件和 sriov-network-operator 是否部署成功。
为物理节点设置 SR-IOV 节点特性标签
注意:执行此操作前,确保 sriovnetworknodestates 资源已成功创建。
-
进入 平台管理。
-
在左侧导航栏点击 集群管理 > 集群。
-
点击集群名称,切换到 节点 标签页。
-
点击支持 SR-IOV 的物理节点 ⋮ > 更新节点标签。
-
设置节点标签如下:
feature.node.kubernetes.io/network-sriov.capable: "true"
检查 NIC 设备支持情况
-
执行命令
lspci -n -s <带域标识符的 VF 地址>,获取当前 NIC 设备的厂商 ID 和设备 ID,如下所示。输出说明:
- 8086:厂商 ID。
- 154d:设备 ID。
-
执行命令
lspci -s <带域标识符的 VF 地址> -vvv | grep Ethernet,获取当前 NIC 名称,如下所示。 -
在 cpaas-system 命名空间中,找到名为
supported-nic-ids的 ConfigMap 类型配置文件,检查其 data 部分是否包含当前 NIC 的配置信息。 -
以
<NIC 名称>: <厂商 ID> <设备 ID> <VF 设备 ID>格式将当前 NIC 添加到支持列表的 data 部分,如下所示。参数配置说明:
- Intel_Corporation_X520:NIC 名称,可自定义。
- 8086:厂商 ID。
- 154d:设备 ID。
- 10ed:VF 设备 ID,可在绑定结果中查看。
配置 IP 地址
登录交换机配置 DHCP(动态主机配置协议)。
注意:若无法使用 DHCP,请在虚拟机中手动配置 IP 地址。
结果验证
-
进入 容器平台。
-
在左侧导航栏点击 虚拟化 > 虚拟机。
-
点击 创建虚拟机,添加辅助网卡时,选择 SR-IOV 作为 网络类型。
-
完成虚拟机创建。
-
通过 VNC 访问虚拟机,应该能看到 eth1 成功获取 IP 地址,表示配置成功。
相关说明
CentOS 虚拟机内核参数配置
CentOS 虚拟机使用 SR-IOV 网卡后,需要修改对应 NIC 的内核参数,具体步骤如下。
-
打开终端,执行以下命令修改对应 NIC 的内核参数。将命令中的
<NIC 名称>替换为实际 NIC 名称。 -
执行以下命令加载并应用 /etc/sysctl.conf 文件中的所有内核参数命令,使内核配置生效。输出信息中值为 2 表示修改成功。
输出信息: