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 :
    1. Redémarrez votre serveur.

    2. Accédez au BIOS/UEFI en appuyant sur la touche appropriée pendant le démarrage.

    3. Localisez et activez les options “IOMMU”, “Intel VT-d” (Intel), ou “AMD-Vi” (AMD).

    4. 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 ou AMD-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) et 10de: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 pour vfio-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 sur true. Si vous utilisez Helm, cela se fait via le fichier values.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 que externalResourceProvider est true.

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.