Kubernetes 中 GPU 虚拟化与 NVIDIA GPU Operator 管理概述

Overview

在 Kubernetes 集群中,通过 NVIDIA GPU Operator 管理 GPU 资源,实现 GPU 虚拟化和显卡的分配。NVIDIA GPU Operator 通过协调 GPU 相关组件,确保 GPU 能够被 Kubernetes 中的 Pod 正常使用,并且能够动态申请显卡和显存资源。这一切通过容器化的方式进行封装和管理,使得 GPU 能够无缝融入 Kubernetes 的计算资源池中。

1. GPU Operator 组件职能

NVIDIA GPU Operator 是一个 Kubernetes Operator,用来自动化 GPU 资源的管理。它通过以下四个主要组件实现 GPU 的启用、监控和分配:

  1. NVIDIA Driver Manager:此组件负责安装和管理 Kubernetes 节点上所需的 NVIDIA 驱动程序。通过安装 NVIDIA 驱动,使得 GPU 可以被宿主机和容器识别和使用。每个 Kubernetes 节点必须具备正确的 NVIDIA 驱动,确保 GPU 能够被 Kubernetes 节点访问。

  2. NVIDIA Container Toolkit (nvidia-docker):负责将 GPU 能力暴露给容器。它为容器提供了一种与宿主机 GPU 通信的机制,使得容器内部的进程能够访问 GPU。这个组件还包括 nvidia-smi 工具的集成,使容器内部能够执行 GPU 状态检查(如显存使用情况、温度等)。

  3. NVIDIA Device Plugin:该插件负责在 Kubernetes 集群中暴露 GPU 资源。Device Plugin 将 GPU 资源报告给 Kubernetes 的 kubelet,使得 Kubernetes 能够识别 GPU,并将其分配给 Pod。这个插件还支持多种 GPU 资源分配模式(如共享显卡、分片虚拟化等),实现 GPU 资源的灵活管理。

  4. NVIDIA DCGM(Data Center GPU Manager):DCGM 是用于监控和管理 GPU 健康状态的组件。它可以采集 GPU 的性能指标(如温度、功耗、利用率等),并提供 API 接口供 Kubernetes 集群中的其他工具调用,确保 GPU 的稳定性。

2. nvidia-smi 在 Pod 中的实现原理

要在 Kubernetes 的 Pod 中使用 nvidia-smi 并查看 GPU 设备状态,NVIDIA GPU Operator 通过以下步骤实现:

  1. NVIDIA Driver 安装:首先,GPU Operator 在每个节点上自动安装 NVIDIA 驱动,使得 GPU 可以被操作系统识别。这是确保 GPU 被容器化应用使用的基础。

  2. NVIDIA Container Toolkit:一旦驱动安装完成,nvidia-docker 工具将 GPU 能力挂载到容器中。这个过程通过设备插件暴露 GPU 资源,使得 GPU 设备在容器内可以被访问。nvidia-docker 工具会在 Pod 中提供对 /dev/nvidia* 设备的访问权限,允许 Pod 中的应用直接调用 GPU。

  3. GPU 在 Pod 中的显示:当 Pod 请求使用 GPU 时,NVIDIA Device Plugin 将该请求转发给 kubelet,并分配相应的 GPU 资源给该 Pod。容器内部通过 NVIDIA Container Toolkit 访问 GPU,因此在容器内运行 nvidia-smi 就可以查看分配的 GPU 信息。

  4. nvidia-smi 命令nvidia-smi 是 NVIDIA 提供的用于显示 GPU 资源状态的命令行工具。通过 GPU Operator 的配置,容器内的应用能够执行 nvidia-smi,查看 GPU 设备、温度、显存使用情况等。该工具通过访问 /dev/nvidia* 设备文件与实际的 GPU 硬件交互,返回 GPU 的详细状态。

3. GPU 资源虚拟化与管理

在 Kubernetes 中,GPU 资源的分配和管理是通过 NVIDIA Device Plugin 来实现的。GPU 虚拟化包括申请 GPU 资源、申请显存等多个过程:

  1. 申请 GPU 资源:当用户创建 Pod 并申请 GPU 时,Pod 的资源需求通过 limitsrequests 指定 GPU 数量。例如,用户可以在 Pod 定义中指定 nvidia.com/gpu: 1,表示需要分配一张 GPU 卡。Kubernetes 调度器会根据该资源需求,将 Pod 调度到具备足够 GPU 资源的节点上。

  2. 申请显存:部分高性能计算或机器学习任务不仅需要 GPU 卡本身,还需要大量的显存。通过 NVIDIA 的虚拟化技术,用户可以指定所需的显存大小,Kubernetes 和 Device Plugin 会根据显存需求合理分配 GPU 资源,确保每个 Pod 的显存使用符合预期。

  3. GPU 资源共享与分片:NVIDIA Device Plugin 支持 GPU 的虚拟化和资源分片,允许多个 Pod 共享同一张物理 GPU。通过资源配额配置,用户可以指定 Pod 使用 GPU 的一部分,允许多个任务并发运行,提高 GPU 资源的利用率。

4. Operator 对 GPU 组件的控制与协调

NVIDIA GPU Operator 通过 Kubernetes 的 Operator 模式对所有与 GPU 相关的组件进行协调和管理。其主要职责如下:

  1. 自动化部署与更新:Operator 负责自动安装和更新所有 GPU 相关的组件,包括 NVIDIA 驱动、Device Plugin、NVIDIA DCGM 和 Container Toolkit 等,确保集群中的 GPU 组件始终保持最新和稳定。

  2. 节点级资源配置:Operator 监控 Kubernetes 集群中各节点的 GPU 使用情况,并在必要时更新 GPU 的驱动、插件配置。通过这种方式,Operator 确保所有节点具备一致的 GPU 环境,使得 GPU 资源可以跨节点无缝调度。

  3. 故障监控与自愈:通过集成 DCGM,Operator 可以监控 GPU 的健康状态。如果某个 GPU 出现故障,Operator 会触发告警,并可以自动采取相应的恢复操作,例如隔离故障节点或重新调度工作负载。

  4. GPU 配置与扩展:Operator 还支持高级的 GPU 资源配置与管理,包括 GPU 显存分配、GPU 性能配置等,帮助用户实现高效的 GPU 虚拟化。

总结

通过 NVIDIA GPU Operator,Kubernetes 中的 GPU 资源得以自动化管理和分配。GPU Operator 协调了多个关键组件:NVIDIA 驱动、Container Toolkit、Device Plugin 和 DCGM,确保 GPU 资源能够被 Kubernetes 集群高效地使用。通过 nvidia-docker 实现 GPU 虚拟化,nvidia-smi 可以在 Pod 中直接查看和管理 GPU 资源。此外,NVIDIA Device Plugin 提供了强大的 GPU 资源管理功能,包括 GPU 共享、显存申请和资源调度。

https://github.com/NVIDIA/gpu-operator https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/latest/overview.html#about-the-nvidia-gpu-operator https://github.com/NVIDIA/nvidia-docker