让 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-managervirsh 给虚拟机添加 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/functionlspci 查到的 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-container
    image: nvidia/cuda:12.2.0-base-ubuntu22.04
    command: ["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 申请 GPU resources.limits: nvidia.com/gpu: 1

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

相关推荐
ReadThroughLife43 分钟前
【已解决】MACOS M4 芯片使用 Docker Desktop 工具安装 MICROSOFT SQL SERVER
microsoft·macos·docker·容器
KrityCat1 小时前
阿里云Alibaba Cloud安装Docker与Docker compose【图文教程】
阿里云·docker·容器
Orlando cron3 小时前
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
网络·tcp/ip·kubernetes
炎码工坊7 小时前
微服务通信安全实战:JWT在分布式架构中的应用与最佳实践
安全·网络安全·云原生·系统安全·安全架构
藥瓿亭9 小时前
K8S认证|CKS题库+答案| 9. 网络策略 NetworkPolicy
linux·运维·docker·云原生·容器·kubernetes·cks
955.9 小时前
k8s从入门到放弃之Pod的容器探针检测
云原生·容器·kubernetes
yunken2811 小时前
docker容器保存为不依赖基础镜像的独立镜像方法
java·docker·容器
langmeng11011 小时前
使用docker在3台服务器上搭建基于版本redis 6.x的一主两从模式
运维·redis·docker·容器·集群
leblancAndSherry12 小时前
Gitlab + Jenkins 实现 CICD
linux·运维·docker·kubernetes·gitlab·jenkins
脑瓜嗡16 小时前
Docker部署SpringBoot项目
spring boot·docker·容器