NVIDIA 云原生文档:Kubernetes 与 NVIDIA GPU

来源:https://docs.nvidia.com/datacenter/cloud-native/


目录

  1. 概述
  2. NVIDIA GPU Operator
  3. GPU Operator 安装与配置
  4. GPU 共享
  5. 容器设备接口(CDI)与 NRI 插件
  6. GPU 驱动自定义资源(CRD)
  7. 预编译驱动容器
  8. GPUDirect RDMA 与 GPUDirect Storage
  9. Kata Containers 部署
  10. KubeVirt GPU 支持
  11. 平台支持矩阵
  12. GPU 监控与遥测
  13. 其他组件
  14. 故障排查

1. 概述

NVIDIA 云原生生态系统提供了一整套工具和框架,用于在 Kubernetes 环境中管理、调度和监控 GPU 资源。核心组件包括:

NVIDIA 云原生生态

NVIDIA GPU Operator

驱动管理

容器工具包

设备插件

监控导出器

NVIDIA Container Toolkit

GPU 容器运行时

CDI 支持

NVIDIA Device Plugin

GPU 资源发现

GPU 共享/MIG

NVIDIA GPU Feature Discovery

GPU 标签自动标注

NVIDIA Network Operator

网络设备管理

GPUDirect RDMA

NVIDIA NIM Operator

推理模型部署

1.1 核心组件关系

Kubernetes 集群

GPU Operator

NVIDIA GPU 驱动

NVIDIA Container Toolkit

Device Plugin

DCGM Exporter

GPU Feature Discovery

Node Feature Discovery

Container Runtime
containerd / CRI-O

Kubelet

Prometheus


2. NVIDIA GPU Operator

2.1 什么是 GPU Operator

NVIDIA GPU Operator 是一个 Kubernetes Operator,用于自动化管理 NVIDIA GPU 资源所需的所有软件组件。它利用 Kubernetes 的 Operator 模式,通过自定义资源定义(CRD)和控制器来管理 GPU 驱动程序、容器工具包、设备插件等组件的生命周期。

2.2 GPU Operator 管理的组件

组件 功能
NVIDIA GPU Driver 在节点上安装和管理 GPU 驱动
NVIDIA Container Toolkit 确保容器可以正确访问 GPU
NVIDIA Kubernetes Device Plugin 发现 GPU 资源并向 Kubelet 广告
NVIDIA DCGM / DCGM Exporter GPU 监控和指标导出
NVIDIA GPU Feature Discovery 自动标注 GPU 类型/特性
Node Feature Discovery 检测 CPU/内核/主机特性并标注节点
NVIDIA MIG Manager 管理 MIG 功能的 GPU
NVIDIA Validator 验证 GPU Operator 部署是否成功

2.3 版本与生命周期

NVIDIA GPU Operator 采用日历版本号(Calendar Versioning):YY.MM.PP,例如 23.6.0、26.3.3。

版本 状态
26.3.x ✅ 受支持
25.10.x ⚠️ 已弃用(仅关键修复)
25.3.x 及更低 ❌ 停止支持

注意:升级仅支持在同一主版本内或升级到下一个主版本。

2.4 组件版本矩阵(v26.3.x)

组件 v26.3.0 v26.3.1 v26.3.2 v26.3.3
NVIDIA GPU Driver 580.126.20 (默认) 580.126.20 (默认) 580.126.20 (默认) 580.126.20 (默认)
570.211.01 570.211.01 570.211.01 570.211.01
535.288.01 / 535.309.01 535.288.01 / 535.309.01 535.288.01 / 535.309.01 535.288.01 / 535.309.01
580.167.08 (推荐) 580.167.08 (推荐) 580.167.08 (推荐) 580.167.08 (推荐)
Driver Manager v0.10.0 v0.10.0 v0.11.0 v0.11.0
Container Toolkit 1.19.0 1.19.0 1.19.1 1.19.1
Device Plugin 0.19.0 0.19.2 0.19.3 0.19.3
DCGM Exporter v4.5.1-4.8.0 v4.5.1-4.8.0 v4.5.3-4.8.2 v4.5.3-4.8.2
NFD v0.18.3 v0.18.3 v0.18.3 v0.18.3
GPU Feature Discovery 0.19.0 0.19.2 0.19.3 0.19.3
MIG Manager 0.14.0 0.14.0 0.14.2 0.14.2
DCGM 4.5.2-1 4.5.2-1 4.5.2-1 4.5.2-1
KubeVirt GPU Device Plugin v1.5.0 v1.5.0 v1.5.0 v1.5.0
vGPU Device Manager v0.4.2 v0.4.2 v0.4.2 v0.4.2
GDS Driver 2.27.3 2.27.3 2.27.3 2.27.3
CC Manager v0.3.0 v0.3.0 v0.4.0 v0.4.0
GDRCopy Driver v2.5.1 v2.5.1 v2.5.2 v2.5.2
Kata Sandbox Device Plugin v0.0.2 v0.0.2 v0.0.3 v0.0.3

已知问题:驱动版本 570.124.06、570.133.20、570.148.08、570.158.01 在 MIG 切片和完整 GPU 混合节点上,GPU Pod 会无限期 Pending。建议升级到 580.65.06 或更高版本。


