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+ 版本。
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 进行配置。
请参考 Multus 的https://github.com/k8snetworkplumbingwg/multus-cni#quickstart-installation-guide%E6%9D%A5%E5%AE%89%E8%A3%85 Multus。
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
本节介绍如果选择 DANM 作为元插件,在 Kubernetes 中部署 SR-IOV 网络设备插件的示例。
有关详细说明,请参考 https://github.com/nokia/danm/blob/master/deployment-guide.md%E3%80%82
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" 时,这些选择器适用(注意:这是默认值)
此字段定义了一种方法,可将信息添加到 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都将加入资源池。
首先,确保您的 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
[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。
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
docker search 限制
站内搜不到镜像
离线 save/load
插件要用 plugin install
WSL 拉取慢
安全与 digest
新手拉取配置
镜像合规机制
不支持 push
manifest unknown
no matching manifest(架构)
invalid tar header(解压)
TLS 证书失败
DNS 超时
域名连通性排查
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务