Configuration du Passthrough GPU NVIDIA vers VM Windows avec KubeVirt
1. Prérequis
Serveur Linux fonctionnel.
Kubernetes installé et opérationnel.
KubeVirt et CDI (Containerized Data Importer) installés et configurés.
Une golden image Windows disponible sous forme de PersistentVolumeClaim (PVC) dans Kubernetes.
Accès administrateur (sudo ou root) au serveur Linux et au cluster Kubernetes (kubectl configuré).
Helm installé (si vous avez installé l’opérateur avec Helm).
2. Configuration du Serveur Linux pour le PCI Passthrough
Cette étape permet au système hôte de rendre le GPU accessible pour le passthrough à la VM.
- Activer IOMMU dans le BIOS/UEFI :
Redémarrez votre serveur.
Accédez au BIOS/UEFI en appuyant sur la touche appropriée pendant le démarrage.
Localisez et activez les options “IOMMU”, “Intel VT-d” (Intel), ou “AMD-Vi” (AMD).
Sauvegardez les modifications et redémarrez le serveur.
Vérifier l’activation d’IOMMU dans Linux :
dmesg | grep -E "DMAR|AMD-Vi"
La présence de lignes contenant
DMAR
ouAMD-Vi
indique que l’IOMMU est activé.Identifier les ID PCI du GPU NVIDIA :
lspci -n | grep -i nvidia
Notez les IDs vendor:device pour toutes les fonctions du GPU (contrôleur principal et audio). Exemple :
10de:1b81
(VGA) et10de:0fbc
(Audio).Charger les modules du noyau pour le PCI Passthrough :
sudo nano /etc/modules
Ajoutez les lignes suivantes :
vfio vfio_iommu_type1 vfio_pci vfio_virglgpu
Enregistrez et fermez le fichier.
Configurer GRUB pour isoler le GPU avec ``vfio-pci`` :
sudo nano /etc/default/grub
Modifiez la ligne
GRUB_CMDLINE_LINUX_DEFAULT=
en ajoutant les paramètres IOMMU et les IDs PCI pourvfio-pci
:GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on vfio-pci.ids=10de:1b81,10de:0fbc"
(Adaptez pour AMD et avec vos IDs PCI).
Enregistrez et fermez le fichier, puis mettez à jour GRUB et redémarrez :
sudo update-grub sudo reboot
3. Installation et Configuration de l’NVIDIA GPU Operator
L’opérateur NVIDIA gère les pilotes et les composants nécessaires pour l’utilisation des GPUs dans Kubernetes.
Installer l’NVIDIA GPU Operator : Suivez la documentation officielle de l’NVIDIA GPU Operator pour l’installation. Cela implique généralement l’application de CRDs et le déploiement de l’opérateur via YAML manifests ou Helm.
Activer les charges de travail sandbox pour KubeVirt : Lors de l’installation de l’opérateur, assurez-vous que le paramètre
sandboxWorkloads.enabled
est défini surtrue
. Si vous utilisez Helm, cela se fait via le fichiervalues.yaml
ou avec l’option--set
lors de l’installation :helm install nvidia-gpu-operator nvidia/gpu-operator --namespace nvidia-gpu-operator --set sandboxWorkloads.enabled=true
(Adaptez le nom du chart et le namespace si nécessaire).
4. Configuration du Passthrough GPU avec l’Opérateur NVIDIA et KubeVirt
Cette étape configure Kubernetes et KubeVirt pour permettre le passthrough du GPU.
Identifier le nom du nœud Kubernetes avec le GPU :
kubectl get nodes
Étiqueter le nœud worker pour le passthrough VM :
kubectl label node <nom_du_nœud> --overwrite nvidia.com/gpu.workload.config=vm-passthrough
Exemple :
kubectl label node worker-node --overwrite nvidia.com/gpu.workload.config=vm-passthrough
Mettre à jour la ressource personnalisée KubeVirt :
Éditez la ressource
kubevirt
pour autoriser les périphériques hôtes GPU.kubectl edit kubevirt <nom_de_l_instance_kubevirt> -n <namespace_de_kubevirt>
Modifiez la section
spec.configuration.permittedHostDevices
:spec: configuration: permittedHostDevices: pciDeviceSelectors: - pciClass: "0300" selector: "10de:1b81" - pciClass: "0403" selector: "10de:0fbc" externalResourceProvider: true
Remplacez
"10de:1b81"
et"10de:0fbc"
par les IDs vendor:device de votre GPU. Assurez-vous queexternalResourceProvider
esttrue
.
5. Configuration de KubeVirt pour la VM
Définissez la VirtualMachine
(VM) KubeVirt pour utiliser le GPU via hostDevices
.
Créer un fichier YAML pour la VM (par exemple, ``windows-vm-gpu-passthrough.yaml``) :
apiVersion: kubevirt.io/v1 kind: VirtualMachine metadata: name: windows-gpu-vm labels: kubevirt.io/os: windows spec: running: false template: metadata: labels: kubevirt.io/os: windows spec: domain: devices: interfaces: - name: default masquerade: {} disks: - name: rootdisk disk: bus: virtio - name: virtiocontainerdisk disk: bus: virtio hostDevices: - deviceName: "10de:1b81" name: gpu-controller - deviceName: "10de:0fbc" name: gpu-audio resources: requests: memory: 8Gi limits: memory: 16Gi volumes: - name: rootdisk persistentVolumeClaim: claimName: win-golden-image - name: virtiocontainerdisk containerDisk: image: registry.k8s.io/kubevirt/virtio-container-disk
Adaptez les
deviceName
avec les IDs vendor:device de votre GPU.Appliquer le manifest de la VM :
kubectl apply -f windows-vm-gpu-passthrough.yaml
Vérifier l’état de la VM :
kubectl get vms windows-gpu-vm
6. Configuration de la VM Windows
Une fois la VM démarrée, installez les pilotes NVIDIA à l’intérieur.
Se connecter à la VM Windows : Utilisez
virtctl console <nom_de_la_vm>
ou une autre méthode.Installer les pilotes NVIDIA : Téléchargez et installez les pilotes NVIDIA pour votre GPU et votre version de Windows depuis le site web de NVIDIA.
Vérifier l’installation dans le Gestionnaire de périphériques.
7. Dépannage et Points Importants
Vérifiez les logs : Utilisez
kubectl logs
pour examiner les pods de l’opérateur NVIDIA et de KubeVirt en cas de problème.Assurez-vous que l’IOMMU est correctement configuré et activé.
Les IDs PCI dans la VM YAML doivent correspondre exactement à ceux identifiés sur l’hôte.
Le nœud worker doit être correctement étiqueté.
La ressource personnalisée KubeVirt doit être configurée pour autoriser les périphériques hôtes.
Les pilotes NVIDIA doivent être installés sur l’hôte par l’opérateur et séparément dans la VM Windows.