3. GPU Operator 安装与配置

3.1 前提条件

  • Kubernetes 1.32–1.36 集群
  • Helm 3 已安装
  • 节点上安装了受支持的操作系统
  • (可选)已预安装 NVIDIA GPU 驱动和 Container Toolkit

3.2 安装 GPU Operator

# 添加 NVIDIA Helm 仓库
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia && helm repo update

# 标准安装(自动安装驱动)
helm install --wait --generate-name \
  -n gpu-operator --create-namespace \
  nvidia/gpu-operator \
  --version=v26.3.3

# 使用预安装驱动(不安装驱动容器)
helm install --wait --generate-name \
  -n gpu-operator --create-namespace \
  nvidia/gpu-operator \
  --version=v26.3.3 \
  --set driver.enabled=false \
  --set toolkit.enabled=false

3.3 验证安装

# 检查所有 Pod 状态
kubectl get pods -n gpu-operator

# 预期输出:
# NAME                                              READY   STATUS      RESTARTS   AGE
# gpu-operator-xxxxxx-xxxxx                         1/1     Running     0          5m
# nvidia-container-toolkit-daemonset-xxxxx           1/1     Running     0          4m
# nvidia-cuda-validator-xxxxx                        0/1     Completed   0          3m
# nvidia-dcgm-exporter-xxxxx                         1/1     Running     0          4m
# nvidia-device-plugin-daemonset-xxxxx               1/1     Running     0          4m
# nvidia-device-plugin-validator-xxxxx               0/1     Completed   0          3m
# nvidia-driver-daemonset-xxxxx                      1/1     Running     0          5m
# nvidia-operator-validator-xxxxx                     1/1     Running     0          4m

3.4 安装流程图

Worker 节点 GPU Operator Kubernetes Helm 用户 Worker 节点 GPU Operator Kubernetes Helm 用户 helm install nvidia/gpu-operator 创建 CRD / RBAC / Deployment 启动 GPU Operator Pod 创建 ClusterPolicy 部署 NFD DaemonSet 检测 GPU 节点并标注 部署 Driver DaemonSet 安装 GPU 驱动 部署 Container Toolkit DaemonSet 配置容器运行时 部署 Device Plugin DaemonSet 注册 GPU 资源 部署 DCGM Exporter 启动 GPU 监控 运行 Validator Pod ✅ 所有组件就绪

3.5 常见 Helm 配置选项

参数 默认值 说明
driver.enabled true 是否部署驱动容器
driver.version 自动 GPU 驱动版本
driver.usePrecompiled false 使用预编译驱动
driver.repository nvcr.io/nvidia 驱动镜像仓库
driver.rdma.enabled false 启用 GPUDirect RDMA
driver.rdma.useHostMofed false 使用宿主机 MOFED 驱动
gds.enabled false 启用 GPUDirect Storage
toolkit.enabled true 是否部署 Container Toolkit
devicePlugin.enabled true 是否部署 Device Plugin
dcgmExporter.enabled true 是否部署 DCGM Exporter
mig.strategy single MIG 策略(single/none)
sandboxWorkloads.enabled false 启用沙箱工作负载
sandboxWorkloads.mode "" 沙箱模式(kata)
cdi.enabled true(v25.10+) 启用 CDI
nfd.enabled true 启用 Node Feature Discovery

4. GPU 共享

4.1 概述

GPU Operator 支持多种 GPU 共享方式,使多个工作负载可以同时使用同一块 GPU:

GPU 共享模式

时间分片
Time-Slicing

MIG 多实例
Multi-Instance GPU

CDI 设备分配
Container Device Interface

公平分配 GPU 计算时间

适用于推理/轻量任务

硬件级隔离

独立的内存/计算单元

A100/A30 等 Ampere+

标准化设备注入

跨容器运行时兼容

4.2 时间分片(Time-Slicing)

时间分片通过将 GPU 的计算资源在时间维度上划分给多个工作负载,实现 GPU 共享。

配置示例(通过 ClusterPolicy):

# 在 Device Plugin 配置中启用时间分片
spec:
  devicePlugin:
    config:
      name: time-slicing-config
      share:
        timeSlicing:
          resources:
          - name: nvidia.com/gpu
            replicas: 4  # 每个 GPU 分为 4 个副本

4.3 MIG(Multi-Instance GPU)

MIG 是 NVIDIA Ampere 及更新架构 GPU 的硬件级隔离功能,可以将一块 GPU 划分为多个独立的实例。

支持的 GPU:A100、A30、A10、A16、A2、H100 等 Ampere 及以上架构。

MIG 策略选项:

策略 说明
single 整块 GPU 分配给一个工作负载(默认)
mixed 允许混合使用 MIG 实例和完整 GPU

5. 容器设备接口(CDI)与 NRI 插件

5.1 CDI 概述

容器设备接口(Container Device Interface,CDI)是一个开放规范,用于标准化容器运行时对设备(如 GPU)的访问方式。CDI 简化了为容器添加设备支持的开发工作,因为该规范适用于所有支持 CDI 的容器运行时。

