如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
SR-IOV 网络设备插件是 Kubernetes 的设备插件,用于发现和公布以下形式的网络资源:
这些资源在 Kubernetes 节点上可用。
要部署使用 SR-IOV VF、辅助网络设备或 PCI PF 的工作负载,此插件需要与以下两个 CNI 组件配合使用:
有关 Kubernetes 中的多网络接口支持,请遵循快速入门。
以下网卡已通过此实现的测试。不过,其他支持 SR-IOV 的网卡也应能正常工作。
在启动 SR-IOV 网络设备插件之前,您需要在系统上创建所需的网络功能。以下文档将指导您完成该过程。
有关构建和安装说明,请参见 https://github.com/k8snetworkplumbingwg/sriov-cni 仓库。支持 SR-IOV CNI 2.0+ 版本。
GitHub
docker pull ghcr.io/k8snetworkplumbingwg/sriov-network-device-plugin:latest
本地构建镜像
make image
[!NOTE] 构建成功后,将创建一个标签为
ghcr.io/k8snetworkplumbingwg/sriov-network-device-plugin:latest的 docker 镜像。您需要在每个节点上构建此镜像。或者,您可以使用本地 docker 仓库来托管此镜像。
部署配置映射
创建定义 SR-IOV 资源池配置的 ConfigMap
[!IMPORTANT] 确保更新 configMap 数据中的 'config.json' 条目,以反映设备插件的资源配置。有关支持的配置参数,请参见配置部分。
kubectl create -f deployments/configMap.yaml
部署守护进程集
kubectl create -f deployments/sriovdp-daemonset.yaml
需要安装兼容的 CNI 元插件,以便 SR-IOV CNI 插件能够获取已分配 VF 的 deviceID 进行配置。
选项 1 - Multus
安装 Multus
请参考 Multus 的https://github.com/k8snetworkplumbingwg/multus-cni#quickstart-installation-guide%E6%9D%A5%E5%AE%89%E8%A3%85 Multus。
网络对象 CRD
Multus 使用自定义资源定义(CRD)来定义额外的网络附件。这些网络附件 CRD 遵循 Kubernetes 网络 Plumbing 工作组(NPWG)定义的标准。有关更多信息,请参考https://github.com/k8snetworkplumbingwg/multus-cni/blob/master/README.md%E3%80%82
kubectl create -f deployments/sriov-crd.yaml
选项 2 - DANM
本节介绍如果选择 DANM 作为元插件,在 Kubernetes 中部署 SR-IOV 网络设备插件的示例。
安装 DANM
有关详细说明,请参考 https://github.com/nokia/danm/blob/master/deployment-guide.md%E3%80%82
创建 SR-IOV 类型网络
DANM 支持基于设备插件(Device Plugin)的动态级别 SR-IOV 配置。有关详细说明,请参阅 https://github.com/nokia/danm/blob/master/user-guide.md%E3%80%82%E6%9C%89%E5%85%B3%E7%A4%BA%E4%BE%8B%E6%B8%85%E5%8D%95%E5%AF%B9%E8%B1%A1%EF%BC%8C%E8%AF%B7%E5%8F%82%E8%80%83 https://github.com/nokia/danm/tree/master/example/device_plugin_demo
请参阅以下部分,了解如何配置和运行 SR-IOV 网络设备插件。
此插件根据与 SR-IOV 网络设备插件关联的配置映射(config map)中提供的配置创建设备插件端点。此文件的 JSON 格式如下所示:
{
"resourceList": [{
"resourceName": "intel_sriov_netdevice",
"selectors": [{
"vendors": ["8086"],
"devices": ["154c", "10ed", "1889"],
"drivers": ["i40evf", "ixgbevf", "iavf"]
}]
},
{
"resourceName": "intel_sriov_dpdk",
"resourcePrefix": "intel.com",
"selectors": [{
"vendors": ["8086"],
"devices": ["154c", "10ed", "1889"],
"drivers": ["vfio-pci"],
"pfNames": ["enp0s0f0","enp2s2f1"],
"needVhostNet": true
}]
},
{
"resourceName": "mlnx_sriov_rdma",
"resourcePrefix": "mellanox.com",
"selectors": [{
"vendors": ["15b3"],
"devices": ["1018"],
"drivers": ["mlx5_ib"],
"isRdma": true
}]
},
{
"resourceName": "infiniband_rdma_netdevs",
"selectors": [{
"linkTypes": ["infiniband"],
"isRdma": true
}]
},
{
"resourceName": "ct6dx_vdpa_vhost",
"selectors": [{
"vendors": ["15b3"],
"devices": ["101e"],
"drivers": ["mlx5_core"],
"vdpaType": "vhost"
}]
},
{
"resourceName": "intel_fpga",
"deviceType": "accelerator",
"selectors": [{
"vendors": ["8086"],
"devices": ["0d90"]
}]
},
{
"resourceName": "bf2_sf",
"resourcePrefix": "nvidia.com",
"deviceType": "auxNetDevice",
"selectors": [{
"vendors": ["15b3"],
"devices": ["a2d6"],
"pfNames": ["p0#1-5"],
"auxTypes": ["sf"]
}]
},
{
"resourceName": "intel_sriov_netdevice_additional_env",
"selectors": [{
"vendors": ["8086"],
"devices": ["154c", "10ed", "1889"],
"drivers": ["i40evf", "ixgbevf", "iavf"]
}],
"additionalInfo": {
"*": {
"token": "3e49019f-412f-4f02-824e-4cd195944205"
}
}
},
{
"resourceName": "brcm_sriov_bnxt",
"resourcePrefix": "broadcom.com",
"selectors": [{
"vendors": ["14e4"],
"devices": ["1750"],
"drivers": ["bnxt_en"]
}],
},
{
"resourceName": "old_selectors_syntax_example",
"selectors": {
"vendors": ["8086"],
"devices": ["154c", "10ed", "1889"],
"drivers": ["i40evf", "ixgbevf", "iavf"]
}
}
]
}
"resourceList" 应包含配置对象列表。每个配置对象可包含以下字段:
| 字段 | 是否必填 | 描述 | 类型/默认值 | 示例/接受值 |
|---|---|---|---|---|
| "resourceName" | Y | 端点资源名称。不应包含特殊字符(包括连字符),且在资源前缀范围内必须唯一 | string | "sriov_net_A" |
| "resourcePrefix" | N | 端点资源前缀名称覆盖。不应包含特殊字符 | string 默认值:"intel.com" | "yourcompany.com" |
| "deviceType" | N | 资源池的设备类型 | 支持类型的字符串值。默认值:"netDevice" | 当前支持值:"accelerator"、"netDevice"、"auxNetDevice" |
| "excludeTopology" | N | 排除设备 NUMA 拓扑的公告 | bool 默认值:"false" | "excludeTopology": true |
| "selectors" | N | 单个设备选择器映射或映射列表。建议使用列表语法。"deviceType" 值决定设备选择器选项。 | JSON 对象列表或 JSON 对象。默认值:null | 示例:"selectors": [{"vendors": ["8086"],"devices": ["154c"]}] |
| "additionalInfo" | N | 用于通过环境变量向设备添加额外信息到 Pod 的映射的映射 | JSON 对象(字符串形式)默认值:null | 示例:"additionalInfo": {"": {"token": "3e49019f-412f-4f02-824e-4cd**"}} |
[!NOTE] "resourceName" 仅需在给定前缀(包括 CLI 参数中全局指定的前缀)范围内保持唯一,例如 "example.com/10G"、"acme.com/10G" 和 "acme.com/40G" 都是完全有效的名称。
设备选择器
"selectors" 字段既接受单个对象,也接受选择器对象列表。虽然两种格式均受支持,但建议使用列表语法。使用列表语法时,每个选择器对象将按列表中的顺序进行计算。例如,单个对象如下所示:
"selectors": {"vendors": ["8086"],"devices": ["154c"]}
列表语法如下所示:
"selectors": [{"vendors": ["8086"],"devices": ["154c"]}, {"vendors": ["8086"], "needVhostNet": true}]
列表语法示例在列表中指定了两个选择器对象。在此示例中,第一个选择器对象指定的所有设备的供应商 ID 为 8086 且设备 ID 为 154c。第二个选择器对象指定所有供应商 ID 为 8086 的设备。由于选择器对象按指定顺序处理,供应商 ID 为 8086 且设备 ID 为 154c 的设备将不会应用 needVhostNet: true。对比另一个类似的示例:
"selectors": [{"vendors": ["8086"], "needVhostNet": true}, {"vendors": ["8086"],"devices": ["154c"]}]
在后一个示例中,选择器对象的顺序已交换。由于第二个对象指定的所有设备也由第一个对象指定,这使得第二个选择器对象无效。
给定的选择器对象包含"selectors"。"deviceType" 值决定该设备支持哪些选择器。每个选择器将按照下面选择器表格中列出的顺序进行计算。
加速器设备选择器
当 "deviceType" 为 "accelerator" 时,这些选择器适用。
| 字段 | 是否必填 | 描述 | 类型/默认值 | 示例/接受值 |
|---|---|---|---|---|
| "vendors" | N | 目标设备的供应商十六进制代码(字符串形式) | string 列表 默认值:null | "vendors": ["8086", "15b3"] |
| "devices" | N | 目标设备的设备十六进制代码(字符串形式) | string 列表 默认值:null | "devices": ["154c", "1889", "1018"] |
| "drivers" | N | 目标设备驱动程序名称(字符串形式) | string 列表 默认值:null | "drivers": ["vfio-pci"] |
| "pciAddresses" | N | 目标设备的 PCI 地址(字符串形式) | string 列表 默认值:null | "pciAddresses": ["0000:03:02.0"] |
| "acpiIndexes" | N | 目标设备的 ACPI 索引(字符串形式) | string 列表 默认值:null | "acpiIndexes": ["101"] |
网络设备选择器
当 "deviceType" 为 "netDevice" 时,这些选择器适用(注意:这是默认值)
AdditionalInfo 字段
此字段定义了一种方法,可将信息添加到 sriov-network-device-plugin 注入容器的环境变量中。
示例:
"additionalInfo": {
"*": {
"token": "3e49019f-412f-4f02-824e-4cd195944205"
}
}
'*' 是一个特殊键,指示设备插件将此信息注入所有与选择器匹配的设备。如果要覆盖特定设备的信息或为其添加更多信息,也可以指定特定的 PCI 地址
"additionalInfo": {
"*": {
"token": "3e49019f-412f-4f02-824e-4cd195944205"
},
"0000:86:00.0": {
"additional-token": "6e7dc135-7a1c-456f-a008-c2cfb37997be"
}
}
分配不同 deviceID 的 Pod 的输出:
{"0000:3b:02.6":{"extraInfo":{"token":"3e49019f-412f-4f02-824e-4cd195944205"}
分配特定 deviceID 的 Pod 的输出:
{"0000:86:00.0":{"extraInfo":{"token":"3e49019f-412f-4f02-824e-4cd195944205","additional-token": "6e7dc135-7a1c-456f-a008-c2cfb37997be"}
当 '*' 和特定 deviceID 变量具有相同的键时,将采用特定的键
"additionalInfo": {
"*": {
"token": "original"
},
"0000:86:00.0": {
"token": "specific"
}
}
分配不同 deviceID 的 Pod 的输出:
{"0000:3b:02.6":{"extraInfo":{"token":"original"}
分配特定 deviceID 的 Pod 的输出:
{"0000:86:00.0":{"extraInfo":{"token":"specific"}
设备插件最初会发现主机中所有PCI网络资源并填充初始“设备列表”。如果设备类型是辅助网络设备(auxNetDevice),则对于每个发现的Netdevice类型PCI设备,插件会发现辅助设备。然后,每个“资源池”会按顺序将其选择器对象应用于发现的设备列表。插件会将满足选择器对象约束的设备添加到资源池中。选择器对象中指定的每个“选择器”都会缩小资源池的设备列表范围。当前,选择器按以下顺序应用:
如果单个设备匹配多个选择器对象,它将仅分配给第一个选择器对象。
“pfNames”和“rootDevices”选择器可用于按以下格式为资源池指定VF/SF的列表和/或范围:
" # , - , , , - "
或
CODE_TOKEN_13`
其中:
- 是PF接口名称
- 是PF PCI地址
- 是包含在池中的单个功能索引(从0开始)
- 是范围中包含的第一个功能索引(从0开始)
- 是范围中包含的最后一个功能索引(从0开始)
示例:
针对名称为netpf0的接口以及VF 0、2至7(包含2和7)和9的选择器如下所示:
"pfNames": ["netpf0#0,2-7,9"]
针对PCI地址0000:86:00.0以及VF 0、1、3、4的选择器如下所示:
CODE_TOKEN_15`
如果选择器中仅指定了PF网络接口或PF PCI地址,则默认该接口的所有VF或SF都将加入资源池。
部署连接到预创建 SR-IOV 网络的演示 Pod
首先,确保您的 Pod 从正确的设备池请求适当数量的设备:
[cloudadmin@controller-1 ~]$ grep -B1 sriov_ sriov_pod.yaml
requests:
nokia.k8s.io/sriov_ens2f1: '2'
limits:
nokia.k8s.io/sriov_ens2f1: '2'
然后实例化 Pod:
[cloudadmin@controller-1 ~]$ kubectl create -f sriov_pod.yaml
pod/sriov-pod created
验证演示 Pod 的状态和网络连接
[cloudadmin@controller-1 ~]$ kubectl get pod sriov-pod -n example-sriov
NAME READY STATUS RESTARTS AGE
sriov-pod 1/1 Running 0 111s
[cloudadmin@controller-1 ~]$ kubectl exec -n example-sriov -it sriov-pod -- ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
3: eth0@if49: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 8950 qdisc noqueue
link/ether 8a:74:fd:e0:ee:fa brd ff:ff:ff:ff:ff:ff
inet 10.244.3.8/24 brd 10.244.3.255 scope global eth0
valid_lft forever preferred_lft forever
9: second_path2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq qlen 1000
link/ether e2:19:e0:1b:91:44 brd ff:ff:ff:ff:ff:ff
26: first_path1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq qlen 1000
link/ether 7e:0d:fa:eb:83:8c brd ff:ff:ff:ff:ff:ff
已分配的设备信息通过容器的环境变量导出。变量名称为 PCIDEVICE_ 后接完整的扩展资源名称(例如 intel.com/sriov 等),扩展资源名称需大写,且所有特殊字符(“.”、“/”)替换为下划线(“_”)。如果从同一扩展资源池分配多个设备,设备 ID 之间用逗号(“,”)分隔。
例如,如果从 intel.com/sriov 扩展资源分配了 2 个设备,则已分配的设备信息将在以下环境变量中找到:
PCIDEVICE_INTEL_COM_SRIOV=0000:03:02.1,0000:03:04.3
还有另一个环境变量以 JSON 格式公开已分配设备的更多信息,如挂载信息和请求的附加变量。该变量名称为 PCIDEVICE_ _INFO 后接完整的扩展资源名称(例如 intel.com/sriov 等),扩展资源名称需大写,且所有特殊字符(“.”、“/”)替换为下划线(“_”)。
vfio 设备示例:
PCIDEVICE_INTEL_COM_DPDK_NIC_1_INFO={"0000:3b:02.6":{"vfio":{"vfio-dev-mount":"/dev/vfio/169","vfio-mount":"/dev/vfio/vfio"},"vhost":{"net-mount":"/dev/vhost-net","tun-mount":"/dev/net/tun"}}}
# 在资源定义中添加 additionalInfo 字段将为每个已分配设备添加额外信息。例如:
PCIDEVICE_INTEL_COM_DPDK_NIC_1_INFO={"0000:3b:02.6":{"extraInfo":{"token":"3e49019f-412f-4f02-824e-4cd195944205"},"vfio":{"vfio-dev-mount":"/dev/vfio/169","vfio-mount":"/dev/vfio/vfio"},"vhost":{"net-mount":"/dev/vhost-net","tun-mount":"/dev/net/tun"}}}
SR-IOV 网络设备插件支持在虚拟化环境中运行。但是,并非所有设备选择器都适用,因为 VF 是透传给 VM 的,与它们各自的 PF 没有关联,因此任何依赖 VF 与其 PF 关联的设备选择器都无法工作,因此 pfNames 和 rootDevices 扩展选择器在虚拟部署中无法使用。通用选择器 pciAddress 可用于选择虚拟设备。
SR-IOV CNI 插件不支持在虚拟化环境中运行,因为它始终需要访问 PF 设备,而 PF 设备通常不存在于 VM 中。在虚拟化环境中推荐使用的 CNI 插件是 host-device CNI 插件。
SR-IOV 网络设备插件支持在没有虚拟化 IOMMU 的虚拟化环境中分配 VFIO 设备。有关更多信息,请参阅 此文档。
支持的架构:
构建镜像:
$ DOCKERFILE=Dockerfile make image
要启用容器设备接口(CDI)部署,请参见 CDI。
我们欢迎您对本项目提供反馈和贡献。有关贡献指南,请参见 CONTRIBUTING.md。
来自真实用户的反馈,见证轩辕镜像的优质服务