【k8s】SriovNetworkNodePolicy 详解
一、基础定义SriovNetworkNodePolicy是SR‑IOV‑Network‑Operator提供的K8s 自定义资源 (CRD)API‑Groupsriovnetwork.openshift.io/v1Red Hat。 作用对节点上支持 SR‑IOV 的物理网卡 (PF) 下发配置拆分出虚拟网卡 (VF)、绑定驱动、注册成 K8s 可调度硬件资源让 Pod 可以独占高速 VF 网卡DPDK、RDMA、高性能容器网络。简单一句话它就是节点层面 SR‑IOV 网卡的配置单。二、前置背景SR‑IOV 基础PFPhysical Function物理网卡本体VFVirtual FunctionPF 拆分出来的轻量级虚拟网卡可以直通给 PodOperator 依靠SriovNetworkNodePolicy控制每块 PF 生成多少 VF、驱动类型、RDMA 开关、网卡筛选规则三、核心字段详解apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: intel‑25g‑policy namespace: openshift‑sriov‑operator spec: # 1. 资源名称Pod 调度时请求该硬件资源 resourceName: intel‑25g‑vf # 2. 筛选哪些网卡(PF)生效该策略 nicSelector: vendor: 8086 # 厂商ID 8086Intel、15b3Mellanox(NVIDIA) deviceID: 158b # 网卡设备ID rootDevices: [0000:3b:00.0] # PF 的PCI地址 pfNames: [ens1f0] # 网卡名 # 3. 需要创建多少个VF numVfs: 16 # 4. VF绑定驱动类型 # netdevice内核网卡vfio‑pci用户态直通(DPDK) deviceType: netdevice # 5. 匹配哪些工作节点 nodeSelector: kubernetes.io/hostname: worker‑01 # 6. RDMA开启用于IB/RoCE高速网络 isRdma: false # 7. 策略优先级数值越小优先级越高多策略匹配同一块网卡时生效 priority: 0 # 8. 网卡类型ethernet / IB(InfiniBand) linkType: ethernet # 9. 开启vhost‑net用于DPDK vhost needVhostNet: false # 10. 网卡交换模式Mellanox网卡常用 switchdev(eswitch) eSwitchMode: legacy关键字段分类网卡筛选 nicSelector通过厂商 ID、设备 ID、PCI 地址、网卡名定位节点上的物理网卡 PF支持多网卡批量匹配。VF 数量 numVfs设置该 PF 拆分多少虚拟网卡修改 VF 数量经常需要节点重启生效Mellanox 增加 VF 必重启Red Hat。deviceType 两种模式netdeviceVF 作为普通内核网卡配合 Multus‑CNI 给 Pod 分配二层网络支持 RDMAvfio‑pciVF 绑定 vfio 驱动完整 PCI 直通供 DPDK、用户态程序接管网卡不走内核协议栈4.resourceName最重要字段设备插件会把 VF 注册成 k8s 硬件资源Pod 通过resources: limits: intel‑25g‑vf: 1申请一张虚拟网卡。此字段作为对外暴露的资源名称供匹配5.nodeSelector策略只作用于带对应标签的 worker 节点实现多节点、多网卡分组管理。四、完整工作流程集群部署sriov‑network‑operator 参见 【k8s】SR‑IOV‑Network‑Operator 详解编写并下发SriovNetworkNodePolicyCR节点上的 sriov‑config‑daemon 检测到策略对匹配的 PF 网卡创建指定数量 VF、绑定驱动、配置 eSwitchsriov‑device‑plugin 将所有 VF 上报为 K8s 可调度硬件资源Pod 声明资源 Multus 网络注解即可挂载专属 SR‑IOV 虚拟网卡五、pf网卡和vf网卡示例以 220.2 otc为例查看pfmy-workload-workload-worker-0-10-225-219-20:~ # ip a show ens5f0np0 4: ens5f0np0: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1800 qdisc mq state UP group default qlen 1000 link/ether 50:7c:6f:79:46:64 brd ff:ff:ff:ff:ff:ff altname enp23s0f0np0 inet6 fe80::527c:6fff:fe79:4664/64 scope link proto kernel_ll valid_lft forever preferred_lft forever my-workload-workload-worker-0-10-225-219-20:~ # ip link show ens5f0np0 4: ens5f0np0: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1800 qdisc mq state UP mode DEFAULT group default qlen 1000 link/ether 50:7c:6f:79:46:64 brd ff:ff:ff:ff:ff:ff vf 0 link/ether 0a:42:e5:c3:aa:dd brd ff:ff:ff:ff:ff:ff, vlan 1050, spoof checking off, link-state auto, trust on vf 1 link/ether da:b5:08:d7:5e:10 brd ff:ff:ff:ff:ff:ff, vlan 1002, spoof checking on, link-state auto, trust off vf 2 link/ether 22:0f:0d:5c:33:3c brd ff:ff:ff:ff:ff:ff, vlan 1050, spoof checking off, link-state auto, trust on vf 3 link/ether aa:7f:93:98:cc:34 brd ff:ff:ff:ff:ff:ff, vlan 1003, spoof checking on, link-state auto, trust off1、两条命令本质分工ip aip addr show只查看网卡本身的 IP 地址、MAC、IPv6ens5f0np0 是 PF 物理网卡VF0/VF1/VF2/VF3 是从 PF 拆分出来的独立虚拟网卡设备VF 属于子设备不会在父 PF 的 ip‑addr 输出里面展示你看到的 fe80 只是 PF 自身的链路本地 IPv6ip link show ens5f0np0专门展示链路层硬件属性 SR‑IOV 下属全部 VF 配置内核会把所有 VF 的 MAC、VLAN、spoof‑check、trust 挂载在父 PF 链路信息下面所以这里能看到 4 台 VF。2. 逐条解析你现在 4 个 VF 参数vf 0 link/ether 0a:42:e5:c3:aa:dd brd ff:ff:ff:ff:ff:ff, vlan 1050, spoof checking off, link-state auto, trust on vf 1 link/ether da:b5:08:d7:5e:10 brd ff:ff:ff:ff:ff:ff, vlan 1002, spoof checking on, link-state auto, trust off vf 2 link/ether 22:0f:0d:5c:33:3c brd ff:ff:ff:ff:ff:ff, vlan 1050, spoof checking off, link-state auto, trust on vf 3 link/ether aa:7f:93:98:cc:34 brd ff:ff:ff:ff:ff:ff, vlan 1003, spoof checking on, link-state auto, trust off参数释义1、vlan xxx该 VF 被打上指定 VLAN 标签是 SriovNetwork / Multus‑CNI 下发的配置。VF0、VF2‑VLAN1050VF1‑1002VF3‑10032、spoof‑checking伪造 MAC 检查spoof checkingonVF 不能自定义修改 MAC 地址防止 Pod 篡改 MAC安全模式spoof checkingoff允许容器内部修改 VF‑MACDPDK、部分高性能业务需要关闭3、trust on/offtrust‑on信任该 VF允许 VF 开启 VLAN 过滤、修改队列、开启多类硬件卸载一般 DPDK 业务打开 trusttrust‑off受限模式普通容器网络默认关闭4、link‑state auto VF 链路状态跟随上层交换机自动感应链路通断。六、快速排查命令验证 VF 状态bash# 查看当前PF开启多少VF cat /sys/class/net/ens5f0np0/device/sriov_numvfs # 列出全部VF的PCI地址 ls -l /sys/class/net/ens5f0np0/device/virtfn* # 查看VF绑定驱动确认是否为vfio‑pci lspci -k | grep -i virtual