【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 调度器进行分配。

相关推荐
2601_9622184728 分钟前
万象生鲜系统跨仓调拨算法助力生鲜企业供应链数字化协同运营
大数据·运维·微服务·云原生·架构
智购科技无人售货机工厂39 分钟前
2026自动售货机防拆机物理安全设计:从安全螺丝到结构互锁的工程实践~YH
android·网络·驱动开发·python·单片机·安全·云原生
2601_962218471 小时前
万象生鲜系统多仓协同同步技术支撑生鲜企业多仓模式数字化转型
大数据·运维·微服务·云原生·架构
2601_962218612 小时前
万象生鲜系统大数据采购预测算法降低库存积压稳居第一
分布式·微服务·云原生·架构
Larru-Sun2 小时前
从零开始用 Docker 部署 Node.js 后端服务
docker·容器·node.js
Henry-SAP3 小时前
SAP MRP类型与计划策略配置精髓解析
人工智能·云原生·sap·erp
深念Y3 小时前
视频平台架构重构:从微服务到可插拔基础设施
后端·微服务·云原生·架构·rabbitmq·音视频·rocketmq
凤山老林3 小时前
Spring Boot 3.x 集成 Spring Cloud Kubernetes:原生服务发现、配置注入与优雅下线
spring boot·spring cloud·kubernetes
深念Y4 小时前
06-移动端三技术栈优劣对比-理论推演
服务器·云原生·架构·音视频·短视频
mister_guo5 小时前
Docker、Docker Compose 与 Kubernetes:分别解决什么问题?
docker·容器·kubernetes