从 GPU Operator v25.10.0 开始,CDI 默认启用,用于在 Kubernetes 中运行的工作负载容器中注入 GPU。CDI 通过 containerd 和 CRI-O 等容器运行时来实现 GPU 注入。

容器 CDI 规范 Container Runtime (containerd/CRI-O) Device Plugin Kubelet 容器 CDI 规范 Container Runtime (containerd/CRI-O) Device Plugin Kubelet 请求 GPU 资源 分配 GPU,返回 CDI 设备 ID 创建 Pod(含 CDI 设备请求) 读取 CDI 规范文件 返回设备注入指令 注入 GPU 设备节点/环境变量

5.2 CDI 与 GPU 管理容器

当 CDI 在 v25.10.0 及更高版本中启用时,使用 NVIDIA_VISIBLE_DEVICES 环境变量获取 GPU 访问权限的 GPU 管理容器将绕过 GPU 分配。

5.3 NRI 插件

NRI(Node Resource Interface)插件是另一种设备注入机制。GPU Operator 支持通过 NRI 插件进行 GPU 设备注入。

启用 NRI 插件

# 安装时启用
helm install --wait --generate-name \
  -n gpu-operator --create-namespace \
  nvidia/gpu-operator \
  --version=v26.3.3 \
  --set cdi.nriPluginEnabled=true

禁用 NRI 插件(改用 nvidia runtime class):

kubectl patch clusterpolicies.nvidia.com/cluster-policy --type='json' \
  -p='[{"op": "replace", "path": "/spec/cdi/nriPluginEnabled", "value":false}]'

要求:使用 NRI 插件需要 containerd v1.7.30+、v2.1.x 或 v2.2.x,或 CRI-O v1.34+。

5.4 已知问题

设置 spec.hostUsers: false(Kubernetes 用户命名空间)的 Pod 规范不受支持。NVIDIA Container Toolkit 的 nvidia-cdi-hook 在用户命名空间内无法读取 OCI bundle 的 config.json,导致容器创建失败。

临时解决方案:对于请求 GPU 或由 GPU Operator 管理的 Pod,省略 hostUsers 字段或设置 spec.hostUsers: true


6. GPU 驱动自定义资源(CRD)

6.1 概述

从 GPU Operator v26.3 开始,可以使用 NVIDIA 驱动自定义资源(NVIDIADriver CRD)来指定节点上的 GPU 驱动类型和版本。相比传统的 ClusterPolicy 方式,NVIDIADriver CRD 支持在同一集群中运行不同驱动类型和版本。

6.2 CRD vs ClusterPolicy 对比

方面 ClusterPolicy CRD NVIDIA Driver CRD
驱动类型/版本 所有节点单一配置 不同节点可配置不同类型/版本
操作系统版本 不支持多种 支持多种操作系统版本
节点选择 全局 通过 nodeSelector 精细控制

6.3 驱动 DaemonSet 机制

GPU Operator 为每个 NVIDIADriver CRD 和每个操作系统版本启动一个驱动 DaemonSet。

NVIDIADriver: demo-gold
版本: 580.126.20

DaemonSet: Ubuntu 22.04
驱动 580 分支

DaemonSet: Ubuntu 24.04
驱动 580 分支

NVIDIADriver: demo-silver
版本: 470.141.10

DaemonSet: Ubuntu 22.04
驱动 470 分支

6.4 NVIDIADriver CRD 字段说明

字段 说明 默认值
driverType gpu(数据中心驱动)/ vgpu(vGPU 来宾驱动)/ vgpu-host-manager(vGPU 管理器) gpu
version GPU 驱动版本(如 580.126.20)
kernelModuleType auto / proprietary / open auto
nodeSelector 节点标签选择器 无(选择所有节点)
rdma.enabled 启用 GPUDirect RDMA false
gds.enabled 启用 GPUDirect Storage false
gdrcopy.enabled 启用 GDRCopy 驱动 false
usePrecompiled 使用预编译驱动 false
image 驱动容器镜像名 driver
repository 容器镜像仓库 nvcr.io/nvidia

6.5 示例:多驱动版本配置

# 金牌节点 - 最新驱动
apiVersion: nvidia.com/v1alpha1
kind: NVIDIADriver
metadata:
  name: demo-gold
spec:
  driverType: gpu
  nodeSelector:
    driver.config: "gold"
  repository: nvcr.io/nvidia
  version: "580.126.20"
---
# 银牌节点 - 旧版驱动
apiVersion: nvidia.com/v1alpha1
kind: NVIDIADriver
metadata:
  name: demo-silver
spec:
  driverType: gpu
  nodeSelector:
    driver.config: "silver"
  repository: nvcr.io/nvidia
  version: "470.141.10"

6.6 安装 GPU Operator 并启用驱动 CRD

# 启用 NVIDIADriver CRD
helm install --wait --generate-name \
  -n gpu-operator --create-namespace \
  nvidia/gpu-operator \
  --version=v26.3.3 \
  --set driver.nvidiaDriverCRD.enabled=true

# 不安装默认 CR(自定义时使用)
helm install --wait --generate-name \
  -n gpu-operator --create-namespace \
  nvidia/gpu-operator \
  --version=v26.3.3 \
  --set driver.nvidiaDriverCRD.enabled=true \
  --set driver.nvidiaDriverCRD.deployDefaultCR=false

