一、硬件侧固定先后顺序(必须先走通)
- 你下发 SriovNetworkNodePolicy (nicSelector、VF 数量、驱动参数) 2‑1. 主控制器 reconcile 捕获该策略,下发配置到对应工作节点 2‑2. 节点上的 config‑daemon 常驻监听配置
- config‑daemon 扫描本机 PCI 网卡、匹配 PF、生成 VF、绑定对应驱动
- sriov‑device‑plugin 扫描已经就绪的 VF,向上上报成 k8s 可调度的硬件资源
硬性依赖:必须 VF 硬件创建完毕之后,device‑plugin 才可以识别并上报
二、SriovNetworkNodeState
它是单节点网卡硬件快照,由节点上 config‑daemon (sriov‑network‑config‑daemon)定时扫描本机 PCI 设备后刷新,status 里面完整记录:
- 所有 PF、VF 的 PCI‑BDF 地址、网卡名称
- 驱动类型、MTU、MAC、VF 编号、硬件状态
- 同步状态(Succeeded / Failed)、报错信息 作用:给主控制器、运维人员查看本机网卡硬件现状,属于硬件层面台账。
config‑daemon 做完 PF 筛选、创建 VF、绑定驱动以后,立刻把当前硬件结果写入 SriovNetworkNodeState。
# 查看所有节点网卡状态
kubectl get sriovnetworknodestates -n cattle-sriov-system
# 查看详情,可以看见PF、所有VF的PCI地址、网卡名称、驱动
kubectl describe sriovnetworknodestates 节点名
三、sriov‑device‑plugin 上报的资源是什么
device‑plugin 读取本机已经就绪的 VF 列表,向 kubelet 注册自定义硬件资源(例如 intel‑sriov‑vf)。
- 资源信息存放在 Node.Status.Allocatable
- 用来让 k8s 调度器实现 VF 的分配、抢占、回收
- 它是K8s 调度层的资源库存,不保存网卡详细硬件信息
就绪 VF 列表来源于宿主机操作系统,不是 CR 资源 SriovNetworkNodeState。
1、sriov‑device‑plugin 获取 VF 的真实数据源
config‑daemon 操作 Linux 内核,在 /sys/bus/pci 目录下生成 VF 设备。
plaintext
/sys/bus/pci/devices/0000:xx:xx.x
- device‑plugin 直接扫描宿主机内核文件系统,遍历本机全部 PCI 设备,筛选 VF;
- 它不会去读取 Kubernetes 里面的 SriovNetworkNodeState
通俗一句话区分
SriovNetworkNodeState:config‑daemon 扫描硬件之后,把硬件信息上报存入 k8s‑API 的一份状态台账- device‑plugin:自己独立扫描主机内核 PCI 设备,获取 VF 清单
二者是两个独立程序各自读取本机硬件,互不调用对方的数据。
2、device‑plugin 上报到底是什么东西
① 向 kubelet 注册自定义资源名称
举个例子 intel‑sriov‑vf,该资源名字来自你 SriovNetworkNodePolicy 里面的 resourceName。
② 上报每一个 VF 的唯一设备 ID(PCI‑BDF 地址)
kubelet 会保存:可用设备清单、已经分配给哪个 Pod。
③ kubelet 汇总之后写入 Node.Status.Allocatable
节点状态只记录资源总数,例如:
plaintext
intel‑sriov‑vf: 8
Allocatable 仅仅是数量库存,不会存储 PCI 地址、网卡名、MAC、驱动这类详细硬件参数
3、Allocatable、Allocated‑resources、剩余可用数量
describe node
Allocatable:
intel‑sriov‑vf: 8
Allocated resources:
intel‑sriov‑vf: 3
- Allocatable:节点硬件资源总配额,本机一共多少个 VF;由 sriov‑device‑plugin 上报给 kubelet。
- Allocated resources:当前已经被 Pod 占用掉的 VF 数目。
- 空闲数量 = Allocatable − Allocated
4、从 sriov‑device‑plugin 日志查看上报、分配、回收详情
# 获取device‑plugin pod
kubectl get pod -n cattle-sriov-system | grep sriov-device-plugin
# 查看日志
kubectl logs -n cattle-sriov-system sriov-device-plugin-xxxx
日志可以看到:
- 扫描到的 VF‑BDF 地址
- 资源注册成功
- Pod 请求分配 VF、释放回收记录
关键小结
sriov‑device‑plugin本质只是把 VF 上报给 kubelet(节点进程);- kubelet 向上同步至 apiserver,于是你可以通过 node 资源清单查看 VF 总数;
- SriovNetworkNodeState 保存硬件层面完整的 PF/VF 列表;
- device‑plugin 日志可以追踪网卡分配、释放流程。
一条完整链路复盘
config‑daemon 创建 VF → device‑plugin 扫描 VF → 上报 kubelet → kubelet 更新节点 Allocatable 资源 → k8s 调度器进行分配。