vGPU 支援
自 v1.3.0 版本起提供
Harvester 可針對 單根 I/O 虛擬化 (Single Root IO Virtualization, SR-IOV) 分享 NVIDIA GPU 支援。這項額外的功能由 pcidevices-controller 附加元件提供,並利用 sriov-manage 進行 GPU 管理。
請查閱您的 GPU 文件以確認其是否支援 SR-IOV。有關建立支援 SR-IOV 的 NVIDIA vGPU 的更多資訊,請參閱 NVIDIA 文件。
您必須啟用 nvidia-driver-toolkit 附加元件 才能管理 GPU 裝置上的 vGPU 生命週期。
使用方法
- 在 Harvester UI 上,前往 Advanced > SR-IOV GPU Devices 並驗證以下事項:
- GPU 裝置已被掃描到。
- 相關聯的
sriovgpudevices.devices.harvesterhci.io物件已建立。

- 找到您要啟用的裝置,然後選取 : > Enable (啟用)。

- 前往 vGPU Devices 畫面並檢查相關聯的
vgpudevices.devices.harvesterhci.io物件。
請稍待片刻,讓 pcidevices-controller 掃描 vGPU 裝置,並讓 Harvester UI 顯示裝置資訊。

- 選取一個 vGPU 並設定設定檔 (profile)。

設定檔清單取決於 GPU 以及主機底層的 /sys 樹狀結構。有關可用設定檔及其功能的更多資訊,請參閱 NVIDIA 文件。
在您選取第一個設定檔後,NVIDIA 驅動程式會自動設定其餘 vGPU 可用的設定檔。
- 將 vGPU 掛接到新的或現有的 VM。

一旦 vGPU 被分配給 VM,在移除該 vGPU 之前,可能無法停用該 VM。
Rancher 管理叢集中的 vGPU 裝置
自 Harvester v1.3.0 引入 vGPU 支援以來,Rancher 已允許將 vGPU 掛接到在 Rancher 管理的 Harvester 叢集上執行的虛擬機器。然而,Rancher 最初無法追蹤跨虛擬機器的 vGPU 裝置分配情況。您可能會建立無法被滿足的 vGPU 裝置請求的虛擬機器,並將沒有可分配裝置的 vGPU 設定檔指派給客體叢集 (guest clusters)。結果導致受影響的虛擬機器變成無法排程 (unschedulable),且 Rancher 會不斷嘗試重新建立這些虛擬機器但未果。
Harvester v1.3.0 和 v1.4.0 中的增強功能允許特定的 Rancher 版本識別所有 Harvester 節點上的可分配 vGPU 裝置。Rancher v2.8 和 v2.9 會在 UI 上顯示此資訊,並在 vGPU 設定檔的可分配裝置數量不符合所需數量時,阻止該設定檔的指派。
您必須安裝特定版本的 Harvester 和 Rancher,才能充分利用改進的 vGPU 追蹤和分配機制。
- Harvester: 1.3.2 或 v1.4.0
- Rancher: v2.8.9, 2.9.3, 或 2.10.0
如果您升級了 Rancher 但繼續使用不包含這些增強功能的 Harvester 版本,當您使用升級後的 Rancher UI 將 vGPU 設定檔指派給虛擬機器時,Harvester 將無法追蹤這些設定檔。
限制
掛接多個 vGPU:
將多個 vGPU 掛接到同一個 VM 可能會失敗,原因如下:
-
並非所有 vGPU 設定檔都支援掛接多個 vGPU。NVIDIA 文件 列出了支援此功能的 vGPU 設定檔。例如,如果您使用 NVIDIA A2 或 A16 GPU,請注意只有 Q 系列 vGPU 允許您掛接多個 vGPU。