6.7 驱动升级

通过修改 NVIDIADriver CR 的 version 字段触发滚动更新:

kubectl patch nvidiadriver/demo-silver --type='json' \
  -p='[{"op": "replace", "path": "/spec/version", "value": "525.125.06"}]'

6.8 限制

  • 仅推荐新集群使用,不支持从 ClusterPolicy 管理的驱动升级到 CRD 管理
  • 不能同时使用 ClusterPolicy 和 NVIDIADriver CRD

7. 预编译驱动容器

7.1 概述

预编译驱动容器不需要互联网访问来下载 Linux 内核头文件、GCC 编译工具或操作系统包。同时也避免了传统驱动容器编译内核驱动时的计算需求突发。

适用场景

  • 网络受限环境
  • 资源受限硬件
  • 需要快速驱动部署

7.2 限制

  • 仅支持 x86_64 架构
  • 仅支持受支持列表中的操作系统版本
  • 不支持 NVIDIA vGPU 或 GPUDirect Storage (GDS)
  • NVIDIA 仅支持最新 LTSB 驱动分支的预编译驱动

7.3 预编译驱动命名规则

<驱动分支>-<Linux内核版本>-<OS标签>

例如:525-5.15.0-69-generic-ubuntu22.04

7.4 安装时启用预编译驱动

helm install --wait gpu-operator \
  -n gpu-operator --create-namespace \
  nvidia/gpu-operator \
  --version=v26.3.3 \
  --set driver.usePrecompiled=true \
  --set driver.version="580"

7.5 安装后启用预编译驱动

kubectl patch clusterpolicies.nvidia.com/cluster-policy --type='json' \
  -p='[
    {"op":"replace", "path":"/spec/driver/usePrecompiled", "value":true},
    {"op":"replace", "path":"/spec/driver/version", "value":"580"}
  ]'

7.6 构建自定义预编译驱动镜像

如果 NVIDIA 未提供您的内核变体的预编译驱动,可以自行构建:

# 克隆驱动容器仓库
git clone https://github.com/NVIDIA/gpu-driver-container.git
cd gpu-driver-container/ubuntu22.04/precompiled

# 设置环境变量
export PRIVATE_REGISTRY=<私有仓库地址>
export KERNEL_VERSION=5.15.0-1033-aws
export CUDA_VERSION=12.1.0
export DRIVER_BRANCH=525
export OS_TAG=ubuntu22.04

# 构建
sudo docker build \
  --build-arg KERNEL_VERSION=$KERNEL_VERSION \
  --build-arg CUDA_VERSION=$CUDA_VERSION \
  --build-arg DRIVER_BRANCH=$DRIVER_BRANCH \
  -t ${PRIVATE_REGISTRY}/driver:${DRIVER_BRANCH}-${KERNEL_VERSION}-${OS_TAG} .

# 推送到私有仓库
sudo docker push ${PRIVATE_REGISTRY}/driver:${DRIVER_BRANCH}-${KERNEL_VERSION}-${OS_TAG}

8. GPUDirect RDMA 与 GPUDirect Storage

8.1 概述

GPUDirect 数据路径

DMA 直传

存储/网络

GPU

传统数据路径

存储/网络

CPU

内存拷贝

GPU

GPUDirect RDMA:允许 GPU 与第三方对等设备(如 NVIDIA ConnectX SmartNIC、BlueField DPU)通过 PCI Express 直接交换数据,无需 CPU 介入。

GPUDirect Storage (GDS):允许本地或远程存储(NFS、NVMe/NVMe-oF)与 GPU 内存之间的直接数据路径,通过 DMA 传输避免 CPU 弹跳缓冲区,提高带宽、降低延迟和 CPU 负载。

8.2 内核模式支持

方式 说明
DMA-BUF(推荐) Linux 内核原生支持,需要 Open Kernel Module 驱动
nvidia-peermem(旧版) NVIDIA 驱动中的内核模块,不需要 Open Kernel Module

8.3 前提条件对比

条件 DMA-BUF 旧版 nvidia-peermem
GPU 驱动 需要 Open Kernel Module 任何受支持驱动
CUDA 11.7+ 无最低版本要求
GPU Turing 架构数据中心 GPU 及以上 所有数据中心/RTX GPU 及以上
网络驱动 MLNX_OFED/DOCA-OFED 可选 MLNX_OFED/DOCA-OFED 必需
Linux 内核 5.12+ 无最低版本要求

从 GPU Operator v25.3.0 起,driver.kernelModuleType 默认为 auto,GPU Operator 会根据驱动分支和 GPU 设备自动选择推荐的内核模块类型。

8.4 安装 GPUDirect RDMA

# 使用 DMA-BUF + Network Operator 安装的驱动
helm install --wait --generate-name \
  -n gpu-operator --create-namespace \
  nvidia/gpu-operator \
  --version=v26.3.3

# 使用 DMA-BUF + 宿主机已安装的驱动
helm install --wait --generate-name \
  -n gpu-operator --create-namespace \
  nvidia/gpu-operator \
  --version=v26.3.3 \
  --set driver.rdma.useHostMofed=true

