当前位置: 首页 > news >正文

让 Kubernetes (K8s) 集群 使用 GPU

要让 Kubernetes (K8s) 集群 使用 GPU,并且节点是 KVM 虚拟化 出来的,需要确保以下几点:

  1. KVM 虚拟机透传 GPU(PCIe Passthrough)

  2. 宿主机和 K8s 节点正确安装 NVIDIA 驱动

  3. K8s 集群安装 nvidia-device-plugin

  4. Pod 配置 GPU 资源请求


1. KVM 虚拟机透传 GPU(PCIe Passthrough)

要让 KVM 虚拟机直接访问 GPU,必须启用 PCIe Passthrough(VFIO 直通)。

步骤 1:宿主机启用 IOMMU

编辑 /etc/default/grub,修改 GRUB_CMDLINE_LINUX

GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt"  # Intel CPU
# 或
GRUB_CMDLINE_LINUX="amd_iommu=on iommu=pt"    # AMD CPU

更新 GRUB 并重启:

sudo update-grub
sudo reboot

验证 IOMMU 是否启用:

dmesg | grep -i iommu
# 应看到类似输出:
# DMAR: IOMMU enabled

步骤 2:屏蔽宿主机 GPU 驱动

echo "options vfio-pci ids=10de:13c2,10de:0fbb" | sudo tee /etc/modprobe.d/vfio.conf  # 替换 `ids` 为你的 GPU PCI ID(用 `lspci -nn | grep NVIDIA` 查)
echo "vfio-pci" | sudo tee /etc/modules-load.d/vfio-pci.conf
sudo update-initramfs -u
sudo reboot

验证 GPU 是否绑定到 vfio-pci

lspci -nnk -d 10de:
# 应显示 `Kernel driver in use: vfio-pci`

步骤 3:KVM 虚拟机配置 GPU 直通

使用 virt-manager 或 virsh 给虚拟机添加 PCI 设备:

virsh edit <vm-name>

添加:

<hostdev mode='subsystem' type='pci' managed='yes'><source><address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/></source>
</hostdev>

(替换 bus/slot/function 为 lspci 查到的 GPU PCI 地址)


2. K8s 节点安装 NVIDIA 驱动

在 每个 K8s 节点(包括 KVM 虚拟机) 上安装 NVIDIA 驱动:

# Ubuntu/Debian
sudo apt install -y nvidia-driver-535 nvidia-dkms-535  # 替换为适合的驱动版本
sudo reboot# 验证
nvidia-smi

如果 nvidia-smi 无输出,检查:

  • KVM 直通是否成功(lspci -nnk | grep NVIDIA

  • 驱动是否正确安装(dkms status


3. K8s 集群安装 nvidia-device-plugin

方法 1:使用 Helm(推荐)

helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
helm repo update
helm install --generate-name nvidia/nvidia-device-plugin

方法 2:直接部署 DaemonSet

kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.14.1/nvidia-device-plugin.yml

检查是否正常运行:

kubectl get pods -n kube-system | grep nvidia
kubectl describe node <node-name> | grep nvidia.com/gpu

4. 在 Pod 中使用 GPU

在 Pod 的 resources.requests 中申请 GPU:

apiVersion: v1
kind: Pod
metadata:name: gpu-pod
spec:containers:- name: cuda-containerimage: nvidia/cuda:12.2.0-base-ubuntu22.04command: ["sleep", "infinity"]resources:limits:nvidia.com/gpu: 1  # 申请 1 个 GPU

部署并验证:

kubectl apply -f gpu-pod.yaml
kubectl exec -it gpu-pod -- nvidia-smi

5. 验证 K8s GPU 支持

检查节点 GPU 资源:

kubectl describe node <node-name> | grep -A 10 "Capacity"

输出应包含:

Capacity:nvidia.com/gpu:  1
Allocatable:nvidia.com/gpu:  1

常见问题

Q1: nvidia-device-plugin Pod CrashLoopBackOff

  • 检查 KVM 直通是否成功(nvidia-smi 是否能在虚拟机内运行)。

  • 检查 kubectl logs <nvidia-device-plugin-pod> 是否有错误。

Q2: Pod 无法调度(0/1 nodes are available: 1 Insufficient nvidia.com/gpu

  • 确认节点有 GPU(kubectl describe node)。

  • 检查 nvidia-device-plugin 是否正常运行。

Q3: KVM 虚拟机无法识别 GPU

  • 检查 lspci -nn | grep NVIDIA 是否显示 GPU。

  • 确保 vfio-pci 正确绑定(dmesg | grep vfio)。


总结

步骤操作
1. KVM GPU 直通启用 IOMMU + vfio-pci
2. 节点安装驱动nvidia-driver + nvidia-smi 验证
3. K8s 安装插件nvidia-device-plugin
4. Pod 申请 GPUresources.limits: nvidia.com/gpu: 1

如果你的 KVM 虚拟机成功识别 GPU,并且 K8s 节点能运行 nvidia-smi,那么 K8s 集群就可以调度 GPU 任务!

http://www.xdnf.cn/news/945901.html

相关文章:

  • 阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
  • k8s从入门到放弃之Service负载均衡
  • AWS vs 阿里云:功能、服务与性能对比指南
  • 轻量级关键点 blaze pose 2025
  • SpringCloud优势
  • 软件工程教学评价
  • CentOS 7 部署 Samba 使用虚拟用户笔记
  • centos 7 部署awstats 网站访问检测
  • GO语言---init函数
  • Vue 3 实战:【加强版】公司通知推送(WebSocket + token 校验 + 心跳机制)
  • 软件工程 期末复习
  • 【Linux开发】Hi3516dv300-DC-182型开发板显示开机logo的相关操作
  • 统计学(第8版)——假设检验学习笔记(考试用)
  • 阿里云服务器 篇十七:网站悬浮球
  • Jenkins构建时出现报错`ERROR: Failed to install JDK. Exit code=2`的终极解决方案
  • 2025年- H79-Lc187--118. 杨辉三角(找规律)--Java版
  • Java性能测试工具列举
  • 相机Camera日志实例分析之一:相机Camx【前置慢动作分辨率切换720P、1080P录制】单帧流程日志详解
  • PolyU Palmprint Database掌纹识别数据集预处理(踩坑版)
  • Maven从入门到精通指南
  • Linux边缘智能:物联网的终极进化
  • 职坐标物联网全栈开发全流程解析
  • 算法刷题-回溯
  • SpringCloudGateway 自定义局部过滤器
  • WEB3全栈开发——面试专业技能点P8DevOps / 区块链部署
  • Conda 创建新环境时报错 HTTP 502,如何解决?
  • 【Zephyr 系列 16】构建 BLE + LoRa 协同通信系统:网关转发与混合调度实战
  • 【前端实战】如何让用户回到上次阅读的位置?
  • 板凳-------Mysql cookbook学习 (十--3)
  • Tomcat Jetty 和 UnderTow 的粗略对比