-
VM 定義中只能有 1 個 GPU 裝置啟用
ramFB。若要掛接多個 vGPU,您必須編輯 VM 設定(YAML 格式),並將virtualGPUOptions新增至所有非主要的 vGPU 裝置。
virtualGPUOptions:
display:
ramFB:
enabled: false
相關議題:https://github.com/harvester/harvester/issues/5289
可用 vGPU 的上限
當 GPU 上啟用 vGPU 支援時,NVIDIA 驅動程式預設會建立 16 個 vGPU 裝置。在您選取第一個設定檔後,NVIDIA 驅動程式會自動設定其餘 vGPU 可用的設定檔。
所使用的設定檔也決定了每個 GPU 可用的 vGPU 最大數量。一旦達到上限,其餘 vGPU 將無法選取任何設定檔,這些裝置也無法進行設定。
範例 (NVIDIA A2 GPU):
如果您選取 NVIDIA A2-4Q 設定檔,您只能設定 4 個 vGPU 裝置。一旦這些裝置設定完成,您將無法為其餘的 vGPU 選取任何設定檔。

技術深入探討
pcidevices-controller 引入了以下 CRD:
- sriovgpudevices.devices.harvesterhci.io
- vgpudevices.devices.harvesterhci.io
開機時,pcidevices-controller 會 掃描主機上支援 SR-IOV vGPU 裝置的 NVIDIA GPU。當發現此類裝置時,它們會以 CRD 的形式表示。
範例:
apiVersion: devices.harvesterhci.io/v1beta1
kind: SRIOVGPUDevice
metadata:
creationTimestamp: "2024-02-21T05:57:37Z"
generation: 2
labels:
nodename: harvester-kgd9c
name: harvester-kgd9c-000008000
resourceVersion: "6641619"
uid: e3a97ee4-046a-48d7-820d-8c6b45cd07da
spec:
address: "0000:08:00.0"
enabled: true
nodeName: harvester-kgd9c
status:
vGPUDevices:
- harvester-kgd9c-000008004
- harvester-kgd9c-000008005
- harvester-kgd9c-000008016
- harvester-kgd9c-000008017
- harvester-kgd9c-000008020
- harvester-kgd9c-000008021
- harvester-kgd9c-000008022
- harvester-kgd9c-000008023
- harvester-kgd9c-000008006
- harvester-kgd9c-000008007
- harvester-kgd9c-000008010
- harvester-kgd9c-000008011
- harvester-kgd9c-000008012
- harvester-kgd9c-000008013
- harvester-kgd9c-000008014
- harvester-kgd9c-000008015
vfAddresses:
- "0000:08:00.4"
- "0000:08:00.5"
- "0000:08:01.6"
- "0000:08:01.7"
- "0000:08:02.0"
- "0000:08:02.1"
- "0000:08:02.2"
- "0000:08:02.3"
- "0000:08:00.6"
- "0000:08:00.7"
- "0000:08:01.0"
- "0000:08:01.1"
- "0000:08:01.2"
- "0000:08:01.3"
- "0000:08:01.4"
- "0000:08:01.5"
當 SRIOVGPUDevice 被啟用時,pcidevices 控制器會與 nvidia-driver-toolkit daemonset 協同工作以管理 GPU 裝置。
在 pcidevices 隨後掃描 /sys 樹狀結構時,vGPU 裝置會被 pcidevices 控制器掃描到,並作為 VGPUDevices CRD 進行管理。
NAME ADDRESS NODE NAME ENABLED UUID VGPUTYPE PARENTGPUDEVICE
harvester-kgd9c-000008004 0000:08:00.4 harvester-kgd9c true dd6772a8-7db8-4e96-9a73-f94c389d9bc3 NVIDIA A2-4A 0000:08:00.0
harvester-kgd9c-000008005 0000:08:00.5 harvester-kgd9c true 9534e04b-4687-412b-833e-3ae95b97d4d1 NVIDIA A2-4Q 0000:08:00.0
harvester-kgd9c-000008006 0000:08:00.6 harvester-kgd9c true a16e5966-9f7a-48a9-bda8-0d1670e740f8 NVIDIA A2-4A 0000:08:00.0
harvester-kgd9c-000008007 0000:08:00.7 harvester-kgd9c true 041ee3ce-f95c-451e-a381-1c9fe71918b2 NVIDIA A2-4Q 0000:08:00.0
harvester-kgd9c-000008010 0000:08:01.0 harvester-kgd9c false 0000:08:00.0
harvester-kgd9c-000008011 0000:08:01.1 harvester-kgd9c false 0000:08:00.0
harvester-kgd9c-000008012 0000:08:01.2 harvester-kgd9c false 0000:08:00.0
harvester-kgd9c-000008013 0000:08:01.3 harvester-kgd9c false 0000:08:00.0
harvester-kgd9c-000008014 0000:08:01.4 harvester-kgd9c false 0000:08:00.0
harvester-kgd9c-000008015 0000:08:01.5 harvester-kgd9c false 0000:08:00.0
harvester-kgd9c-000008016 0000:08:01.6 harvester-kgd9c false 0000:08:00.0
harvester-kgd9c-000008017 0000:08:01.7 harvester-kgd9c false 0000:08:00.0
harvester-kgd9c-000008020 0000:08:02.0 harvester-kgd9c false 0000:08:00.0
harvester-kgd9c-000008021 0000:08:02.1 harvester-kgd9c false 0000:08:00.0
harvester-kgd9c-000008022 0000:08:02.2 harvester-kgd9c false 0000:08:00.0
harvester-kgd9c-000008023 0000:08:02.3 harvester-kgd9c false 0000:08:00.0
當使用者為 VGPUDevice 啟用並選取設定檔時,pcidevices 控制器會設定該裝置,並在該裝置上設定正確的設定檔。
apiVersion: devices.harvesterhci.io/v1beta1
kind: VGPUDevice
metadata:
creationTimestamp: "2024-02-26T03:04:47Z"
generation: 8
labels:
harvesterhci.io/parentSRIOVGPUDevice: harvester-kgd9c-000008000
nodename: harvester-kgd9c
name: harvester-kgd9c-000008004
resourceVersion: "21051017"
uid: b9c7af64-1e47-467f-bf3d-87b7bc3a8911
spec:
address: "0000:08:00.4"
enabled: true
nodeName: harvester-kgd9c
parentGPUDeviceAddress: "0000:08:00.0"
vGPUTypeName: NVIDIA A2-4A
status:
configureVGPUTypeName: NVIDIA A2-4A
uuid: dd6772a8-7db8-4e96-9a73-f94c389d9bc3
vGPUStatus: vGPUConfigured
pcidevices 控制器還會執行一個 vGPU device plugin (裝置外掛程式),該外掛程式會向 kubelet 公告各種 vGPU 設定檔的詳細資訊。然後 k8s scheduler (排程器) 會使用這些資訊將請求 vGPU 的 VM 放置到正確的節點上。
(⎈|local:harvester-system)➜ ~ k get nodes harvester-kgd9c -o yaml | yq .status.allocatable
cpu: "24"
devices.kubevirt.io/kvm: 1k
devices.kubevirt.io/tun: 1k
devices.kubevirt.io/vhost-net: 1k
ephemeral-storage: "149527126718"
hugepages-1Gi: "0"
hugepages-2Mi: "0"
[intel.com/82599_ETHERNET_CONTROLLER_VIRTUAL_FUNCTION](https://intel.com/82599_ETHERNET_CONTROLLER_VIRTUAL_FUNCTION): "1"
memory: 131858088Ki
[nvidia.com/NVIDIA_A2-4A](https://nvidia.com/NVIDIA_A2-4A): "2"
[nvidia.com/NVIDIA_A2-4C](https://nvidia.com/NVIDIA_A2-4C): "0"
[nvidia.com/NVIDIA_A2-4Q](https://nvidia.com/NVIDIA_A2-4Q): "2"
pods: "200"
pcidevices 控制器還會設定與 KubeVirt 的整合,並在 KubeVirt CR 中將 vGPU 裝置公告為外部管理裝置,以確保 VM 可以使用該 vGPU。