【NVIDIA】NVIDIA k8s-device-plugin v0.19.3 系统级架构分析
NVIDIA k8s-device-plugin v0.19.3 系统级架构分析
分析对象: github.com/k8s-device-plugin-0.19.3
代码语言: Go (116个非vendor Go文件)
分析日期: 2026-07-25
目录
- 项目整体架构
- 整体设计思路
- 整体运行流程
- 子模块/功能模块划分
- 模块调用关系
- 主流程详解
1. 项目整体架构
1.1 项目定位
NVIDIA k8s-device-plugin 是 NVIDIA 官方开发的 Kubernetes 设备插件,用于将 NVIDIA GPU 资源暴露给 Kubernetes 集群中的容器化工作负载。它实现了 Kubernetes Device Plugin API(gRPC),与 Kubelet 交互,完成 GPU 设备的发现、分配和健康监控。
1.2 架构分层
项目采用五层架构设计,自上而下分别为:
| 层级 | 名称 | 目录 | 核心职责 |
|---|---|---|---|
| L1 | 入口层 | cmd/ | 4个可执行程序入口,CLI解析、启动控制 |
| L2 | 核心服务层 | internal/plugin,internal/lm,internal/watch | gRPC设备插件服务、标签管理、文件/信号监控 |
| L3 | 资源管理层 | internal/rm,internal/cdi,internal/imex,internal/flags | 设备资源管理、CDI规格生成、IMEX通道、K8s客户端 |
| L4 | 设备抽象层 | internal/resource,internal/cuda,internal/mig,internal/vgpu,internal/info | NVML/CUDA/VFIO设备抽象、CGo绑定、MIG工具、vGPU检测 |
| L5 | 配置层 | api/config/v1/ | 统一配置结构体、标志定义、资源共享策略 |
1.3 关键设计特征
- 多入口单仓库:4个独立的
main()入口共享同一套 internal 包 - 策略模式:设备发现支持
auto/nvml/tegra三种策略,运行时自动选择 - 工厂模式:
plugin.New()、resource.NewManager()、cdi.New()均采用函数式选项工厂 - 接口驱动:
ResourceManager、Manager、Device、Interface、Labeler等核心抽象均为接口 - 功能选项模式:广泛使用
WithXxx()风格的 Functional Options - 回退机制:
FallbackToNullOnInitError提供 Init 失败时的 Null 回退
2. 整体设计思路
2.1 核心设计原则
Kubernetes Device Plugin Protocol 优先
所有设计围绕 Kubernetes Device Plugin gRPC API 展开,实现ListAndWatch、Allocate、GetPreferredAllocation、PreStartContainer四个核心RPC。多平台兼容
通过info.ResolvePlatform()自动检测运行平台(NVML/WSL/Tegra),选择对应的设备发现策略和资源管理器实现。设备共享支持
支持两种GPU共享策略:- Time-Slicing:时间片共享,通过
Replicas创建带注释的设备ID - MPS (Multi-Process Service):通过MPS控制守护进程实现真正的GPU共享
- Time-Slicing:时间片共享,通过
CDI (Container Device Interface) 集成
支持cdi-annotations和cdi-cri两种设备列表策略,通过 nvidia-container-toolkit 生成CDI规格文件。配置统一管理
单一Config结构体覆盖所有配置项,支持 YAML 文件、CLI 标志、环境变量三种配置来源,优先级:CLI > 环境变量 > 配置文件。
2.2 数据模型
Config ├── Flags (CommandLineFlags) │ ├── MigStrategy: none | single | mixed │ ├── DeviceDiscoveryStrategy: auto | nvml | tegra │ ├── Plugin (PluginCommandLineFlags) │ │ ├── DeviceListStrategy: envvar | volume-mounts | cdi-annotations | cdi-cri │ │ └── DeviceIDStrategy: uuid | index │ └── GFD (GFDCommandLineFlags) ├── Resources (GPUs + MIGs, Pattern → Name 映射) ├── Sharing (TimeSlicing + MPS, ReplicatedResources) └── Imex (ChannelIDs + Required)3. 整体运行流程
3.1 nvidia-device-plugin 启动流程
main() ├── CLI 解析 (urfave/cli/v2) ├── watch.Files(kubeletSocketDir) // 监控kubelet socket目录 ├── watch.Signals(SIGHUP, SIGINT, ...) // 监控OS信号 └── start() 事件循环 └── startPlugins() ├── loadConfig() // 加载配置 ├── spec.DisableResourceNamingInConfig() ├── validateFlags() // 验证标志 ├── rm.AddDefaultResourcesToConfig() // 添加默认资源 ├── GetPlugins() // 获取插件集合 │ ├── imex.GetChannels() // 获取IMEX通道 │ ├── resolveStrategy() // 解析发现策略 │ ├── cdi.New() // 创建CDI处理器 │ ├── plugin.New() // 创建插件实例 │ └── cdiHandler.CreateSpecFile() // 生成CDI规格文件 └── 遍历插件 → p.Start(kubeletSocket) ├── Serve() // 启动gRPC服务 ├── Register() // 注册到Kubelet └── go rm.CheckHealth() // 启动健康检查3.2 运行时事件循环
select { case <-restartTimeout: → goto restart // 重启插件 case event := <-watcher.Events: // kubelet socket重建 → goto restart case err := <-watcher.Errors: // 文件系统错误 → log case s := <-sigs: // OS信号 SIGHUP → goto restart 其他 → goto exit }3.3 gpu-feature-discovery 启动流程
main() ├── CLI 解析 └── start() 循环 ├── loadConfig() ├── resource.NewManager() // 创建资源管理器 ├── vgpu.NewVGPULib() // 创建vGPU库 ├── lm.NewOutputer() // 创建标签输出器 └── gfd.run() ├── lm.NewLabelers() // 构建标签器链 ├── labelers.Labels() // 生成标签 ├── labelOutputer.Output() // 输出标签 └── 等待 sleepInterval 或信号4. 子模块/功能模块划分
4.1 入口模块 (cmd/)
核心作用: 提供4个独立的可执行程序入口,各自负责CLI解析、配置加载和生命周期管理。
| 子模块 | 文件 | 核心函数/方法 | 职责 |
|---|---|---|---|
| nvidia-device-plugin | main.go,root.go,plugin-manager.go | main(),start(),startPlugins(),GetPlugins(),resolveStrategy(),root.tryResolveLibrary() | 主设备插件入口,管理gRPC插件生命周期 |
| gpu-feature-discovery | main.go | main(),start(),gfd.run(),removeOutputFile() | GPU特征发现,定期生成节点标签 |
| config-manager | main.go | main(),start(),continuouslySyncConfigChanges(),updateConfig(),signalProcess() | 监听Node标签,动态更新配置文件并发SIGHUP |
| mps-control-daemon | main.go,mps/*.go,mount/*.go | main(),start(),startDaemons(),Daemon.Start(),Daemon.Stop(),Daemon.EchoPipeToControl() | MPS控制守护进程管理 |
4.2 Plugin 模块 (internal/plugin/)
核心作用: 实现Kubernetes Device Plugin gRPC接口,管理设备列表、分配和健康监控。
关键类型与函数:
| 类型/函数 | 文件 | 职责 |
|---|---|---|
nvidiaDevicePlugin | server.go | 核心结构体,实现pluginapi.DevicePluginServer |
Interface | api.go | 插件接口:Devices(),Start(),Stop() |
New() | factory.go | 工厂函数,创建插件实例列表 |
Options | options.go | Functional Options:WithCDIHandler,WithConfig等 |
Start() | server.go | 启动gRPC服务并注册到Kubelet |
Serve() | server.go | gRPC服务循环,含崩溃重启 |
Register() | server.go | 向Kubelet注册设备插件 |
ListAndWatch() | server.go | 返回设备列表并监控健康状态 |
Allocate() | server.go | 核心: 设备分配入口 |
getAllocateResponse() | server.go | 构建分配响应(CDI/EnvVar/Mounts/DeviceSpecs) |
GetPreferredAllocation() | server.go | 返回优选设备分配方案 |
ValidateRequest() | 通过rm | 验证分配请求合法性 |
mpsOptions | mps.go | MPS共享配置管理 |
4.3 Resource Manager 模块 (internal/rm/)
核心作用: 管理GPU/MIG设备的枚举、分配算法、健康检查和副本管理。
关键类型与函数:
| 类型/函数 | 文件 | 职责 |
|---|---|---|
ResourceManager(Interface) | rm.go | 资源管理接口 |
resourceManager | rm.go | 基础实现 |
nvmlResourceManager | nvml_manager.go | NVML平台实现(含健康检查) |
Device | devices.go | 设备模型: ID, Paths, Index, Replicas, Health |
Devices | devices.go | map[string]*Device集合操作 |
DeviceMap | device_map.go | ResourceName → Devices映射 |
AnnotatedID | devices.go | 带副本编号的设备ID:UUID::replica |
distributedAlloc() | allocate.go | 均衡分配算法(副本设备均匀分布) |
alignedAlloc() | nvml_manager.go | GPU拓扑对齐分配(使用gpuallocator) |
checkHealth() | health.go | XID错误事件监控 |
ValidateRequest() | rm.go | 请求验证(共享资源限制) |
AddDefaultResourcesToConfig() | rm.go | 添加默认GPU/MIG资源模式 |
NewNVMLResourceManagers() | nvml_manager.go | 创建NVML资源管理器集合 |
NewTegraResourceManagers() | tegra_manager.go | 创建Tegra资源管理器集合 |
deviceMapBuilder | device_map.go | 设备映射构建器 |
updateDeviceMapWithReplicas() | device_map.go | 应用共享副本配置 |
4.4 Resource 设备抽象模块 (internal/resource/)
核心作用: 提供统一的设备管理接口,封装 NVML、CUDA、VFIO 三种设备后端。
关键类型与函数:
| 类型/函数 | 文件 | 职责 |
|---|---|---|
Manager(Interface) | types.go | 设备管理接口:Init,GetDevices,GetDriverVersion |
Device(Interface) | types.go | 设备接口:IsMigEnabled,GetAttributes,GetName |
NewManager() | factory.go | 工厂函数,根据策略创建Manager |
nvmlLib | nvml-lib.go | NVML Manager实现 |
cudaLib | cuda-lib.go | CUDA Manager实现(Tegra平台) |
vfioLib | sysfs-lib.go | VFIO Manager实现(sysfs PCI设备) |
null | null.go | 空实现(回退用) |
withFallBack | fallback.go | Init失败自动回退到Null |
nvmlDevice | nvml-device.go | NVML设备实现 |
nvmlMigDevice | nvml-mig-device.go | MIG设备实现 |
cudaDevice | cuda-device.go | CUDA设备实现 |
vfioDevice | sysfs-device.go | VFIO设备实现 |
4.5 CDI 模块 (internal/cdi/)
核心作用: 生成 Container Device Interface (CDI) 规格文件,支持容器运行时自动注入GPU设备。
关键类型与函数:
| 类型/函数 | 文件 | 职责 |
|---|---|---|
Interface | api.go | CDI接口:CreateSpecFile,QualifiedName,AdditionalDevices |
cdiHandler | cdi.go | CDI处理器实现 |
New() | cdi.go | 工厂函数,创建CDI处理器 |
CreateSpecFile() | cdi.go | 生成CDI JSON规格文件到/var/run/cdi/ |
QualifiedName() | cdi.go | 生成CDI设备名:vendor/class/id |
AdditionalDevices() | cdi.go | 返回额外CDI设备(GDS/MOFED/GDRCopy) |
getRootTransformer() | cdi.go | 驱动根路径转换器 |
null | null.go | 空实现(无CDI时使用) |
csvFilesForRoot() | cdi.go | Tegra CSV文件路径解析 |
| Options | options.go | WithDriverRoot,WithDeviceIDStrategy等 |
4.6 Label Manager 模块 (internal/lm/)
核心作用: 为GPU Feature Discovery (GFD) 生成节点标签,包括驱动版本、CUDA版本、MIG能力、共享策略等。
关键类型与函数:
| 类型/函数 | 文件 | 职责 |
|---|---|---|
Labeler(Interface) | labeler.go | 标签器接口:Labels() (Labels, error) |
Labels | labels.go | map[string]string标签集合 |
NewLabelers() | labeler.go | 创建标签器集合 |
Merge() | labeler.go | 合并多个标签器 |
NewDeviceLabeler() | nvml.go | 创建设备标签器 |
newVersionLabeler() | nvml.go | 驱动/CUDA版本标签 |
newMigCapabilityLabeler() | nvml.go | MIG能力标签 |
newSharingLabeler() | nvml.go | 共享策略标签 |
NewResourceLabeler() | resource.go | 资源标签(GPU数量、内存等) |
NewVGPULabeler() | vgpu.go | vGPU标签 |
NewTimestampLabeler() | timestamp.go | 时间戳标签 |
NewOutputer() | output.go | 创建标签输出器 |
ToFile/toWriter | output.go | 文件/标准输出 |
nodeFeatureObject | output.go | NFD NodeFeature CR 输出 |
4.7 Config 模块 (api/config/v1/)
核心作用: 统一配置管理,覆盖CLI标志、资源模式、共享策略、IMEX通道。
关键类型与函数:
| 类型/函数 | 文件 | 职责 |
|---|---|---|
Config | config.go | 顶层配置结构体 |
NewConfig() | config.go | 从CLI/ENV/文件构建配置 |
parseConfig() | config.go | YAML/JSON解析 |
DisableResourceNamingInConfig() | config.go | 禁用资源重命名 |
Flags/CommandLineFlags | flags.go | CLI标志定义 |
PluginCommandLineFlags | flags.go | 插件专属标志 |
GFDCommandLineFlags | flags.go | GFD专属标志 |
Resources/Resource | resources.go | GPU/MIG资源模式匹配 |
ResourcePattern | resources.go | 通配符模式:*→.* |
Sharing | sharing.go | 共享策略: TimeSlicing + MPS |
ReplicatedResources | replicas.go | 副本资源配置 |
DeviceListStrategies | strategy.go | 设备列表策略集合 |
NewDeviceListStrategies() | strategy.go | 创建策略集合 |
AnyCDIEnabled()/AllCDIEnabled() | strategy.go | CDI策略检查 |
Imex | imex.go | IMEX通道配置 |
Duration/DurationValue | duration.go | 自定义Duration类型 |
4.8 MPS Control Daemon 模块 (cmd/mps-control-daemon/)
核心作用: 管理NVIDIA MPS (Multi-Process Service) 守护进程,实现GPU共享。
关键类型与函数:
| 类型/函数 | 文件 | 职责 |
|---|---|---|
Manager/manager | manager.go | MPS管理器 |
NewDaemons()/New() | manager.go | 创建Daemon集合 |
Daemon | daemon.go | MPS守护进程实例 |
Daemon.Start() | daemon.go | 启动MPS守护 (nvidia-cuda-mps-control) |
Daemon.Stop() | daemon.go | 停止MPS守护 |
Daemon.AssertHealthy() | daemon.go | 健康检查 |
Daemon.EchoPipeToControl() | daemon.go | 通过管道发送命令 |
setComputeMode() | daemon.go | 设置GPU计算模式 (EXCLUSIVE_PROCESS) |
mpsDevice | device.go | MPS设备验证 (assertReplicas, maxClients) |
Root | root.go | MPS根路径管理 (PipeDir, LogDir, ShmDir) |
logTailer | log-tailer.go | 日志跟踪 |
mount-shm.go | mount/ | SHM挂载 |
4.9 辅助模块
| 模块 | 目录 | 核心作用 | 关键函数/类 |
|---|---|---|---|
| mig | internal/mig/ | MIG设备信息查询和设备路径解析 | DeviceInfo,GetMigCapabilityDevicePaths(),GetDevicesMap(),GetAllMigDevices() |
| vgpu | internal/vgpu/ | vGPU PCI设备检测和厂商能力解析 | Interface,Lib,Device,Info,NewVGPULib(),NewNvidiaPCILib() |
| imex | internal/imex/ | IMEX通道设备发现和注入 | Channel,Channels,GetChannels() |
| watch | internal/watch/ | 文件系统和OS信号监控 | Files(),Signals() |
| cuda | internal/cuda/ | CGo CUDA绑定 (libcuda.so.1) | Init(),Shutdown(),Device,cuInit,cuDeviceGet,cuDeviceGetAttribute,cuDeviceTotalMem |
| flags | internal/flags/ | Kubernetes客户端和节点配置 | KubeClientConfig,NodeConfig,NewClientSets() |
| info | internal/info/ | 版本信息 | GetVersionString(),GetVersionParts() |
| dependencies | internal/dependencies/ | 依赖记录(编译时) | — |
5. 模块调用关系
5.1 模块间依赖关系矩阵
main plugin rm cdi resource config lm mig vgpu imex watch cuda flags info main (ndp) - ✓ ✓ . . ✓ . . . ✓ ✓ . ✓ ✓ main (gfd) - . . . ✓ ✓ ✓ . ✓ . ✓ . ✓ ✓ main (mps) - . ✓ . . ✓ . . . . ✓ . . ✓ main (config-mgr) - . . . . . . . . . . . . ✓ plugin . - ✓ ✓ . ✓ . . . ✓ . . . . rm . . - . ✓ ✓ . ✓ . . . . . . cdi . . . - . . . . . ✓ . . . . resource . . . - - . . . . . . ✓ . . lm . . ✓ . ✓ ✓ - . ✓ . . . ✓ .5.2 数据流向
5.2.1 设备发现数据流
config.Config (Resources/Flags) ↓ rm.NewNVMLResourceManagers() / NewTegraResourceManagers() ↓ NewDeviceMap(devicelib, config, platform) ↓ (VisitDevices / VisitMigDevices) deviceMapBuilder.buildGPUDeviceMap() / buildMigDeviceMap() ↓ (Pattern matching: ResourcePattern.Matches(name)) DeviceMap (ResourceName → Devices) ↓ (updateDeviceMapWithReplicas - if sharing enabled) DeviceMap with replicated AnnotatedIDs ↓ resourceManager{config, resource, devices} ↓ nvidiaDevicePlugin{rm: resourceManager}5.2.2 设备分配数据流
Kubelet → Allocate(request) ↓ 遍历 ContainerRequests ↓ rm.ValidateRequest(AnnotatedIDs) ↓ uniqueDeviceIDsFromAnnotatedDeviceIDs() ↓ (根据 DeviceListStrategies) ├── CDI: cdiHandler.QualifiedName() → annotations/cdiDevices ├── EnvVar: NVIDIA_VISIBLE_DEVICES = "uuid1,uuid2" ├── VolumeMounts: /var/run/nvidia-container-devices/<id> └── DeviceSpecs: /dev/nvidia* (if PassDeviceSpecs) ↓ ContainerAllocateResponse ↓ Kubelet → 容器运行时5.2.3 标签生成数据流 (GFD)
config.Config ↓ resource.NewManager(infolib, nvmllib, devicelib, config) ↓ resource.Manager → manager.GetDevices() → []Device ↓ lm.NewLabelers(manager, vgpu, config) ├── newVersionLabeler() → nvidia.com/cuda.driver-version.* ├── newMigCapabilityLabeler() → nvidia.com/mig.capable ├── newSharingLabeler() → nvidia.com/mps.* ├── NewResourceLabeler() → nvidia.com/gpu.count, nvidia.com/gpu.memory.* ├── NewVGPULabeler() → nvidia.com/vgpu.* └── migStrategyLabeler() → nvidia.com/mig.strategy ↓ lm.Merge(labelers...).Labels() ↓ lm.Outputer.Output(labels) ├── ToFile: /etc/kubernetes/node-feature-discovery/features.d/gfd └── NodeFeature CR: NFD API5.3 健康检查数据流
rm.CheckHealth(stop, unhealthy) ↓ (nvmlResourceManager.checkHealth) nvml.EventSetCreate() ↓ 遍历设备 → gpu.RegisterEvents(XidCriticalError | ECC errors, eventSet) ↓ eventSet.Wait(5000ms) 循环 ↓ XID事件 → 匹配 parentToDeviceMap → 标记 Unhealthy ↓ plugin.health channel → ListAndWatch.Send() → Kubelet6. 主流程详解
6.1 Allocate 完整流程
Allocate()是设备插件最核心的RPC,当Kubelet调度GPU Pod时调用。
// 1. Kubelet调用 Allocate(AllocateRequest)func(plugin*nvidiaDevicePlugin)Allocate(ctx,reqs)(*AllocateResponse,error){for_,req:=rangereqs.ContainerRequests{// 2. 验证请求plugin.rm.ValidateRequest(req.DevicesIds)// 3. 构建分配响应response:=plugin.getAllocateResponse(req.DevicesIds)// 4. 根据策略填充响应// 4a. CDI策略 → annotations 或 cdiDevices// 4b. EnvVar策略 → NVIDIA_VISIBLE_DEVICES// 4c. VolumeMounts策略 → /var/run/nvidia-container-devices// 4d. PassDeviceSpecs → /dev/nvidia* 设备节点// 5. MPS额外处理// → CUDA_MPS_PIPE_DIRECTORY, pipe/shm mounts// 6. IMEX通道注入// → NVIDIA_IMEX_CHANNEL_IDS env var// 7. 可选功能// → NVIDIA_GDRCOPY, NVIDIA_GDS, NVIDIA_MOFED env vars}return&responses}6.2 设备发现策略选择
resolveStrategy("auto", infolib): infolib.ResolvePlatform() ├── PlatformNVML → "nvml" ├── PlatformWSL → "nvml" (WSL用同一策略) └── PlatformTegra → "tegra"6.3 资源管理器创建
plugin.New(ctx, infolib, nvmllib, devicelib, opts...) ↓ o.getResourceManagers() ├── strategy == "nvml": │ nvmllib.Init() │ NewNVMLResourceManagers(infolib, nvmllib, devicelib, config) │ ├── NewDeviceMap(devicelib, config, platform) │ │ ├── buildGPUDeviceMap() → VisitDevices → Pattern match │ │ └── buildMigDeviceMap() → VisitMigDevices → Pattern match │ └── 遍历 DeviceMap → 创建 nvmlResourceManager │ └── strategy == "tegra": NewTegraResourceManagers(config) ├── buildTegraDeviceMap(config) └── 遍历 → 创建 resourceManager6.4 MIG 策略处理
| 策略 | 行为 |
|---|---|
none | 忽略MIG设备,只暴露完整GPU |
single | 所有GPU必须配置相同的MIG,MIG设备映射到nvidia.com/gpu |
mixed | GPU和MIG设备分别暴露,MIG设备映射到nvidia.com/mig-<profile> |
6.5 设备共享(Time-Slicing)
config.Sharing.TimeSlicing: Resources: [{Name: "nvidia.com/gpu", Replicas: 4}] ↓ updateDeviceMapWithReplicas() ↓ 原始设备 UUID → 4个带注释的ID: UUID::0, UUID::1, UUID::2, UUID::3 ↓ Kubelet看到4倍数量的设备 ↓ ValidateRequest: 共享资源最多请求1个 ↓ distributedAlloc: 均衡分配副本6.6 MPS 共享
config.Sharing.MPS: Resources: [{Name: "nvidia.com/gpu", Replicas: 4}] ↓ mps-control-daemon 启动 ↓ Daemon.Start(): nvidia-smi -c EXCLUSIVE_PROCESS (设置独占进程模式) nvidia-cuda-mps-control -d (启动MPS守护) set_default_device_pinned_mem_limit (设置内存限制) set_default_active_thread_percentage (设置线程百分比) ↓ plugin.Allocate(): response.Envs["CUDA_MPS_PIPE_DIRECTORY"] = pipeDir response.Mounts: pipe目录 + shm目录附录
A. 文件统计
| 类别 | 文件数 | 说明 |
|---|---|---|
| 非vendor Go文件 | 116 | 核心项目代码 |
| 入口程序 | 4 | nvidia-device-plugin, gfd, config-manager, mps-control-daemon |
| internal包 | 15 | plugin, rm, cdi, resource, lm, mig, vgpu, imex, watch, cuda, flags, info, dependencies |
| api包 | 1 | config/v1 |
| 测试文件 | ~15 | 单元测试 + e2e测试 |
| vendor依赖 | ~50+ | go-nvlib, go-nvml, go-gpuallocator, nvidia-container-toolkit, k8s libs |
B. 关键外部依赖
| 依赖 | 用途 |
|---|---|
go-nvlib/pkg/nvlib/device | NVML设备库封装 |
go-nvlib/pkg/nvlib/info | 平台检测 |
go-nvml/pkg/nvml | NVML Go绑定 |
go-gpuallocator/gpuallocator | GPU拓扑对齐分配 |
nvidia-container-toolkit/pkg/nvcdi | CDI规格生成 |
container-device-interface/pkg/cdi | CDI解析 |
kubelet/pkg/apis/deviceplugin/v1beta1 | K8s Device Plugin API |
urfave/cli/v2 | CLI框架 |
fsnotify/fsnotify | 文件系统事件监控 |
sigs.k8s.io/node-feature-discovery | NFD NodeFeature API |
C. 架构图索引
| 编号 | 图名 | 文件 |
|---|---|---|
| 1 | 整体架构图 | diagrams/01_overall_architecture.png |
| 2 | 主启动流程 | diagrams/02_main_flow.png |
| 3 | 模块调用关系 | diagrams/03_call_relationship.png |
| 4 | Plugin模块 | diagrams/04_plugin_module.png |
| 5 | Resource Manager模块 | diagrams/05_rm_module.png |
| 6 | Resource设备抽象模块 | diagrams/06_resource_module.png |
| 7 | CDI模块 | diagrams/07_cdi_module.png |
| 8 | Label Manager模块 | diagrams/08_lm_module.png |
| 9 | 入口模块 | diagrams/09_entry_module.png |
| 10 | MPS模块 | diagrams/10_mps_module.png |
| 11 | Config模块 | diagrams/11_config_module.png |
| 12 | 辅助模块 | diagrams/12_auxiliary_modules.png |
| 13 | Allocate流程 | diagrams/13_allocate_flow.png |