# 使用旧版 nvidia-peermem
helm install --wait --generate-name \
  -n gpu-operator --create-namespace \
  nvidia/gpu-operator \
  --version=v26.3.3 \
  --set driver.rdma.enabled=true

# R570 之前的驱动分支需指定 open 内核模块
# 添加: --set driver.kernelModuleType=open

8.5 验证 GPUDirect RDMA

# 确认驱动 DaemonSet 包含 mofed-validation init 容器
kubectl describe ds -n gpu-operator nvidia-driver-daemonset

# 确认 nvidia-peermem 内核模块已加载(仅旧版模式)
kubectl logs -n gpu-operator ds/nvidia-driver-daemonset -c nvidia-peermem-ctr

# 执行 RDMA 数据传输测试
# 1. 获取 InfiniBand 设备网络接口名
kubectl exec -it -n network-operator mofed-ubuntu22.04-ds-xxxxx -- ibdev2netdev

# 2. 创建 macvlan 网络
# 3. 启动两个测试 Pod 执行 ib_write_bw
# 4. 预期传输速率约 92 Gbps

8.6 安装 GPUDirect Storage

helm install --wait --generate-name \
  -n gpu-operator --create-namespace \
  nvidia/gpu-operator \
  --version=v26.3.3 \
  --set gds.enabled=true

# 旧版 nvidia-peermem 需额外添加
# --set driver.rdma.enabled=true

# R570 之前的驱动分支
# --set driver.kernelModuleType=open

8.7 验证 GPUDirect Storage

# 检查 nvidia-fs 内核模块是否加载
lsmod | grep nvidia
# 应看到 nvidia_fs, nvidia_peermem, nvidia_uvm 等模块

8.8 VMware vSphere 额外配置

在 vSphere 环境中需确保:

  • 网卡和 GPU 在同一 PCIe IO 根复合体中
  • 启用 PCI 选项:pciPassthru.allowP2P = truepciPassthru.RelaxACSforP2P = truepciPassthru.use64bitMMIO = truepciPassthru.64bitMMIOSizeGB = 128

9. Kata Containers 部署

9.1 概述

Kata Containers 是一个开源项目,创建轻量级虚拟机(VM),使其表现和性能类似传统容器。传统容器与宿主机共享内核,存在潜在安全风险;Kata 容器运行在独立 VM 中,具有独立的操作系统内核,通过硬件虚拟化提供更强的隔离。

Kubelet

CRI

Kata Runtime

轻量级 QEMU VM

轻量级 Guest OS

Pod

容器

9.2 Kata Containers 的优势

  • 运行不可信工作负载:VM 提供防御层
  • 限制硬件设备访问:VM 只能访问特定设备
  • 透明部署:无需修改容器即可部署

9.3 限制

  • GPU 直通场景下,节点上所有 GPU 必须分配给同一个 Kata VM,不支持部分分配
  • 不支持 vGPU
  • 仅支持 containerd 运行时
  • 支持范围仅限本文档描述的实现

9.4 集群拓扑

节点 B - Kata 容器

NVIDIA Driver Manager

NVIDIA Container Toolkit

NVIDIA Sandbox Device Plugin

NVIDIA VFIO Manager

NVIDIA CC Manager

NFD + GFD

节点 A - 传统容器

NVIDIA Driver Manager

NVIDIA Container Toolkit

NVIDIA Device Plugin

NVIDIA DCGM Exporter

NVIDIA MIG Manager

NFD + GFD

9.5 前提条件

