一、基础定义

SriovNetworkNodePolicySR‑IOV‑Network‑Operator 提供的 K8s 自定义资源 (CRD),API‑Group:sriovnetwork.openshift.io/v1Red Hat。 作用:对节点上支持 SR‑IOV 的物理网卡 (PF) 下发配置,拆分出虚拟网卡 (VF)、绑定驱动、注册成 K8s 可调度硬件资源,让 Pod 可以独占高速 VF 网卡(DPDK、RDMA、高性能容器网络)。

简单一句话:它就是节点层面 SR‑IOV 网卡的配置单

二、前置背景:SR‑IOV 基础

  1. PF(Physical Function):物理网卡本体
  2. VF(Virtual Function):PF 拆分出来的轻量级虚拟网卡,可以直通给 Pod
  3. Operator 依靠 SriovNetworkNodePolicy 控制每块 PF 生成多少 VF、驱动类型、RDMA 开关、网卡筛选规则

三、核心字段详解

apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetworkNodePolicy
metadata:
  name: intel‑25g‑policy
  namespace: openshift‑sriov‑operator
spec:
  # 1. 资源名称,Pod 调度时请求该硬件资源
  resourceName: sriov_left
  # 2. 筛选哪些网卡(PF)生效该策略
  nicSelector:
    vendor: "8086"        # 厂商ID 8086=Intel、15b3=Mellanox(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

关键字段分类

  1. 网卡筛选 nicSelector 通过厂商 ID、设备 ID、PCI 地址、网卡名定位节点上的物理网卡 PF;支持多网卡批量匹配。
  2. VF 数量 numVfs 设置该 PF 拆分多少虚拟网卡;修改 VF 数量经常需要节点重启生效(Mellanox 增加 VF 必重启)Red Hat。
  3. deviceType 两种模式
  •  netdevice:VF 作为普通内核网卡,配合 Multus‑CNI 给 Pod 分配二层网络;支持 RDMA
  •  vfio‑pci:VF 绑定 vfio 驱动,完整 PCI 直通,供 DPDK、用户态程序接管网卡,不走内核协议栈

    4.resourceName

      最重要字段;设备插件会把 VF 注册成 k8s 硬件资源,Pod 通过 resources: limits: sriov_left: 1 申请一张虚拟网卡。

      此字段作为对外暴露的资源名称,供匹配!

       sriov_left 是一个“逻辑标签”,它把 SriovNetwork(网络定义)和 SriovNetworkNodePolicy(节点 VF 配置)关联起来,告诉 Kubernetes:“我要使用名叫 sriov_left 的那组 VF 资源”。

    5.nodeSelector

        策略只作用于带对应标签的 worker 节点,实现多节点、多网卡分组管理。

四、完整工作流程

  1. 集群部署 sriov‑network‑operator  ,参见 【k8s】SR‑IOV‑Network‑Operator 详解
  2. 编写并下发 SriovNetworkNodePolicy CR
  3. 节点上的 sriov‑config‑daemon 检测到策略
  4. 对匹配的 PF 网卡创建指定数量 VF、绑定驱动、配置 eSwitch
  5. sriov‑device‑plugin 将所有 VF 上报为 K8s 可调度硬件资源
  6. Pod 声明资源 + Multus 网络注解,即可挂载专属 SR‑IOV 虚拟网卡

五、pf网卡和vf网卡示例

以 220.2 otc为例:查看pf

my-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 off

1、两条命令本质分工

ip a(ip addr show)

只查看网卡本身的 IP 地址、MAC、IPv6

  • ens5f0np0 是 PF 物理网卡
  • VF0/VF1/VF2/VF3 是从 PF 拆分出来的独立虚拟网卡设备
  • VF 属于子设备,不会在父 PF 的 ip‑addr 输出里面展示
  • 你看到的 fe80 只是 PF 自身的链路本地 IPv6

ip 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‑VLAN1050;VF1‑1002;VF3‑1003

2、spoof‑checking(伪造 MAC 检查)

  • spoof checking on:VF 不能自定义修改 MAC 地址,防止 Pod 篡改 MAC,安全模式
  • spoof checking off:允许容器内部修改 VF‑MAC,DPDK、部分高性能业务需要关闭

3、trust on/off

  • trust‑on:信任该 VF,允许 VF 开启 VLAN 过滤、修改队列、开启多类硬件卸载;一般 DPDK 业务打开 trust
  • trust‑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

更多推荐