- Authors

- Name
- Youngju Kim
- @fjvbn20031
- はじめに
- GPU OperatorとKubeVirtの統合
- GPUパススルーワークフロー
- vGPUワークフロー
- KubeVirt CR設定
- VMIスペックにGPUを接続
- ゲストOSドライバのインストール
- 全体アーキテクチャ図
- パフォーマンスの考慮事項
- ユースケース
- トラブルシューティング
- おわりに
はじめに
KubeVirtでVMをKubernetes上で実行し、GPU OperatorでGPU管理を自動化しました。この2つの技術を組み合わせて、VMでGPUアクセラレーションを活用する方法を見ていきましょう。
GPU OperatorとKubeVirtの統合
GPU OperatorはKubeVirt VMにGPUを提供するための2つのモードをサポートしています。
ノードラベリング: gpu.workload.config
nvidia.com/gpu.workload.config ラベル値によってGPUの使用モードが決定されます。
| ラベル値 | 説明 | 対象 |
|---|---|---|
| container | デフォルト。標準コンテナGPU | Pod |
| vm-passthrough | GPU全体をVMにパススルー | KubeVirt VM |
| vm-vgpu | vGPUインスタンスをVMに割り当て | KubeVirt VM |
# ノードをVMパススルーモードに設定
kubectl label node worker-gpu-01 \
nvidia.com/gpu.workload.config=vm-passthrough --overwrite
# ノードをvGPUモードに設定
kubectl label node worker-gpu-01 \
nvidia.com/gpu.workload.config=vm-vgpu --overwrite
# デフォルトのコンテナモードに復元
kubectl label node worker-gpu-01 \
nvidia.com/gpu.workload.config=container --overwrite
モード変更時の動作フロー
ノードラベル変更
|
v
GPU Operatorが変更を検知
|
v
既存GPUソフトウェアスタックをクリーンアップ
|
v
新モードに合わせたコンポーネントをデプロイ
|
+-- container: Driver + Toolkit + Device Plugin
|
+-- vm-passthrough: VFIO Manager + Sandbox Device Plugin
|
+-- vm-vgpu: vGPU Manager + Sandbox Device Plugin
GPUパススルーワークフロー
GPUパススルーは物理GPU全体をVMに直接割り当てる方式です。ネイティブに近いパフォーマンスを提供します。
ステップ1: IOMMUの有効化
BIOSとカーネルの両方でIOMMUを有効化する必要があります。
# Intel CPUの場合、カーネルパラメータを追加
# GRUB_CMDLINE_LINUX="intel_iommu=on iommu=pt"
# AMD CPUの場合
# GRUB_CMDLINE_LINUX="amd_iommu=on iommu=pt"
# GRUBを更新して再起動
sudo update-grub
sudo reboot
# IOMMUの有効化確認
dmesg | grep -i iommu
# 出力: DMAR: IOMMU enabled
ステップ2: VFIO Manager DaemonSet
GPU Operatorが自動的にVFIO Managerをデプロイします。
+------------------------------------------+
| Worker Node |
| +------------------------------------+ |
| | VFIO Manager (DaemonSet) | |
| | | |
| | 1. vfio-pciカーネルモジュールロード | |
| | 2. GPUをホストドライバからアンバインド| |
| | 3. GPUをvfio-pciにバインド | |
| | | |
| +------------------------------------+ |
| |
| GPU状態: |
| nvidiaドライバ --> vfio-pciドライバ |
+------------------------------------------+
VFIO Managerの動作過程は以下の通りです。
vfio-pciカーネルモジュールのロード- GPUデバイスをNVIDIAドライバからアンバインド
- GPUを
vfio-pciドライバにバインド - VMがGPUに直接アクセス可能に
ステップ3: Sandbox Device Plugin
Sandbox Device Pluginがパススルー可能なGPUを検出し、kubeletに登録します。
+------------------------------------------+
| Sandbox Device Plugin (DaemonSet) |
| |
| 1. VFIOにバインドされたGPUデバイスを検出 |
| 2. nvidia.com/gpuリソースとしてkubeletに登録|
| 3. KubeVirt VMがGPUを要求可能 |
+------------------------------------------+
vGPUワークフロー
vGPUは1つの物理GPUを複数のVMに分割して提供する方式です。
vGPU Managerドライバのデプロイ
+------------------------------------------+
| Worker Node |
| +------------------------------------+ |
| | vGPU Manager (DaemonSet) | |
| | | |
| | - vGPUホストドライバのインストール | |
| | - Mediated DeviceまたはSR-IOV VF | |
| | の作成 | |
| +------------------------------------+ |
| |
| +------------------------------------+ |
| | Sandbox Device Plugin | |
| | - vGPUデバイスの検出 | |
| | - nvidia.com/VGPU_TYPEとして登録 | |
| +------------------------------------+ |
+------------------------------------------+
GPUアーキテクチャ別vGPU実装
| GPUアーキテクチャ | vGPU実装方式 |
|---|---|
| Ampere以前(V100等) | Mediated Devices(MDEV) |
| Ampere(A100) | MIGバックvGPUまたはMDEV |
| Hopper以降(H100) | SR-IOV Virtual Functions |
vGPUタイプ例
A100で使用可能なvGPUプロファイルは以下の通りです。
| vGPUタイプ | フレームバッファ | 最大インスタンス |
|---|---|---|
| A100-1-5C | 5GB | 7 |
| A100-2-10C | 10GB | 3 |
| A100-3-20C | 20GB | 2 |
| A100-4-40C | 40GB | 1 |
| A100-1-5CME | 5GB(MIG) | 7 |
KubeVirt CR設定
permittedDevicesの構成
KubeVirt CRでGPUデバイスをVMで使用できるように許可する必要があります。
apiVersion: kubevirt.io/v1
kind: KubeVirt
metadata:
name: kubevirt
namespace: kubevirt
spec:
configuration:
permittedHostDevices:
pciHostDevices:
- pciVendorSelector: '10DE:20B5'
resourceName: 'nvidia.com/gpu'
externalResourceProvider: true
mediatedDevices:
- mdevNameSelector: 'NVIDIA A100-1-5C'
resourceName: 'nvidia.com/NVIDIA_A100-1-5C'
pciVendorSelector はGPUのPCIベンダー/デバイスIDです。以下のコマンドで確認できます。
# GPU PCI IDの確認
lspci -nn | grep NVIDIA
# 出力: 3b:00.0 3D controller [0302]: NVIDIA Corporation A100 [10DE:20B5]
VMIスペックにGPUを接続
GPUパススルーVMI
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
name: gpu-passthrough-vm
spec:
running: true
template:
metadata:
labels:
app: gpu-vm
spec:
domain:
cpu:
cores: 8
memory:
guest: 32Gi
devices:
disks:
- name: rootdisk
disk:
bus: virtio
gpus:
- name: gpu1
deviceName: nvidia.com/gpu
interfaces:
- name: default
masquerade: {}
networks:
- name: default
pod: {}
volumes:
- name: rootdisk
dataVolume:
name: ubuntu-gpu-dv
vGPU VMI
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
name: vgpu-vm
spec:
running: true
template:
spec:
domain:
cpu:
cores: 4
memory:
guest: 16Gi
devices:
disks:
- name: rootdisk
disk:
bus: virtio
gpus:
- name: vgpu1
deviceName: nvidia.com/NVIDIA_A100-1-5C
interfaces:
- name: default
masquerade: {}
networks:
- name: default
pod: {}
volumes:
- name: rootdisk
dataVolume:
name: ubuntu-vgpu-dv
ゲストOSドライバのインストール
GPU OperatorはVM内部にドライバをインストールしません。ゲストOSで直接インストールする必要があります。
Linuxゲスト
# VMコンソールに接続
virtctl console gpu-passthrough-vm
# NVIDIAドライバのインストール(Ubuntu)
sudo apt-get update
sudo apt-get install -y linux-headers-$(uname -r)
# NVIDIAドライバリポジトリの追加
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
# ドライバのインストール
sudo apt-get install -y nvidia-driver-550
# 再起動後に確認
sudo reboot
nvidia-smi
Windowsゲスト
1. NVIDIA公式サイトからドライバをダウンロード
- パススルー: 標準GPUドライバ
- vGPU: NVIDIA vGPUゲストドライバ
2. RDPまたはVNCでWindows VMに接続
3. ドライバインストーラーを実行
4. 再起動後、デバイスマネージャーでGPUを確認
全体アーキテクチャ図
+------------------------------------------------------------------+
| Kubernetes Cluster |
| |
| +---------------------------+ +------------------------------+ |
| | Container Node | | GPU Node (vm-passthrough) | |
| | gpu.workload.config: | | gpu.workload.config: | |
| | container | | vm-passthrough | |
| | | | | |
| | +-------+ +-------+ | | +-------------------------+ | |
| | | Pod | | Pod | | | | VFIO Manager | | |
| | | GPU:1 | | GPU:1 | | | | (vfio-pci bind) | | |
| | +-------+ +-------+ | | +-------------------------+ | |
| | | | | |
| | NVIDIA Driver | | +-------------------------+ | |
| | Container Toolkit | | | Sandbox Device Plugin | | |
| | Device Plugin | | +-------------------------+ | |
| +---------------------------+ | | |
| | +--------+ +--------+ | |
| | | VM 1 | | VM 2 | | |
| | | GPU:1 | | GPU:1 | | |
| | +--------+ +--------+ | |
| +------------------------------+ |
+------------------------------------------------------------------+
パフォーマンスの考慮事項
パススルー vs vGPU パフォーマンス比較
| 項目 | パススルー | vGPU |
|---|---|---|
| GPU使用率 | 100%(専用) | 共有(プロファイルに依存) |
| パフォーマンスオーバーヘッド | 1-3% | 5-10% |
| GPUメモリ | 全体使用可能 | プロファイルに依存 |
| VM密度 | 1 GPU = 1 VM | 1 GPU = 複数VM |
| ライブマイグレーション | 制限あり | サポート |
| ライセンス | 追加なし | vGPUライセンス必要 |
ベンチマーク参考値
以下はA100 GPUでの一般的なパフォーマンス比較です。
| ワークロード | ベアメタル | パススルー | vGPU(フルプロファイル) |
|---|---|---|---|
| ResNet-50学習 | 100% | 97-99% | 90-95% |
| BERT推論 | 100% | 98-99% | 92-96% |
| CUDAベンチマーク | 100% | 97-99% | 91-95% |
ユースケース
1. VDI(仮想デスクトップインフラ)on K8s
+--------------------------------------------------+
| Kubernetes Cluster |
| |
| +--------+ +--------+ +--------+ +--------+ |
| | Win VM | | Win VM | | Win VM | | Win VM | |
| | vGPU | | vGPU | | vGPU | | vGPU | |
| +--------+ +--------+ +--------+ +--------+ |
| | | | | |
| +----------+----------+----------+ |
| | |
| +------+------+ |
| | Physical GPU| |
| | (A100/L40) | |
| +-------------+ |
+--------------------------------------------------+
2. レガシーWindows MLワークロード
コンテナ化できないWindowsベースのMLアプリケーションをKubeVirt VMでGPUとともに実行します。
3. マルチテナントGPU分離
vGPUを使用してテナント間でGPUメモリとコンピューティングリソースをハードウェアレベルで分離します。
4. VMwareマイグレーション
既存VMware環境のGPU VMをKubeVirtに移行し、ライセンスコストを削減します。
トラブルシューティング
よくある問題と解決方法
| 問題 | 原因 | 解決方法 |
|---|---|---|
| GPUがVMに見えない | permittedDevices未設定 | KubeVirt CRにデバイスを追加 |
| VFIOバインド失敗 | IOMMU未有効化 | BIOS/カーネルIOMMU設定を確認 |
| vGPU作成失敗 | vGPU Manager未インストール | GPU Operator vGPU設定を確認 |
| ゲストでnvidia-smi失敗 | ゲストドライバ未インストール | VM内部にドライバをインストール |
# GPUデバイス状態の確認
kubectl get node worker-gpu-01 -o json | jq '.status.allocatable'
# VFIOバインド状態の確認
kubectl logs -n gpu-operator -l app=nvidia-vfio-manager
# Sandbox Device Pluginログの確認
kubectl logs -n gpu-operator -l app=nvidia-sandbox-device-plugin
おわりに
KubeVirtとGPU Operatorの組み合わせは、VMベースのGPUワークロードをKubernetesに統合する強力な方法です。パススルーは最大パフォーマンスが必要な場合に、vGPUはGPU共有と効率性が重要な場合に適しています。
次の記事では、QEMU、VirtualBox、VMware、KubeVirtを総合的に比較し、各プラットフォームの長所と短所を分析します。
クイズ:KubeVirt GPU理解度チェック
Q1. GPUパススルーモードを有効にするためのノードラベル値は?
A) container B) vm-passthrough C) gpu-direct D) vfio-passthrough
答え:B) nvidia.com/gpu.workload.config=vm-passthrough ラベルを設定します。
Q2. GPUパススルー時のVFIO Managerの役割は?
A) VM内部にGPUドライバをインストール B) GPUをvfio-pciドライバにバインド C) vGPUインスタンスを作成 D) GPUメトリクスを収集
答え:B) VFIO ManagerはGPUをNVIDIAドライバからアンバインドし、vfio-pciにバインドしてVMが直接アクセスできるようにします。
Q3. GPU OperatorがVMに対してしないことは?
A) VFIO Managerのデプロイ B) Sandbox Device Pluginのデプロイ C) ゲストOS内のGPUドライバインストール D) ノードラベリングの自動化
答え:C) GPU Operatorはホストレベルのソフトウェアのみ管理します。ゲストOS内部のGPUドライバはユーザーが直接インストールする必要があります。
Q4. vGPUの利点ではないものは?
A) 1つのGPUを複数のVMで共有 B) ライブマイグレーションのサポート C) 追加ライセンスコスト不要 D) ハードウェアレベルのGPU分離
答え:C) vGPUにはNVIDIA vGPUライセンスが必要です。パススルーには追加ライセンスは必要ありません。