【k8s】sriov‑device‑plugin、sriov‑network‑config‑daemon详解

一、硬件侧固定先后顺序(必须先走通)

  1. 你下发 SriovNetworkNodePolicy (nicSelector、VF 数量、驱动参数) 2‑1. 主控制器 reconcile 捕获该策略,下发配置到对应工作节点 2‑2. 节点上的 config‑daemon 常驻监听配置
  2. config‑daemon 扫描本机 PCI 网卡、匹配 PF、生成 VF、绑定对应驱动
  3. 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

通俗一句话区分

  1. SriovNetworkNodeStateconfig‑daemon 扫描硬件之后,把硬件信息上报存入 k8s‑API 的一份状态台账
  2. 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、AllocatableAllocated‑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、释放回收记录

关键小结

  1. sriov‑device‑plugin 本质只是把 VF 上报给 kubelet(节点进程)
  2. kubelet 向上同步至 apiserver,于是你可以通过 node 资源清单查看 VF 总数;
  3. SriovNetworkNodeState 保存硬件层面完整的 PF/VF 列表;
  4. device‑plugin 日志可以追踪网卡分配、释放流程。

一条完整链路复盘

config‑daemon 创建 VF → device‑plugin 扫描 VF → 上报 kubelet → kubelet 更新节点 Allocatable 资源 → k8s 调度器进行分配。

相关推荐
张忠琳19 小时前
【NPU】Ascend Device Plugin —Part 6 K8s客户端 + 重复检测模块 超深度源码分析之二
云原生·容器·kubernetes·npu·docker device
雨声不在19 小时前
私有 Docker Registry 排障实录:两个隐蔽的坑
docker·容器
云川之下19 小时前
【k8s】SR‑IOV‑Network‑Operator 详解
云原生·容器·kubernetes
云烟成雨TD20 小时前
Micrometer 系列【29】源码分析:MeterRegistry 实例化流程
java·云原生·micrometer
读书读傻了哟20 小时前
解决docker拉取镜像报错failed to resolve reference “docker.io/xxx“...i/o timeout问题
运维·docker·容器
风曦Kisaki21 小时前
对象存储 MinIO 的两种生产环境适用部署方式
kubernetes
Ai拆代码的曹操1 天前
DaemonSet OnDelete 策略详解:为何 rollout restart 无效及正确迁移方案
docker·容器·kubernetes
名字还没想好☜1 天前
Kubernetes NetworkPolicy 实战:默认全通的坑与用标签做零信任隔离
运维·云原生·容器·kubernetes·networkpolicy
Crazy________1 天前
Redis02:库切换、监控与安全配置
linux·redis·云原生·mybatis