硬件和 BIOS

  • 启用硬件虚拟化和 ACS
  • 启用 IOMMU(检查:ls /sys/kernel/iommu_groups
  • 确保宿主机未安装 NVIDIA GPU 驱动(lsmod | grep nvidia 应为空)

Kubernetes

  • 启用 Kubelet KubeletPodResourcesGet feature gate(Kubernetes v1.34+ 默认启用)
  • 增加 kubelet runtimeRequestTimeout 到 20 分钟

9.6 安装步骤

# 1. 标记节点
kubectl label node nvidia.com/gpu.workload.config=vm-passthrough

# 2. 安装 Kata Containers
export VERSION="3.29.0"
export CHART="oci://ghcr.io/kata-containers/kata-deploy-charts/kata-deploy"
helm install kata-deploy "${CHART}" \
  --namespace kata-system --create-namespace \
  --set nfd.enabled=false \
  --wait --timeout 10m \
  --version "${VERSION}"

# 3. 验证 runtime class
kubectl get runtimeclass | grep kata-qemu-nvidia-gpu

# 4. 安装 GPU Operator
helm install --generate-name \
  -n gpu-operator --create-namespace \
  nvidia/gpu-operator \
  --version=v26.3.3 \
  --set sandboxWorkloads.enabled=true \
  --set sandboxWorkloads.mode=kata \
  --set nfd.enabled=true \
  --set nfd.nodefeaturerules=true

# 5. 验证
kubectl get pods -n gpu-operator
# 应看到 nvidia-kata-sandbox-device-plugin 和 nvidia-vfio-manager

9.7 验证 VFIO

lspci -nnk -d 10de:
# "Kernel driver in use" 应为 vfio-pci

10. KubeVirt GPU 支持

10.1 概述

KubeVirt 是 Kubernetes 的虚拟机管理扩展,允许在 Kubernetes 集群中运行和管理虚拟机。GPU Operator 可以配置工作节点以支持 KubeVirt 运行 GPU 加速的虚拟机。

10.2 节点工作负载配置

节点 C - vGPU VM

节点 B - GPU 直通 VM

节点 A - 容器

节点配置选择

container

vm-passthrough

vm-vgpu

nvidia.com/gpu.workload.config

节点 A

节点 B

节点 C

数据中心驱动

Container Toolkit

Device Plugin

DCGM Exporter

VFIO Manager

Sandbox Device Plugin

vGPU Manager

vGPU Device Manager

Sandbox Device Plugin

10.3 约束与依赖

  • 一个 GPU 工作节点只能运行一种类型的 GPU 工作负载(容器/直通VM/vGPU VM)
  • GPU 加速虚拟机的工作节点须为裸金属
  • GPU Operator 不会自动在 KubeVirt VM 内安装 NVIDIA 驱动
  • 必须手动将 GPU/vGPU 资源添加到 KubeVirt CR 的 permittedDevices 列表

10.4 前提条件

  • BIOS 启用虚拟化和 IOMMU(intel_iommu=onamd_iommu=on
  • 使用 vGPU 时,Ampere 及以上架构 GPU 需启用 SR-IOV
  • 安装 KubeVirt
  • KubeVirt v0.58.2+ 和 v0.59.1+ 需设置 DisableMDEVConfiguration feature gate:
kubectl patch kubevirt -n kubevirt kubevirt --type='json' \
  -p='[{"op": "add", "path": "/spec/configuration/developerConfiguration/featureGates/-", "value": "DisableMDEVConfiguration" }]'

10.5 安装 GPU Operator(KubeVirt)

# 不带 vGPU
helm install --wait --generate-name \
  -n gpu-operator --create-namespace \
  nvidia/gpu-operator \
  --version=v26.3.3 \
  --set sandboxWorkloads.enabled=true

# 带 vGPU
kubectl create namespace gpu-operator
kubectl create secret docker-registry ${REGISTRY_SECRET_NAME} \
  --docker-server=${PRIVATE_REGISTRY} \
  --docker-username=<用户名> --docker-password=<密码> \
  -n gpu-operator

helm install --wait --generate-name \
  -n gpu-operator --create-namespace \
  nvidia/gpu-operator \
  --version=v26.3.3 \
  --set sandboxWorkloads.enabled=true \
  --set vgpuManager.enabled=true \
  --set vgpuManager.repository=<仓库> \
  --set vgpuManager.image=vgpu-manager \
  --set vgpuManager.version=<版本> \
  --set vgpuManager.imagePullSecrets={${REGISTRY_SECRET_NAME}}

10.6 添加 GPU 资源到 KubeVirt CR

GPU 直通

spec:
  configuration:
    developerConfiguration:
      featureGates:
      - GPU
      - DisableMDEVConfiguration
    permittedHostDevices:
      pciHostDevices:
      - externalResourceProvider: true
        pciVendorSelector: "10DE:2236"     # NVIDIA PCI 厂商:设备 ID
        resourceName: nvidia.com/GA102GL_A10

vGPU

spec:
  configuration:
    developerConfiguration:
      featureGates:
      - GPU
      - DisableMDEVConfiguration
    permittedHostDevices:
      mediatedDevices:
      - externalResourceProvider: true
        mdevNameSelector: "NVIDIA A10-12Q"
        resourceName: nvidia.com/NVIDIA_A10-12Q

10.7 创建带 GPU 的虚拟机

GPU 直通 VM

apiVersion: kubevirt.io/v1alpha3
kind: VirtualMachineInstance
spec:
  domain:
    devices:
      gpus:
      - deviceName: nvidia.com/GA102GL_A10
        name: gpu1

vGPU VM

apiVersion: kubevirt.io/v1alpha3
kind: VirtualMachineInstance
spec:
  domain:
    devices:
      gpus:
      - deviceName: nvidia.com/NVIDIA_A10-12Q
        name: gpu1

10.8 vGPU 设备配置

vGPU Device Manager 以声明方式定义 vGPU 设备配置,通过 ConfigMap 共享。默认配置会在所有 GPU 上创建 Q 系列 vGPU 设备(每个设备的帧缓冲为 GPU 总内存的一半)。

自定义配置示例:

version: v1
vgpu-configs:
  custom-A10-config:
  - devices: all
    vgpu-devices:
      "A10-4Q": 3
      "A10-6Q": 2

按节点应用配置:

kubectl label node <node-name> --overwrite nvidia.com/vgpu.config=A10-4Q

11. 平台支持矩阵

11.1 支持的 NVIDIA 数据中心 GPU(x86)

GH 系列

产品 架构 备注
NVIDIA GH200 Grace Hopper 需要 Open Kernel Module 驱动

A/H/L 系列

产品 架构
NVIDIA H800 Hopper
NVIDIA H200 / H200 NVL Hopper
NVIDIA DGX H100 / HGX H100 Hopper + NVSwitch
NVIDIA DGX H200 / HGX H200 Hopper + NVSwitch
NVIDIA H100 / H100 NVL Hopper
NVIDIA H20 Hopper
NVIDIA L20 / L40 / L40S Ada
NVIDIA L4 Ada
NVIDIA DGX A100 / HGX A100 A100 + NVSwitch
NVIDIA A800 / A100 / A100X Ampere
NVIDIA A40 / A30 / A30X Ampere
NVIDIA A16 / A10 / A2 Ampere

B 系列(Blackwell)

产品 架构
NVIDIA DGX B300 / B200 Blackwell
NVIDIA DGX Spark Blackwell
NVIDIA HGX B200 / B300 Blackwell
NVIDIA HGX GB200 NVL72 / NVL4 Blackwell
NVIDIA HGX GB300 NVL72 Blackwell
NVIDIA DGX Station Blackwell

HGX B200 需要驱动容器版本 570.133.20+。

11.2 支持的 ARM 平台

产品 架构
NVIDIA A100X / A30X Ampere
NVIDIA IGX Orin Ampere
AWS EC2 G5g Turing
NVIDIA DGX Spark / HGX GB200/GB300 Blackwell

仅支持离散 GPU,NVIDIA Jetson 等集成 GPU 不受支持。

11.3 支持的操作系统与 Kubernetes 版本

操作系统 Kubernetes OpenShift VMware VKS Rancher RKE2 K3s Mirantis k0s
Ubuntu 22.04 LTS 1.32–1.36 1.32–1.36 1.32–1.36 1.32–1.36 1.32–1.36 1.33–1.35
Ubuntu 24.04 LTS 1.32–1.36 1.32–1.36 1.32–1.36 1.32–1.36 1.33–1.35
Red Hat Core OS 4.18–4.22
RHEL 10.x 1.32–1.36 1.32–1.36
RHEL 9.x 1.32–1.36 1.32–1.36
RHEL 8.x 1.32–1.36 1.32–1.36

11.4 支持的预编译驱动

操作系统 内核变体 内核版本 CUDA 驱动分支
Ubuntu 22.04 Generic/NVIDIA/Azure/AWS/Oracle 5.15 R535, R570, R580
Ubuntu 22.04 Generic/NVIDIA/Azure/AWS/Oracle 6.8 R535, R570, R580
Ubuntu 24.04 Generic/NVIDIA/Azure/AWS/Oracle 6.8 R570, R580

11.5 支持的容器运行时

操作系统 containerd 1.7–2.2 CRI-O
Ubuntu 22.04
Ubuntu 24.04
RHCOS
RHEL 8
RHEL 9

11.6 KubeVirt / OpenShift Virtualization 支持

操作系统 Kubernetes KubeVirt OpenShift Virtualization GPU 直通 vGPU
Ubuntu 24.04 1.32–1.36 0.36+
Ubuntu 22.04 1.32–1.36 0.36+ 0.59.1+
Red Hat Core OS 4.18–4.22

vGPU 支持的设备:RTX Pro 6000 Blackwell SE、H200NVL、H100、A100/A40/A30/A16/A10/A2、L40/L4 等。

11.7 部署方式支持

  • ✅ 裸金属
  • ✅ GPU 直通虚拟机
  • ✅ NVIDIA vGPU 虚拟机(vGPU 12.0+)

12. GPU 监控与遥测

12.1 DCGM Exporter

DCGM Exporter 基于 NVIDIA DCGM(Data Center GPU Manager)库,将 GPU 指标以 Prometheus 格式导出。

部署方式:GPU Operator 自动部署 DCGM Exporter DaemonSet。

DCGM 库

DCGM Exporter

Prometheus
metrics 端点
:9400/metrics

Prometheus Server

Grafana 仪表盘

关键指标

指标 说明
DCGM_FI_DEV_GPU_UTIL GPU 计算利用率
DCGM_FI_DEV_MEM_COPY_UTIL 内存带宽利用率
DCGM_FI_DEV_FB_FREE 剩余帧缓冲内存
DCGM_FI_DEV_FB_USED 已用帧缓冲内存
DCGM_FI_DEV_GPU_TEMP GPU 温度
DCGM_FI_DEV_POWER_USAGE 功耗
DCGM_FI_DEV_SM_CLOCK SM 时钟频率
DCGM_FI_DEV_MEM_CLOCK 内存时钟频率

13. 其他组件

13.1 NVIDIA Container Toolkit

NVIDIA Container Toolkit 是让容器能够访问 GPU 的核心组件。它通过修改容器的 OCI 规范来注入 GPU 设备节点、驱动库和环境变量。

核心功能

  • 自动配置容器运行时(containerd/CRI-O)
  • 支持 CDI 设备注入
  • 提供 nvidia-container-runtimenvidia-cdi-hook

13.2 NVIDIA Kubernetes Device Plugin

Kubernetes Device Plugin 用于发现节点上的 GPU 资源,并向 Kubelet 广告这些资源,使 Pod 可以请求和分配 GPU。

功能

  • GPU 资源发现与注册
  • 时间分片(Time-Slicing)配置
  • MIG 设备管理
  • CDI 设备分配

13.3 NVIDIA GPU Feature Discovery

GPU Feature Discovery 自动检测节点上的 GPU 特性(型号、驱动版本、CUDA 版本、MIG 能力等),并以节点标签的形式暴露给 Kubernetes 调度器。

13.4 NVIDIA Network Operator

Network Operator 管理 Kubernetes 集群中的网络设备,包括:

  • MLNX_OFED / DOCA-OFED 网络驱动
  • SR-IOV 网络设备插件
  • Multus CNI 配置
  • 与 GPU Operator 配合支持 GPUDirect RDMA

13.5 NVIDIA NIM Operator

NIM Operator 用于在 Kubernetes 中部署和管理 NVIDIA NIM(NVIDIA Inference Microservices)推理模型服务。


14. 故障排查

14.1 常用诊断命令

# 检查 GPU Operator 所有 Pod 状态
kubectl get pods -n gpu-operator

# 查看特定 Pod 日志
kubectl logs -n gpu-operator <pod-name>

# 查看 GPU Operator 控制器日志
kubectl logs -n gpu-operator deployment/gpu-operator

# 检查 ClusterPolicy 状态
kubectl get clusterpolicies.nvidia.com

# 查看 NVIDIADriver CR 状态
kubectl get nvidiadrivers

# 查看 Driver DaemonSet
kubectl get ds -n gpu-operator -l app.kubernetes.io/component=nvidia-driver

# 检查节点 GPU 资源
kubectl get node -o json | jq '.status.allocatable | with_entries(select(.key | startswith("nvidia.com/")))'

# 在节点上检查 GPU 驱动
nvidia-smi

# 检查内核模块
lsmod | grep nvidia

# 检查 CDI 设备
ls /var/run/cdi/

14.2 常见问题

问题 原因 解决方案
Driver Pod 处于 CrashLoopBackOff 内核版本不兼容 检查驱动版本与内核版本匹配;使用预编译驱动
GPU 资源未显示 Device Plugin 未运行 kubectl get pods -n gpu-operator -l app=nvidia-device-plugin-daemonset
容器内 nvidia-smi 失败 Container Toolkit 配置错误 检查 /etc/containerd/config.toml 中 nvidia runtime 配置
MIG Pod Pending 驱动版本 Bug(570.x) 升级驱动到 580.65.06+
Kata VM GPU 不可用 VFIO 绑定失败 检查 IOMMU 配置,确认宿主机无 NVIDIA 驱动
RDMA 性能低 MOFED 驱动未安装 安装 Network Operator 或宿主机 MOFED 驱动
CDI 设备注入失败 containerd 版本过低 升级到 containerd 1.7.30+

14.3 验证 GPU 工作负载

# 运行 GPU 测试 Pod
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: gpu-test
spec:
  restartPolicy: OnFailure
  containers:
  - name: cuda
    image: nvcr.io/nvidia/k8s/cuda-sample:nbody-cuda11.7.1-ubuntu20.04
    resources:
      limits:
        nvidia.com/gpu: 1
    command: ["./nbody", "-gpu"]
EOF

# 查看输出
kubectl logs gpu-test

附录 A:快速安装参考

# === 最小安装 ===
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia && helm repo update
helm install --wait --generate-name \
  -n gpu-operator --create-namespace \
  nvidia/gpu-operator --version=v26.3.3

# === 启用 CDI(v25.10+ 默认已启用) ===
helm install --wait --generate-name \
  -n gpu-operator --create-namespace \
  nvidia/gpu-operator --version=v26.3.3

# === 启用 GPUDirect RDMA ===
helm install --wait --generate-name \
  -n gpu-operator --create-namespace \
  nvidia/gpu-operator --version=v26.3.3 \
  --set driver.rdma.enabled=true

# === 启用 GPUDirect Storage ===
helm install --wait --generate-name \
  -n gpu-operator --create-namespace \
  nvidia/gpu-operator --version=v26.3.3 \
  --set gds.enabled=true

# === 启用 KubeVirt 沙箱 ===
helm install --wait --generate-name \
  -n gpu-operator --create-namespace \
  nvidia/gpu-operator --version=v26.3.3 \
  --set sandboxWorkloads.enabled=true

# === 启用 Kata 容器 ===
helm install --wait --generate-name \
  -n gpu-operator --create-namespace \
  nvidia/gpu-operator --version=v26.3.3 \
  --set sandboxWorkloads.enabled=true \
  --set sandboxWorkloads.mode=kata

# === 使用驱动 CRD ===
helm install --wait --generate-name \
  -n gpu-operator --create-namespace \
  nvidia/gpu-operator --version=v26.3.3 \
  --set driver.nvidiaDriverCRD.enabled=true

附录 B:架构总览图

监控

容器运行时

Worker 节点组件

GPU Operator

Kubernetes 控制平面

内核模块

GPU 资源

API Server

Scheduler

Controller Manager

Operator Controller

ClusterPolicy CRD

NVIDIADriver CRD

GPU Driver DaemonSet

Container Toolkit DaemonSet

Device Plugin DaemonSet

DCGM Exporter DaemonSet

GPU Feature Discovery DaemonSet

NFD DaemonSet

VFIO Manager

Sandbox Device Plugin

containerd / CRI-O

CDI 规范

NRI 插件

Prometheus

Grafana

NVIDIA GPU

更多推荐