10.18. Gestion avancée des machines virtuelles


10.18.1. Travailler avec des quotas de ressources pour les machines virtuelles

Créer et gérer des quotas de ressources pour les machines virtuelles.

10.18.1.1. Définir des limites de quotas de ressources pour les machines virtuelles

Les quotas de ressources qui n'utilisent que des demandes fonctionnent automatiquement avec les machines virtuelles (VM). Si votre quota de ressources utilise des limites, vous devez définir manuellement des limites de ressources sur les machines virtuelles. Les limites de ressources doivent être supérieures d'au moins 100 Mo aux demandes de ressources.

Procédure

  1. Définissez des limites pour une VM en modifiant le manifeste VirtualMachine. Par exemple :

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: with-limits
    spec:
      running: false
      template:
        spec:
          domain:
    # ...
            resources:
              requests:
                memory: 128Mi
              limits:
                memory: 256Mi  1
    1
    Cette configuration est supportée parce que la valeur limits.memory est au moins 100Mi plus grande que la valeur requests.memory.
  2. Sauvegarder le manifeste VirtualMachine.

10.18.1.2. Ressources supplémentaires

10.18.2. Spécifier des nœuds pour les machines virtuelles

Vous pouvez placer des machines virtuelles (VM) sur des nœuds spécifiques en utilisant des règles de placement de nœuds.

10.18.2.1. À propos du placement des nœuds pour les machines virtuelles

Pour garantir que les machines virtuelles (VM) s'exécutent sur les nœuds appropriés, vous pouvez configurer des règles de placement des nœuds. Cette opération peut s'avérer utile dans les cas suivants

  • Vous avez plusieurs machines virtuelles. Pour garantir la tolérance aux pannes, vous souhaitez qu'elles s'exécutent sur des nœuds différents.
  • Vous avez deux machines virtuelles bavardes. Pour éviter la redondance du routage inter-nœuds, vous souhaitez que les VM s'exécutent sur le même nœud.
  • Vos machines virtuelles nécessitent des caractéristiques matérielles spécifiques qui ne sont pas présentes sur tous les nœuds disponibles.
  • Vous avez un module qui ajoute des capacités à un nœud et vous voulez placer une VM sur ce nœud pour qu'elle puisse utiliser ces capacités.
Note

Le placement des machines virtuelles s'appuie sur les règles de placement des charges de travail dans les nœuds. Si des charges de travail sont exclues de certains nœuds au niveau du composant, les machines virtuelles ne peuvent pas être placées sur ces nœuds.

Vous pouvez utiliser les types de règles suivants dans le champ spec d'un manifeste VirtualMachine:

nodeSelector
Permet de planifier des machines virtuelles sur des nœuds étiquetés avec la ou les paires clé-valeur spécifiées dans ce champ. Les étiquettes du nœud doivent correspondre exactement à toutes les paires répertoriées.
affinity

Permet d'utiliser une syntaxe plus expressive pour définir des règles qui font correspondre les nœuds aux machines virtuelles. Par exemple, vous pouvez spécifier qu'une règle est une préférence plutôt qu'une exigence absolue, de sorte que les machines virtuelles soient toujours planifiées si la règle n'est pas respectée. L'affinité de pod, l'anti-affinité de pod et l'affinité de nœud sont prises en charge pour le placement des machines virtuelles. L'affinité de pod fonctionne pour les machines virtuelles car le type de charge de travail VirtualMachine est basé sur l'objet Pod.

Note

Les règles d'affinité ne s'appliquent que lors de la planification. OpenShift Container Platform ne replanifie pas les charges de travail en cours d'exécution si les contraintes ne sont plus respectées.

tolerations
Permet aux machines virtuelles d'être planifiées sur des nœuds qui ont des taches correspondantes. Si une erreur est appliquée à un nœud, ce nœud n'accepte que les machines virtuelles qui tolèrent l'erreur.

10.18.2.2. Exemples de placement de nœuds

Les exemples suivants d'extraits de fichiers YAML utilisent les champs nodePlacement, affinity et tolerations pour personnaliser l'emplacement des nœuds pour les machines virtuelles.

10.18.2.2.1. Exemple : Placement de nœuds de VM avec nodeSelector

Dans cet exemple, la machine virtuelle a besoin d'un nœud dont les métadonnées contiennent des étiquettes example-key-1 = example-value-1 et example-key-2 = example-value-2.

Avertissement

Si aucun nœud ne correspond à cette description, la machine virtuelle n'est pas planifiée.

Exemple de manifeste VM

metadata:
  name: example-vm-node-selector
apiVersion: kubevirt.io/v1
kind: VirtualMachine
spec:
  template:
    spec:
      nodeSelector:
        example-key-1: example-value-1
        example-key-2: example-value-2
...

10.18.2.2.2. Exemple : Placement de nœuds VM avec affinité de pod et anti-affinité de pod

Dans cet exemple, la VM doit être programmée sur un nœud disposant d'un pod en cours d'exécution portant l'étiquette example-key-1 = example-value-1. Si aucun pod de ce type n'est en cours d'exécution sur un nœud, la VM n'est pas programmée.

Dans la mesure du possible, la VM n'est pas programmée sur un nœud qui possède un pod portant l'étiquette example-key-2 = example-value-2. Cependant, si tous les nœuds candidats ont un pod avec ce label, l'ordonnanceur ignore cette contrainte.

Exemple de manifeste VM

metadata:
  name: example-vm-pod-affinity
apiVersion: kubevirt.io/v1
kind: VirtualMachine
spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution: 1
      - labelSelector:
          matchExpressions:
          - key: example-key-1
            operator: In
            values:
            - example-value-1
        topologyKey: kubernetes.io/hostname
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution: 2
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: example-key-2
              operator: In
              values:
              - example-value-2
          topologyKey: kubernetes.io/hostname
...

1
Si vous utilisez le type de règle requiredDuringSchedulingIgnoredDuringExecution, la VM n'est pas planifiée si la contrainte n'est pas respectée.
2
Si vous utilisez le type de règle preferredDuringSchedulingIgnoredDuringExecution, la VM est toujours planifiée si la contrainte n'est pas respectée, à condition que toutes les contraintes requises soient respectées.
10.18.2.2.3. Exemple : Placement de nœuds de VM avec affinité de nœuds

Dans cet exemple, la VM doit être programmée sur un nœud portant l'étiquette example.io/example-key = example-value-1 ou l'étiquette example.io/example-key = example-value-2. La contrainte est respectée si une seule des étiquettes est présente sur le nœud. Si aucune étiquette n'est présente, la VM n'est pas programmée.

Dans la mesure du possible, l'ordonnanceur évite les nœuds portant l'étiquette example-node-label-key = example-node-label-value. Toutefois, si tous les nœuds candidats portent cette étiquette, l'ordonnanceur ignore cette contrainte.

Exemple de manifeste VM

metadata:
  name: example-vm-node-affinity
apiVersion: kubevirt.io/v1
kind: VirtualMachine
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution: 1
        nodeSelectorTerms:
        - matchExpressions:
          - key: example.io/example-key
            operator: In
            values:
            - example-value-1
            - example-value-2
      preferredDuringSchedulingIgnoredDuringExecution: 2
      - weight: 1
        preference:
          matchExpressions:
          - key: example-node-label-key
            operator: In
            values:
            - example-node-label-value
...

1
Si vous utilisez le type de règle requiredDuringSchedulingIgnoredDuringExecution, la VM n'est pas planifiée si la contrainte n'est pas respectée.
2
Si vous utilisez le type de règle preferredDuringSchedulingIgnoredDuringExecution, la VM est toujours planifiée si la contrainte n'est pas respectée, à condition que toutes les contraintes requises soient respectées.
10.18.2.2.4. Exemple : Placement de nœuds de VM avec tolérances

Dans cet exemple, les nœuds réservés aux machines virtuelles sont déjà marqués de l'erreur key=virtualization:NoSchedule. Étant donné que cette machine virtuelle a une adresse tolerations correspondante, elle peut planifier sur les nœuds entachés.

Note

Une machine virtuelle qui tolère une erreur n'est pas obligée de planifier sur un nœud avec cette erreur.

Exemple de manifeste VM

metadata:
  name: example-vm-tolerations
apiVersion: kubevirt.io/v1
kind: VirtualMachine
spec:
  tolerations:
  - key: "key"
    operator: "Equal"
    value: "virtualization"
    effect: "NoSchedule"
...

10.18.2.3. Ressources supplémentaires

10.18.3. Configuration de la rotation des certificats

Configurer les paramètres de rotation des certificats pour remplacer les certificats existants.

10.18.3.1. Configuration de la rotation des certificats

Vous pouvez le faire pendant l'installation d'OpenShift Virtualization dans la console web ou après l'installation dans la ressource personnalisée (CR) HyperConverged.

Procédure

  1. Ouvrez le CR HyperConverged en exécutant la commande suivante :

    $ oc edit hco -n openshift-cnv kubevirt-hyperconverged
  2. Modifiez les champs spec.certConfig comme indiqué dans l'exemple suivant. Pour éviter de surcharger le système, assurez-vous que toutes les valeurs sont supérieures ou égales à 10 minutes. Exprimez toutes les valeurs sous forme de chaînes de caractères conformes au format golang ParseDuration .

    apiVersion: hco.kubevirt.io/v1beta1
    kind: HyperConverged
    metadata:
     name: kubevirt-hyperconverged
     namespace: openshift-cnv
    spec:
      certConfig:
        ca:
          duration: 48h0m0s
          renewBefore: 24h0m0s 1
        server:
          duration: 24h0m0s  2
          renewBefore: 12h0m0s  3
    1
    La valeur de ca.renewBefore doit être inférieure ou égale à la valeur de ca.duration.
    2
    La valeur de server.duration doit être inférieure ou égale à la valeur de ca.duration.
    3
    La valeur de server.renewBefore doit être inférieure ou égale à la valeur de server.duration.
  3. Appliquez le fichier YAML à votre cluster.

10.18.3.2. Dépannage des paramètres de rotation des certificats

La suppression d'une ou de plusieurs valeurs de certConfig entraîne le retour aux valeurs par défaut, à moins que les valeurs par défaut n'entrent en conflit avec l'une des conditions suivantes :

  • La valeur de ca.renewBefore doit être inférieure ou égale à la valeur de ca.duration.
  • La valeur de server.duration doit être inférieure ou égale à la valeur de ca.duration.
  • La valeur de server.renewBefore doit être inférieure ou égale à la valeur de server.duration.

Si les valeurs par défaut sont en conflit avec ces conditions, vous recevrez un message d'erreur.

Si vous supprimez la valeur server.duration dans l'exemple suivant, la valeur par défaut de 24h0m0s est supérieure à la valeur de ca.duration, ce qui est contraire aux conditions spécifiées.

Exemple :

certConfig:
   ca:
     duration: 4h0m0s
     renewBefore: 1h0m0s
   server:
     duration: 4h0m0s
     renewBefore: 4h0m0s

Il en résulte le message d'erreur suivant :

error: hyperconvergeds.hco.kubevirt.io "kubevirt-hyperconverged" could not be patched: admission webhook "validate-hco.kubevirt.io" denied the request: spec.certConfig: ca.duration is smaller than server.duration

Le message d'erreur ne mentionne que le premier conflit. Vérifiez toutes les valeurs de certConfig avant de poursuivre.

10.18.4. Utilisation du mode UEFI pour les machines virtuelles

Vous pouvez démarrer une machine virtuelle (VM) en mode UEFI (Unified Extensible Firmware Interface).

10.18.4.1. À propos du mode UEFI pour les machines virtuelles

L'Unified Extensible Firmware Interface (UEFI), à l'instar de l'ancien BIOS, initialise les composants matériels et les fichiers image du système d'exploitation au démarrage de l'ordinateur. L'UEFI prend en charge des fonctions et des options de personnalisation plus modernes que le BIOS, ce qui permet des temps de démarrage plus rapides.

Il stocke toutes les informations relatives à l'initialisation et au démarrage dans un fichier portant l'extension .efi, qui est stocké sur une partition spéciale appelée partition système EFI (ESP). L'ESP contient également les programmes de démarrage du système d'exploitation installé sur l'ordinateur.

10.18.4.2. Démarrage des machines virtuelles en mode UEFI

Vous pouvez configurer une machine virtuelle pour qu'elle démarre en mode UEFI en modifiant le manifeste VirtualMachine.

Conditions préalables

  • Installez le CLI OpenShift (oc).

Procédure

  1. Modifiez ou créez un fichier manifeste VirtualMachine. Utilisez la strophe spec.firmware.bootloader pour configurer le mode UEFI :

    Démarrage en mode UEFI avec démarrage sécurisé actif

    apiversion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      labels:
        special: vm-secureboot
      name: vm-secureboot
    spec:
      template:
        metadata:
          labels:
            special: vm-secureboot
        spec:
          domain:
            devices:
              disks:
              - disk:
                  bus: virtio
                name: containerdisk
            features:
              acpi: {}
              smm:
                enabled: true 1
            firmware:
              bootloader:
                efi:
                  secureBoot: true 2
    ...

    1
    OpenShift Virtualization nécessite que le mode de gestion du système (SMM) soit activé pour que le démarrage sécurisé en mode UEFI se produise.
    2
    OpenShift Virtualization supporte une VM avec ou sans Secure Boot lors de l'utilisation du mode UEFI. Si Secure Boot est activé, le mode UEFI est requis. Cependant, le mode UEFI peut être activé sans utiliser le mode Secure Boot.
  2. Appliquez le manifeste à votre cluster en exécutant la commande suivante :

    oc create -f <nom_du_fichier>.yaml

10.18.5. Configuration du démarrage PXE pour les machines virtuelles

Le démarrage PXE, ou démarrage en réseau, est disponible dans OpenShift Virtualization. Le démarrage en réseau permet à un ordinateur de démarrer et de charger un système d'exploitation ou un autre programme sans nécessiter de périphérique de stockage connecté localement. Par exemple, vous pouvez l'utiliser pour choisir votre image de système d'exploitation souhaitée à partir d'un serveur PXE lors du déploiement d'un nouvel hôte.

10.18.5.1. Conditions préalables

  • Un pont Linux doit être connecté.
  • Le serveur PXE doit être connecté au même VLAN que le pont.

10.18.5.2. Démarrage PXE avec une adresse MAC spécifiée

En tant qu'administrateur, vous pouvez démarrer un client sur le réseau en créant d'abord un objet NetworkAttachmentDefinition pour votre réseau PXE. Ensuite, faites référence à la définition de l'attachement réseau dans votre fichier de configuration de l'instance de machine virtuelle avant de démarrer l'instance de machine virtuelle. Vous pouvez également spécifier une adresse MAC dans le fichier de configuration de l'instance de machine virtuelle, si le serveur PXE l'exige.

Conditions préalables

  • Un pont Linux doit être connecté.
  • Le serveur PXE doit être connecté au même VLAN que le pont.

Procédure

  1. Configurer un réseau PXE sur le cluster :

    1. Créer le fichier de définition de l'attachement réseau pour le réseau PXE pxe-net-conf:

      apiVersion: "k8s.cni.cncf.io/v1"
      kind: NetworkAttachmentDefinition
      metadata:
        name: pxe-net-conf
      spec:
        config: '{
          "cniVersion": "0.3.1",
          "name": "pxe-net-conf",
          "plugins": [
            {
              "type": "cnv-bridge",
              "bridge": "br1",
              "vlan": 1 1
            },
            {
              "type": "cnv-tuning" 2
            }
          ]
        }'
      1
      Facultatif : La balise VLAN.
      2
      Le plugin cnv-tuning prend en charge les adresses MAC personnalisées.
      Note

      L'instance de machine virtuelle sera connectée au pont br1 via un port d'accès avec le VLAN demandé.

  2. Créez la définition de la pièce jointe au réseau en utilisant le fichier que vous avez créé à l'étape précédente :

    $ oc create -f pxe-net-conf.yaml
  3. Modifiez le fichier de configuration de l'instance de la machine virtuelle pour y inclure les détails de l'interface et du réseau.

    1. Spécifiez le réseau et l'adresse MAC, si le serveur PXE l'exige. Si l'adresse MAC n'est pas spécifiée, une valeur est attribuée automatiquement.

      Assurez-vous que bootOrder est défini sur 1 afin que l'interface démarre en premier. Dans cet exemple, l'interface est connectée à un réseau appelé <pxe-net>:

      interfaces:
      - masquerade: {}
        name: default
      - bridge: {}
        name: pxe-net
        macAddress: de:00:00:00:00:de
        bootOrder: 1
      Note

      L'ordre de démarrage est global pour les interfaces et les disques.

    2. Attribuez un numéro de périphérique de démarrage au disque afin de garantir un démarrage correct après le provisionnement du système d'exploitation.

      Réglez la valeur du disque bootOrder sur 2:

      devices:
        disks:
        - disk:
            bus: virtio
          name: containerdisk
          bootOrder: 2
    3. Spécifiez que le réseau est connecté à la définition de l'attachement au réseau créée précédemment. Dans ce scénario, <pxe-net> est connecté à la définition d'attachement au réseau appelée <pxe-net-conf>:

      networks:
      - name: default
        pod: {}
      - name: pxe-net
        multus:
          networkName: pxe-net-conf
  4. Créer l'instance de la machine virtuelle :

    $ oc create -f vmi-pxe-boot.yaml

Exemple de sortie

  virtualmachineinstance.kubevirt.io "vmi-pxe-boot" created

  1. Attendez que l'instance de la machine virtuelle s'exécute :

    $ oc get vmi vmi-pxe-boot -o yaml | grep -i phase
      phase: Running
  2. Visualisez l'instance de la machine virtuelle à l'aide de VNC :

    $ virtctl vnc vmi-pxe-boot
  3. Observez l'écran de démarrage pour vérifier que le démarrage PXE est réussi.
  4. Connectez-vous à l'instance de la machine virtuelle :

    $ virtctl console vmi-pxe-boot
  5. Vérifiez les interfaces et l'adresse MAC sur la machine virtuelle et que l'interface connectée au pont a l'adresse MAC spécifiée. Dans ce cas, nous avons utilisé eth1 pour le démarrage PXE, sans adresse IP. L'autre interface, eth0, a reçu une adresse IP de OpenShift Container Platform.

    $ ip addr

Exemple de sortie

...
3. eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
   link/ether de:00:00:00:00:de brd ff:ff:ff:ff:ff:ff

10.18.5.3. Glossaire de la mise en réseau de la virtualisation OpenShift

OpenShift Virtualization offre des fonctionnalités avancées de mise en réseau en utilisant des ressources et des plugins personnalisés.

Les termes suivants sont utilisés dans la documentation d'OpenShift Virtualization :

Interface de réseau de conteneurs (CNI)
un projet de la Cloud Native Computing Foundation, axé sur la connectivité réseau des conteneurs. OpenShift Virtualization utilise des plugins CNI pour s'appuyer sur la fonctionnalité réseau de base de Kubernetes.
Multus
un plugin CNI "meta" Plugin CNI qui permet à plusieurs CNI d'exister afin qu'un pod ou une machine virtuelle puisse utiliser les interfaces dont il a besoin.
Définition des ressources personnalisées (CRD)
une ressource de l'API Kubernetes qui vous permet de définir des ressources personnalisées, ou un objet défini à l'aide de la ressource de l'API CRD.
Définition de l'attachement au réseau (NAD)
un CRD introduit par le projet Multus qui permet d'attacher des pods, des machines virtuelles et des instances de machines virtuelles à un ou plusieurs réseaux.
Politique de configuration du réseau de nœuds (NNCP)
une description de la configuration réseau requise sur les nœuds. Vous mettez à jour la configuration du réseau des nœuds, notamment en ajoutant ou en supprimant des interfaces, en appliquant un manifeste NodeNetworkConfigurationPolicy à la grappe.
Environnement d'exécution avant démarrage (PXE)
une interface qui permet à un administrateur de démarrer une machine cliente à partir d'un serveur via le réseau. Le démarrage en réseau permet de charger à distance des systèmes d'exploitation et d'autres logiciels sur le client.

10.18.6. Utilisation de pages volumineuses avec des machines virtuelles

Vous pouvez utiliser d'énormes pages comme mémoire de secours pour les machines virtuelles de votre cluster.

10.18.6.1. Conditions préalables

10.18.6.2. Ce que font les grandes pages

La mémoire est gérée par blocs appelés pages. Sur la plupart des systèmes, une page correspond à 4Ki. 1Mi de mémoire équivaut à 256 pages ; 1Gi de mémoire équivaut à 256 000 pages, et ainsi de suite. Les unités centrales de traitement disposent d'une unité de gestion de la mémoire intégrée qui gère une liste de ces pages au niveau matériel. Le Translation Lookaside Buffer (TLB) est une petite mémoire cache matérielle des correspondances entre les pages virtuelles et les pages physiques. Si l'adresse virtuelle transmise dans une instruction matérielle peut être trouvée dans le TLB, la correspondance peut être déterminée rapidement. Si ce n'est pas le cas, la TLB est manquée et le système revient à une traduction d'adresse plus lente, basée sur le logiciel, ce qui entraîne des problèmes de performance. La taille de la TLB étant fixe, le seul moyen de réduire le risque d'erreur de la TLB est d'augmenter la taille de la page.

Une page énorme est une page de mémoire dont la taille est supérieure à 4Ki. Sur les architectures x86_64, il existe deux tailles courantes de pages énormes : 2Mi et 1Gi. Les tailles varient sur les autres architectures. Pour utiliser les pages énormes, le code doit être écrit de manière à ce que les applications en soient conscientes. Les pages énormes transparentes (THP) tentent d'automatiser la gestion des pages énormes sans que l'application en ait connaissance, mais elles ont des limites. En particulier, elles sont limitées à des tailles de page de 2Mi. Les THP peuvent entraîner une dégradation des performances sur les nœuds à forte utilisation ou fragmentation de la mémoire en raison des efforts de défragmentation des THP, qui peuvent bloquer les pages de mémoire. Pour cette raison, certaines applications peuvent être conçues pour (ou recommander) l'utilisation d'énormes pages pré-allouées au lieu de THP.

Dans OpenShift Virtualization, les machines virtuelles peuvent être configurées pour consommer des pages énormes pré-allouées.

10.18.6.3. Configuration de pages volumineuses pour les machines virtuelles

Vous pouvez configurer les machines virtuelles pour qu'elles utilisent des pages énormes pré-allouées en incluant les paramètres memory.hugepages.pageSize et resources.requests.memory dans la configuration de votre machine virtuelle.

La demande de mémoire doit être divisible par la taille de la page. Par exemple, vous ne pouvez pas demander la mémoire 500Mi avec une taille de page de 1Gi.

Note

Les configurations de la mémoire de l'hôte et du système d'exploitation invité ne sont pas liées. Les pages volumineuses demandées dans le manifeste de la machine virtuelle s'appliquent à QEMU. Les pages volumineuses à l'intérieur de l'invité ne peuvent être configurées qu'en fonction de la quantité de mémoire disponible de l'instance de la machine virtuelle.

Si vous modifiez une machine virtuelle en cours d'exécution, celle-ci doit être redémarrée pour que les modifications soient prises en compte.

Conditions préalables

  • Les nœuds doivent avoir des pages énormes pré-allouées configurées.

Procédure

  1. Dans la configuration de votre machine virtuelle, ajoutez les paramètres resources.requests.memory et memory.hugepages.pageSize au paramètre spec.domain. L'extrait de configuration suivant concerne une machine virtuelle qui demande un total de 4Gi de mémoire avec une taille de page de 1Gi:

    kind: VirtualMachine
    ...
    spec:
      domain:
        resources:
          requests:
            memory: "4Gi" 1
        memory:
          hugepages:
            pageSize: "1Gi" 2
    ...
    1
    La quantité totale de mémoire demandée pour la machine virtuelle. Cette valeur doit être divisible par la taille de la page.
    2
    La taille de chaque grande page. Les valeurs valables pour l'architecture x86_64 sont 1Gi et 2Mi. La taille de la page doit être inférieure à la mémoire demandée.
  2. Appliquer la configuration de la machine virtuelle :

    oc apply -f <virtual_machine>.yaml

10.18.7. Activation de ressources dédiées pour les machines virtuelles

Pour améliorer les performances, vous pouvez dédier des ressources de nœuds, telles que l'unité centrale, à une machine virtuelle.

10.18.7.1. À propos des ressources dédiées

Lorsque vous activez les ressources dédiées pour votre machine virtuelle, la charge de travail de votre machine virtuelle est planifiée sur des CPU qui ne seront pas utilisés par d'autres processus. En utilisant des ressources dédiées, vous pouvez améliorer les performances de la machine virtuelle et la précision des prévisions de latence.

10.18.7.2. Conditions préalables

  • Le gestionnaire de CPU doit être configuré sur le nœud. Vérifiez que le nœud possède le label cpumanager = true avant de planifier les charges de travail des machines virtuelles.
  • La machine virtuelle doit être mise hors tension.

10.18.7.3. Activation de ressources dédiées pour une machine virtuelle

Vous activez les ressources dédiées pour une machine virtuelle dans l'onglet Details. Les machines virtuelles qui ont été créées à partir d'un modèle Red Hat peuvent être configurées avec des ressources dédiées.

Procédure

  1. Dans la console OpenShift Container Platform, cliquez sur Virtualization VirtualMachines dans le menu latéral.
  2. Sélectionnez une machine virtuelle pour ouvrir la page VirtualMachine details.
  3. Dans l'onglet Scheduling, cliquez sur l'icône représentant un crayon à côté de Dedicated Resources.
  4. Sélectionnez Schedule this workload with dedicated resources (guaranteed policy).
  5. Cliquez sur Save.

10.18.8. Planification des machines virtuelles

Vous pouvez planifier une machine virtuelle (VM) sur un nœud en vous assurant que le modèle de CPU et l'attribut de stratégie de la VM sont compatibles avec les modèles de CPU et les attributs de stratégie pris en charge par le nœud.

10.18.8.1. Attributs de la politique

Vous pouvez planifier une machine virtuelle (VM) en spécifiant un attribut de stratégie et une caractéristique de CPU qui est mise en correspondance pour la compatibilité lorsque la VM est planifiée sur un nœud. Un attribut de stratégie spécifié pour une VM détermine la manière dont cette VM est planifiée sur un nœud.

Attribut de la politiqueDescription

force

La VM est obligée d'être programmée sur un nœud. Cela est vrai même si l'unité centrale de l'hôte ne prend pas en charge l'unité centrale de la VM.

exiger

Politique par défaut qui s'applique à une VM si celle-ci n'est pas configurée avec un modèle de CPU spécifique et une spécification de fonctionnalité. Si un nœud n'est pas configuré pour prendre en charge la découverte de nœuds de CPU avec cet attribut de stratégie par défaut ou l'un des autres attributs de stratégie, les VM ne sont pas planifiées sur ce nœud. Le CPU de l'hôte doit prendre en charge le CPU de la VM ou l'hyperviseur doit pouvoir émuler le modèle de CPU pris en charge.

facultatif

La VM est ajoutée à un nœud si elle est prise en charge par le processeur de la machine physique de l'hôte.

désactiver

La VM ne peut pas être planifiée avec la découverte du nœud CPU.

interdire

La VM n'est pas planifiée même si la fonction est prise en charge par l'unité centrale hôte et que la découverte du nœud de l'unité centrale est activée.

10.18.8.2. Définition d'un attribut de politique et d'une fonction de l'unité centrale

Vous pouvez définir un attribut de stratégie et une fonction CPU pour chaque machine virtuelle (VM) afin de vous assurer qu'elle est planifiée sur un nœud conformément à la stratégie et à la fonction. La fonction CPU que vous définissez est vérifiée pour s'assurer qu'elle est prise en charge par le processeur hôte ou émulée par l'hyperviseur.

Procédure

  • Modifiez la spécification domain de votre fichier de configuration de la VM. L'exemple suivant définit la fonctionnalité CPU et la stratégie require pour une machine virtuelle (VM) :

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: myvm
    spec:
      template:
        spec:
          domain:
            cpu:
              features:
                - name: apic 1
                  policy: require 2
    1
    Nom de la fonction CPU pour la VM.
    2
    Attribut de politique pour la VM.

10.18.8.3. Planification des machines virtuelles avec le modèle de CPU pris en charge

Vous pouvez configurer un modèle de CPU pour une machine virtuelle (VM) afin de la planifier sur un nœud où son modèle de CPU est pris en charge.

Procédure

  • Modifiez la spécification domain du fichier de configuration de votre machine virtuelle. L'exemple suivant montre un modèle de CPU spécifique défini pour une VM :

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: myvm
    spec:
      template:
        spec:
          domain:
            cpu:
              model: Conroe 1
    1
    Modèle de CPU pour la VM.

10.18.8.4. Ordonnancement des machines virtuelles avec le modèle d'hôte

Lorsque le modèle de CPU d'une machine virtuelle (VM) est défini sur host-model, la VM hérite du modèle de CPU du nœud où elle est planifiée.

Procédure

  • Modifiez la spécification domain de votre fichier de configuration de la VM. L'exemple suivant montre que host-model est spécifié pour la machine virtuelle :

    apiVersion: kubevirt/v1alpha3
    kind: VirtualMachine
    metadata:
      name: myvm
    spec:
      template:
        spec:
          domain:
            cpu:
              model: host-model 1
    1
    La VM qui hérite du modèle de CPU du nœud où elle est planifiée.

10.18.9. Configuration de PCI passthrough

La fonction Peripheral Component Interconnect (PCI) passthrough vous permet d'accéder à des périphériques matériels et de les gérer à partir d'une machine virtuelle. Lorsque la fonction PCI passthrough est configurée, les périphériques PCI fonctionnent comme s'ils étaient physiquement connectés au système d'exploitation invité.

Les administrateurs de clusters peuvent exposer et gérer les périphériques hôtes qui sont autorisés à être utilisés dans le cluster en utilisant l'interface de ligne de commande (CLI) oc.

10.18.9.1. A propos de la préparation d'un périphérique hôte pour le PCI passthrough

Pour préparer un périphérique hôte au passage PCI à l'aide de l'interface de programmation, créez un objet MachineConfig et ajoutez des arguments de noyau pour activer l'unité de gestion de la mémoire d'entrée-sortie (IOMMU). Liez le périphérique PCI au pilote Virtual Function I/O (VFIO), puis exposez-le dans le cluster en modifiant le champ permittedHostDevices de la ressource personnalisée (CR) HyperConverged. La liste permittedHostDevices est vide lorsque vous installez l'opérateur de virtualisation OpenShift pour la première fois.

Pour supprimer un périphérique hôte PCI du cluster à l'aide de la CLI, supprimez les informations relatives au périphérique PCI du CR HyperConverged.

10.18.9.1.1. Ajout d'arguments au noyau pour activer le pilote IOMMU

Pour activer le pilote IOMMU (Input-Output Memory Management Unit) dans le noyau, créez l'objet MachineConfig et ajoutez les arguments du noyau.

Conditions préalables

  • Privilège administratif sur un cluster OpenShift Container Platform en fonctionnement.
  • Matériel CPU Intel ou AMD.
  • La technologie de virtualisation Intel pour les extensions Directed I/O ou AMD IOMMU dans le BIOS (Basic Input/Output System) est activée.

Procédure

  1. Créez un objet MachineConfig qui identifie l'argument du noyau. L'exemple suivant montre un argument du noyau pour un processeur Intel.

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      labels:
        machineconfiguration.openshift.io/role: worker 1
      name: 100-worker-iommu 2
    spec:
      config:
        ignition:
          version: 3.2.0
      kernelArguments:
          - intel_iommu=on 3
    ...
    1
    Applique le nouvel argument du noyau uniquement aux nœuds de travail.
    2
    L'adresse name indique le rang de cet argument du noyau (100) parmi les configurations de la machine et son objectif. Si vous avez un processeur AMD, spécifiez l'argument du noyau comme amd_iommu=on.
    3
    Identifie l'argument du noyau comme étant intel_iommu pour un processeur Intel.
  2. Créer le nouvel objet MachineConfig:

    $ oc create -f 100-worker-kernel-arg-iommu.yaml

Vérification

  • Vérifiez que le nouvel objet MachineConfig a bien été ajouté.

    $ oc get MachineConfig
10.18.9.1.2. Liaison des périphériques PCI au pilote VFIO

Pour lier les périphériques PCI au pilote VFIO (Virtual Function I/O), obtenez les valeurs de vendor-ID et device-ID de chaque périphérique et créez une liste avec ces valeurs. Ajoutez cette liste à l'objet MachineConfig. L'opérateur MachineConfig génère l'objet /etc/modprobe.d/vfio.conf sur les nœuds dotés de périphériques PCI et lie les périphériques PCI au pilote VFIO.

Conditions préalables

  • Vous avez ajouté des arguments au noyau pour activer l'IOMMU pour le processeur.

Procédure

  1. Exécutez la commande lspci pour obtenir les adresses vendor-ID et device-ID du périphérique PCI.

    $ lspci -nnv | grep -i nvidia

    Exemple de sortie

    02:01.0 3D controller [0302]: NVIDIA Corporation GV100GL [Tesla V100 PCIe 32GB] [10de:1eb8] (rev a1)

  2. Créer un fichier de configuration Butane, 100-worker-vfiopci.bu, liant le périphérique PCI au pilote VFIO.

    Note

    See "Creating machine configs with Butane" for information about Butane.

    Exemple :

    variant: openshift
    version: 4.12.0
    metadata:
      name: 100-worker-vfiopci
      labels:
        machineconfiguration.openshift.io/role: worker 1
    storage:
      files:
      - path: /etc/modprobe.d/vfio.conf
        mode: 0644
        overwrite: true
        contents:
          inline: |
            options vfio-pci ids=10de:1eb8 2
      - path: /etc/modules-load.d/vfio-pci.conf 3
        mode: 0644
        overwrite: true
        contents:
          inline: vfio-pci

    1
    Applique le nouvel argument du noyau uniquement aux nœuds de travail.
    2
    Spécifiez la valeur vendor-ID (10de) et la valeur device-ID (1eb8) déterminées précédemment pour lier un seul périphérique au pilote VFIO. Vous pouvez ajouter une liste de plusieurs périphériques avec leurs informations sur le fournisseur et le périphérique.
    3
    Le fichier qui charge le module noyau vfio-pci sur les nœuds de travail.
  3. Utilisez Butane pour générer un fichier objet MachineConfig, 100-worker-vfiopci.yaml, contenant la configuration à fournir aux nœuds de travail :

    $ butane 100-worker-vfiopci.bu -o 100-worker-vfiopci.yaml
  4. Appliquer l'objet MachineConfig aux nœuds de travail :

    $ oc apply -f 100-worker-vfiopci.yaml
  5. Vérifiez que l'objet MachineConfig a bien été ajouté.

    $ oc get MachineConfig

    Exemple de sortie

    NAME                             GENERATEDBYCONTROLLER                      IGNITIONVERSION  AGE
    00-master                        d3da910bfa9f4b599af4ed7f5ac270d55950a3a1   3.2.0            25h
    00-worker                        d3da910bfa9f4b599af4ed7f5ac270d55950a3a1   3.2.0            25h
    01-master-container-runtime      d3da910bfa9f4b599af4ed7f5ac270d55950a3a1   3.2.0            25h
    01-master-kubelet                d3da910bfa9f4b599af4ed7f5ac270d55950a3a1   3.2.0            25h
    01-worker-container-runtime      d3da910bfa9f4b599af4ed7f5ac270d55950a3a1   3.2.0            25h
    01-worker-kubelet                d3da910bfa9f4b599af4ed7f5ac270d55950a3a1   3.2.0            25h
    100-worker-iommu                                                            3.2.0            30s
    100-worker-vfiopci-configuration                                            3.2.0            30s

Vérification

  • Vérifiez que le pilote VFIO est chargé.

    $ lspci -nnk -d 10de:

    La sortie confirme que le pilote VFIO est utilisé.

    Exemple de sortie

    04:00.0 3D controller [0302]: NVIDIA Corporation GP102GL [Tesla P40] [10de:1eb8] (rev a1)
            Subsystem: NVIDIA Corporation Device [10de:1eb8]
            Kernel driver in use: vfio-pci
            Kernel modules: nouveau

10.18.9.1.3. Exposer les périphériques hôtes PCI dans le cluster à l'aide de la CLI

Pour exposer les périphériques hôtes PCI dans le cluster, ajoutez des détails sur les périphériques PCI au tableau spec.permittedHostDevices.pciHostDevices de la ressource personnalisée (CR) HyperConverged.

Procédure

  1. Modifiez le HyperConverged CR dans votre éditeur par défaut en exécutant la commande suivante :

    $ oc edit hyperconverged kubevirt-hyperconverged -n openshift-cnv
  2. Ajoutez les informations relatives au périphérique PCI au tableau spec.permittedHostDevices.pciHostDevices. Par exemple :

    Exemple de fichier de configuration

    apiVersion: hco.kubevirt.io/v1
    kind: HyperConverged
    metadata:
      name: kubevirt-hyperconverged
      namespace: openshift-cnv
    spec:
      permittedHostDevices: 1
        pciHostDevices: 2
        - pciDeviceSelector: "10DE:1DB6" 3
          resourceName: "nvidia.com/GV100GL_Tesla_V100" 4
        - pciDeviceSelector: "10DE:1EB8"
          resourceName: "nvidia.com/TU104GL_Tesla_T4"
        - pciDeviceSelector: "8086:6F54"
          resourceName: "intel.com/qat"
          externalResourceProvider: true 5
    ...

    1
    Les périphériques hôtes dont l'utilisation est autorisée dans le cluster.
    2
    La liste des périphériques PCI disponibles sur le nœud.
    3
    Le vendor-ID et le device-ID nécessaires pour identifier le dispositif PCI.
    4
    Le nom d'un périphérique hôte PCI.
    5
    Facultatif : La définition de ce champ à true indique que la ressource est fournie par un plugin de périphérique externe. OpenShift Virtualization permet l'utilisation de ce périphérique dans le cluster mais laisse l'allocation et la surveillance à un plugin de périphérique externe.
    Note

    L'exemple ci-dessus montre deux périphériques hôtes PCI nommés nvidia.com/GV100GL_Tesla_V100 et nvidia.com/TU104GL_Tesla_T4 ajoutés à la liste des périphériques hôtes autorisés dans le CR HyperConverged. Ces périphériques ont été testés et vérifiés pour fonctionner avec OpenShift Virtualization.

  3. Enregistrez vos modifications et quittez l'éditeur.

Vérification

  • Vérifiez que les périphériques hôtes PCI ont été ajoutés au nœud en exécutant la commande suivante. L'exemple de sortie montre qu'il y a un périphérique associé aux noms de ressources nvidia.com/GV100GL_Tesla_V100, nvidia.com/TU104GL_Tesla_T4 et intel.com/qat.

    oc describe node <node_name>

    Exemple de sortie

    Capacity:
      cpu:                            64
      devices.kubevirt.io/kvm:        110
      devices.kubevirt.io/tun:        110
      devices.kubevirt.io/vhost-net:  110
      ephemeral-storage:              915128Mi
      hugepages-1Gi:                  0
      hugepages-2Mi:                  0
      memory:                         131395264Ki
      nvidia.com/GV100GL_Tesla_V100   1
      nvidia.com/TU104GL_Tesla_T4     1
      intel.com/qat:                  1
      pods:                           250
    Allocatable:
      cpu:                            63500m
      devices.kubevirt.io/kvm:        110
      devices.kubevirt.io/tun:        110
      devices.kubevirt.io/vhost-net:  110
      ephemeral-storage:              863623130526
      hugepages-1Gi:                  0
      hugepages-2Mi:                  0
      memory:                         130244288Ki
      nvidia.com/GV100GL_Tesla_V100   1
      nvidia.com/TU104GL_Tesla_T4     1
      intel.com/qat:                  1
      pods:                           250

10.18.9.1.4. Suppression des périphériques hôtes PCI de la grappe à l'aide du CLI

Pour supprimer un périphérique hôte PCI du cluster, supprimez les informations relatives à ce périphérique de la ressource personnalisée (CR) HyperConverged.

Procédure

  1. Modifiez le HyperConverged CR dans votre éditeur par défaut en exécutant la commande suivante :

    $ oc edit hyperconverged kubevirt-hyperconverged -n openshift-cnv
  2. Supprimer les informations relatives au périphérique PCI du tableau spec.permittedHostDevices.pciHostDevices en supprimant les champs pciDeviceSelector, resourceName et externalResourceProvider (le cas échéant) pour le périphérique approprié. Dans cet exemple, la ressource intel.com/qat a été supprimée.

    Exemple de fichier de configuration

    apiVersion: hco.kubevirt.io/v1
    kind: HyperConverged
    metadata:
      name: kubevirt-hyperconverged
      namespace: openshift-cnv
    spec:
      permittedHostDevices:
        pciHostDevices:
        - pciDeviceSelector: "10DE:1DB6"
          resourceName: "nvidia.com/GV100GL_Tesla_V100"
        - pciDeviceSelector: "10DE:1EB8"
          resourceName: "nvidia.com/TU104GL_Tesla_T4"
    ...

  3. Enregistrez vos modifications et quittez l'éditeur.

Vérification

  • Vérifiez que le périphérique hôte PCI a été supprimé du nœud en exécutant la commande suivante. L'exemple de sortie montre qu'il n'y a aucun périphérique associé au nom de ressource intel.com/qat.

    oc describe node <node_name>

    Exemple de sortie

    Capacity:
      cpu:                            64
      devices.kubevirt.io/kvm:        110
      devices.kubevirt.io/tun:        110
      devices.kubevirt.io/vhost-net:  110
      ephemeral-storage:              915128Mi
      hugepages-1Gi:                  0
      hugepages-2Mi:                  0
      memory:                         131395264Ki
      nvidia.com/GV100GL_Tesla_V100   1
      nvidia.com/TU104GL_Tesla_T4     1
      intel.com/qat:                  0
      pods:                           250
    Allocatable:
      cpu:                            63500m
      devices.kubevirt.io/kvm:        110
      devices.kubevirt.io/tun:        110
      devices.kubevirt.io/vhost-net:  110
      ephemeral-storage:              863623130526
      hugepages-1Gi:                  0
      hugepages-2Mi:                  0
      memory:                         130244288Ki
      nvidia.com/GV100GL_Tesla_V100   1
      nvidia.com/TU104GL_Tesla_T4     1
      intel.com/qat:                  0
      pods:                           250

10.18.9.2. Configuration des machines virtuelles pour PCI passthrough

Une fois les périphériques PCI ajoutés au cluster, vous pouvez les affecter aux machines virtuelles. Les périphériques PCI sont désormais disponibles comme s'ils étaient physiquement connectés aux machines virtuelles.

10.18.9.2.1. Attribution d'un périphérique PCI à une machine virtuelle

Lorsqu'un périphérique PCI est disponible dans un cluster, vous pouvez l'affecter à une machine virtuelle et activer le PCI passthrough.

Procédure

  • Attribuer le périphérique PCI à une machine virtuelle en tant que périphérique hôte.

    Exemple :

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    spec:
      domain:
        devices:
          hostDevices:
          - deviceName: nvidia.com/TU104GL_Tesla_T4 1
            name: hostdevices1

    1
    Le nom du périphérique PCI autorisé sur le cluster en tant que périphérique hôte. La machine virtuelle peut accéder à ce périphérique hôte.

Vérification

  • Utilisez la commande suivante pour vérifier que le périphérique hôte est disponible dans la machine virtuelle.

    $ lspci -nnk | grep NVIDIA

    Exemple de sortie

    $ 02:01.0 3D controller [0302]: NVIDIA Corporation GV100GL [Tesla V100 PCIe 32GB] [10de:1eb8] (rev a1)

10.18.9.3. Ressources supplémentaires

10.18.10. Configuration du vGPU passthrough

Vos machines virtuelles peuvent accéder à un matériel GPU virtuel (vGPU). L'attribution d'un vGPU à votre machine virtuelle vous permet d'effectuer les opérations suivantes :

  • Accédez à une fraction du GPU du matériel sous-jacent pour obtenir des performances élevées dans votre machine virtuelle.
  • Rationaliser les opérations d'E/S gourmandes en ressources.
Important

la fonction vGPU passthrough ne peut être attribuée qu'à des appareils connectés à des clusters fonctionnant dans un environnement "bare metal".

10.18.10.1. Attribution de périphériques vGPU passthrough à une machine virtuelle

Utilisez la console web d'OpenShift Container Platform pour attribuer des périphériques vGPU passthrough à votre machine virtuelle.

Conditions préalables

  • La machine virtuelle doit être arrêtée.

Procédure

  1. Dans la console web de OpenShift Container Platform, cliquez sur Virtualization VirtualMachines dans le menu latéral.
  2. Sélectionnez la machine virtuelle à laquelle vous souhaitez attribuer le périphérique.
  3. Dans l'onglet Details, cliquez sur GPU devices.

    Si vous ajoutez un périphérique vGPU en tant que périphérique hôte, vous ne pouvez pas accéder au périphérique avec la console VNC.

  4. Cliquez sur Add GPU device, entrez dans Name et sélectionnez l'appareil dans la liste Device name.
  5. Cliquez sur Save.
  6. Cliquez sur l'onglet YAML pour vérifier que les nouveaux appareils ont été ajoutés à la configuration de votre cluster dans la section hostDevices.
Note

Vous pouvez ajouter des périphériques matériels aux machines virtuelles créées à partir de modèles personnalisés ou d'un fichier YAML. Vous ne pouvez pas ajouter de périphériques à des modèles de source de démarrage fournis à l'avance pour des systèmes d'exploitation spécifiques, tels que Windows 10 ou RHEL 7.

Pour afficher les ressources connectées à votre cluster, cliquez sur Compute Hardware Devices dans le menu latéral.

10.18.10.2. Ressources supplémentaires

10.18.11. Configuration des dispositifs à médiation

OpenShift Virtualization crée automatiquement des périphériques médiatisés, tels que des GPU virtuels (vGPU), si vous fournissez une liste de périphériques dans la ressource personnalisée (CR) HyperConverged.

Important

La configuration déclarative des périphériques médiatisés est une fonctionnalité d'aperçu technologique uniquement. Les fonctionnalités de l'aperçu technologique ne sont pas prises en charge par les accords de niveau de service (SLA) de production de Red Hat et peuvent ne pas être complètes d'un point de vue fonctionnel. Red Hat ne recommande pas de les utiliser en production. Ces fonctionnalités offrent un accès anticipé aux fonctionnalités des produits à venir, permettant aux clients de tester les fonctionnalités et de fournir un retour d'information au cours du processus de développement.

Pour plus d'informations sur la portée de l'assistance des fonctionnalités de l'aperçu technologique de Red Hat, voir Portée de l'assistance des fonctionnalités de l'aperçu technologique.

10.18.11.1. A propos de l'utilisation de NVIDIA GPU Operator

Le NVIDIA GPU Operator gère les ressources GPU NVIDIA dans un cluster OpenShift Container Platform et automatise les tâches liées au démarrage des nœuds GPU. Étant donné que le GPU est une ressource spéciale dans le cluster, vous devez installer certains composants avant de déployer des charges de travail d'application sur le GPU. Ces composants comprennent les pilotes NVIDIA qui activent l'architecture CUDA (compute unified device architecture), le plugin de périphérique Kubernetes, le runtime de conteneur et d'autres éléments tels que l'étiquetage automatique des nœuds, la surveillance et plus encore.

Note

NVIDIA GPU Operator n'est pris en charge que par NVIDIA. Pour plus d'informations sur l'obtention d'un support de la part de NVIDIA, voir Obtenir un support de la part de NVIDIA.

Il existe deux façons d'activer les GPU avec OpenShift Container Platform OpenShift Virtualization : la méthode native d'OpenShift Container Platform décrite ici et l'utilisation de NVIDIA GPU Operator.

L'opérateur NVIDIA GPU est un opérateur Kubernetes qui permet à OpenShift Container Platform OpenShift Virtualization d'exposer les GPU aux charges de travail virtualisées fonctionnant sur OpenShift Container Platform. Il permet aux utilisateurs de provisionner et de gérer facilement des machines virtuelles dotées de GPU, en leur donnant la possibilité d'exécuter des charges de travail complexes d'intelligence artificielle/apprentissage machine (AI/ML) sur la même plateforme que leurs autres charges de travail. Il offre également un moyen simple de faire évoluer la capacité GPU de leur infrastructure, permettant ainsi une croissance rapide des charges de travail basées sur le GPU.

Pour plus d'informations sur l'utilisation de NVIDIA GPU Operator pour provisionner des nœuds de travail pour l'exécution de VM accélérées par le GPU, voir NVIDIA GPU Operator avec OpenShift Virtualization.

10.18.11.2. À propos de l'utilisation de GPU virtuels avec OpenShift Virtualization

Certaines cartes de processeurs graphiques (GPU) prennent en charge la création de GPU virtuels (vGPU). OpenShift Virtualization peut créer automatiquement des vGPU et d'autres périphériques médiatisés si un administrateur fournit des détails de configuration dans la ressource personnalisée (CR) HyperConverged. Cette automatisation est particulièrement utile pour les grands clusters.

Note

Reportez-vous à la documentation de votre fournisseur de matériel pour plus de détails sur les fonctionnalités et l'assistance.

Dispositif de médiation
Un dispositif physique divisé en un ou plusieurs dispositifs virtuels. Un vGPU est un type de périphérique médiatisé (mdev) ; les performances du GPU physique sont réparties entre les périphériques virtuels. Vous pouvez attribuer des périphériques médiatisés à une ou plusieurs machines virtuelles (VM), mais le nombre d'invités doit être compatible avec votre GPU. Certains GPU ne prennent pas en charge plusieurs invités.
10.18.11.2.1. Conditions préalables
  • Si votre fournisseur de matériel fournit des pilotes, vous les avez installés sur les nœuds où vous souhaitez créer des dispositifs à médiation.

10.18.11.2.2. Aperçu de la configuration

Lors de la configuration des dispositifs à médiation, l'administrateur doit effectuer les tâches suivantes :

  • Créer les dispositifs de médiation.
  • Exposer les dispositifs médiatisés au cluster.

La CR HyperConverged comprend des API qui permettent d'accomplir ces deux tâches.

Créer des dispositifs médiatisés

...
spec:
  mediatedDevicesConfiguration:
    mediatedDevicesTypes: 1
    - <device_type>
    nodeMediatedDeviceTypes: 2
    - mediatedDevicesTypes: 3
      - <device_type>
      nodeSelector: 4
        <node_selector_key>: <node_selector_value>
...

1
Obligatoire : Configure les paramètres globaux du cluster.
2
Facultatif : Remplace la configuration globale pour un nœud ou un groupe de nœuds spécifique. Doit être utilisé avec la configuration globale mediatedDevicesTypes.
3
Obligatoire si vous utilisez nodeMediatedDeviceTypes. Remplace la configuration globale de mediatedDevicesTypes pour les nœuds spécifiés.
4
Requis si vous utilisez nodeMediatedDeviceTypes. Doit inclure une paire key:value.

Exposer les dispositifs à médiation au cluster

...
  permittedHostDevices:
    mediatedDevices:
    - mdevNameSelector: GRID T4-2Q 1
      resourceName: nvidia.com/GRID_T4-2Q 2
...

1
Expose les dispositifs médiatisés qui correspondent à cette valeur sur l'hôte.
Note

Vous pouvez voir les types de dispositifs médiatisés pris en charge par votre dispositif en consultant le contenu de /sys/bus/pci/devices/<slot>:<bus>:<domain>.<function>/mdev_supported_types/<type>/name, en remplaçant les valeurs correctes pour votre système.

Par exemple, le fichier de noms du type nvidia-231 contient la chaîne de sélection GRID T4-2Q. L'utilisation de GRID T4-2Q comme valeur de mdevNameSelector permet aux nœuds d'utiliser le type nvidia-231.

2
Le resourceName doit correspondre à celui alloué sur le nœud. Trouvez le resourceName en utilisant la commande suivante :
$ oc get $NODE -o json  \
| jq '.status.allocatable | \
with_entries(select(.key | startswith("nvidia.com/"))) | \
with_entries(select(.value != "0"))'
10.18.11.2.3. Comment les vGPU sont affectés aux nœuds

Pour chaque appareil physique, OpenShift Virtualization configure les valeurs suivantes :

  • Un seul type de mdev.
  • Nombre maximal d'instances du type mdev sélectionné.

L'architecture de la grappe affecte la manière dont les dispositifs sont créés et attribués aux nœuds.

Grand cluster avec plusieurs cartes par nœud

Sur les nœuds dotés de plusieurs cartes pouvant prendre en charge des types de vGPU similaires, les types de périphériques concernés sont créés à la ronde. Par exemple :

...
mediatedDevicesConfiguration:
  mediatedDevicesTypes:
  - nvidia-222
  - nvidia-228
  - nvidia-105
  - nvidia-108
...

Dans ce scénario, chaque nœud dispose de deux cartes, toutes deux compatibles avec les types de vGPU suivants :

nvidia-105
...
nvidia-108
nvidia-217
nvidia-299
...

Sur chaque nœud, OpenShift Virtualization crée les vGPU suivants :

  • 16 vGPUs de type nvidia-105 sur la première carte.
  • 2 vGPUs de type nvidia-108 sur la seconde carte.
Un nœud possède une seule carte qui prend en charge plusieurs types de vGPU

OpenShift Virtualization utilise le type pris en charge qui vient en premier sur la liste mediatedDevicesTypes.

Par exemple, la carte d'un nœud prend en charge nvidia-223 et nvidia-224. La liste mediatedDevicesTypes suivante est configurée :

...
mediatedDevicesConfiguration:
  mediatedDevicesTypes:
  - nvidia-22
  - nvidia-223
  - nvidia-224
...

Dans cet exemple, OpenShift Virtualization utilise le type nvidia-223.

10.18.11.2.4. Sur la modification et la suppression des dispositifs médiatisés

La configuration du dispositif médiatisé du cluster peut être mise à jour avec OpenShift Virtualization en :

  • Editer le HyperConverged CR et modifier le contenu de la strophe mediatedDevicesTypes.
  • Modification des étiquettes de nœuds correspondant au sélecteur de nœuds nodeMediatedDeviceTypes.
  • Suppression des informations relatives au dispositif dans les strophes spec.mediatedDevicesConfiguration et spec.permittedHostDevices de la CR HyperConverged.

    Note

    Si vous supprimez les informations relatives au dispositif de la strophe spec.permittedHostDevices sans les supprimer également de la strophe spec.mediatedDevicesConfiguration, vous ne pouvez pas créer un nouveau type de dispositif à médiation sur le même nœud. Pour supprimer correctement les dispositifs à médiation, supprimez les informations relatives aux dispositifs dans les deux strophes.

En fonction des changements spécifiques, ces actions amènent OpenShift Virtualization à reconfigurer les périphériques médiatisés ou à les supprimer des nœuds du cluster.

10.18.11.2.5. Préparation des hôtes pour les dispositifs à médiation

Vous devez activer le pilote Input-Output Memory Management Unit (IOMMU) avant de pouvoir configurer les périphériques à médiation.

10.18.11.2.5.1. Ajout d'arguments au noyau pour activer le pilote IOMMU

Pour activer le pilote IOMMU (Input-Output Memory Management Unit) dans le noyau, créez l'objet MachineConfig et ajoutez les arguments du noyau.

Conditions préalables

  • Privilège administratif sur un cluster OpenShift Container Platform en fonctionnement.
  • Matériel CPU Intel ou AMD.
  • La technologie de virtualisation Intel pour les extensions Directed I/O ou AMD IOMMU dans le BIOS (Basic Input/Output System) est activée.

Procédure

  1. Créez un objet MachineConfig qui identifie l'argument du noyau. L'exemple suivant montre un argument du noyau pour un processeur Intel.

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      labels:
        machineconfiguration.openshift.io/role: worker 1
      name: 100-worker-iommu 2
    spec:
      config:
        ignition:
          version: 3.2.0
      kernelArguments:
          - intel_iommu=on 3
    ...
    1
    Applique le nouvel argument du noyau uniquement aux nœuds de travail.
    2
    L'adresse name indique le rang de cet argument du noyau (100) parmi les configurations de la machine et son objectif. Si vous avez un processeur AMD, spécifiez l'argument du noyau comme amd_iommu=on.
    3
    Identifie l'argument du noyau comme étant intel_iommu pour un processeur Intel.
  2. Créer le nouvel objet MachineConfig:

    $ oc create -f 100-worker-kernel-arg-iommu.yaml

Vérification

  • Vérifiez que le nouvel objet MachineConfig a bien été ajouté.

    $ oc get MachineConfig
10.18.11.2.6. Ajout et suppression de dispositifs médiatisés

Vous pouvez ajouter ou supprimer des dispositifs médiatisés.

10.18.11.2.6.1. Créer et exposer des dispositifs médiatisés

Vous pouvez exposer et créer des dispositifs médiatisés tels que des GPU virtuels (vGPU) en modifiant la ressource personnalisée (CR) HyperConverged.

Conditions préalables

  • Vous avez activé le pilote IOMMU (Input-Output Memory Management Unit).

Procédure

  1. Modifiez le HyperConverged CR dans votre éditeur par défaut en exécutant la commande suivante :

    $ oc edit hyperconverged kubevirt-hyperconverged -n openshift-cnv
  2. Ajoutez les informations sur le dispositif médiatisé à la CR HyperConverged spec , en veillant à inclure les strophes mediatedDevicesConfiguration et permittedHostDevices. Par exemple :

    Exemple de fichier de configuration

    apiVersion: hco.kubevirt.io/v1
    kind: HyperConverged
    metadata:
      name: kubevirt-hyperconverged
      namespace: openshift-cnv
    spec:
      mediatedDevicesConfiguration: <.>
        mediatedDevicesTypes: <.>
        - nvidia-231
        nodeMediatedDeviceTypes: <.>
        - mediatedDevicesTypes: <.>
          - nvidia-233
          nodeSelector:
            kubernetes.io/hostname: node-11.redhat.com
      permittedHostDevices: <.>
        mediatedDevices:
        - mdevNameSelector: GRID T4-2Q
          resourceName: nvidia.com/GRID_T4-2Q
        - mdevNameSelector: GRID T4-8Q
          resourceName: nvidia.com/GRID_T4-8Q
    ...

    <.> Crée des dispositifs médiatisés. <.> Requis : Configuration globale mediatedDevicesTypes. <.> Facultatif : Remplace la configuration globale pour des nœuds spécifiques. <.> Requis si vous utilisez nodeMediatedDeviceTypes<.> Expose les périphériques à médiation au cluster.

  3. Enregistrez vos modifications et quittez l'éditeur.

Vérification

  • Vous pouvez vérifier qu'un dispositif a été ajouté à un nœud spécifique en exécutant la commande suivante :

    oc describe node <node_name>
10.18.11.2.6.2. Suppression des dispositifs à médiation de la grappe à l'aide de la CLI

Pour supprimer un dispositif médiatisé du cluster, supprimez les informations relatives à ce dispositif de la ressource personnalisée (CR) HyperConverged.

Procédure

  1. Modifiez le HyperConverged CR dans votre éditeur par défaut en exécutant la commande suivante :

    $ oc edit hyperconverged kubevirt-hyperconverged -n openshift-cnv
  2. Supprimez les informations relatives au dispositif dans les strophes spec.mediatedDevicesConfiguration et spec.permittedHostDevices de la CR HyperConverged. La suppression des deux entrées garantit la possibilité de créer ultérieurement un nouveau type de dispositif à médiation sur le même nœud. Par exemple :

    Exemple de fichier de configuration

    apiVersion: hco.kubevirt.io/v1
    kind: HyperConverged
    metadata:
      name: kubevirt-hyperconverged
      namespace: openshift-cnv
    spec:
      mediatedDevicesConfiguration:
        mediatedDevicesTypes: 1
          - nvidia-231
      permittedHostDevices:
        mediatedDevices: 2
        - mdevNameSelector: GRID T4-2Q
          resourceName: nvidia.com/GRID_T4-2Q

    1
    Pour supprimer le type de dispositif nvidia-231, supprimez-le du tableau mediatedDevicesTypes.
    2
    Pour supprimer le dispositif GRID T4-2Q, supprimez le champ mdevNameSelector et le champ resourceName correspondant.
  3. Enregistrez vos modifications et quittez l'éditeur.

10.18.11.3. Utilisation de dispositifs médiatisés

Un vGPU est un type de dispositif médiatisé ; les performances du GPU physique sont réparties entre les dispositifs virtuels. Vous pouvez attribuer des périphériques médiatisés à une ou plusieurs machines virtuelles.

10.18.11.3.1. Attribution d'un dispositif médiatisé à une machine virtuelle

Attribuer des périphériques médiatisés tels que des GPU virtuels (vGPU) à des machines virtuelles.

Conditions préalables

  • Le dispositif médiatisé est configuré dans la ressource personnalisée HyperConverged.

Procédure

  • Attribuez le périphérique médiatisé à une machine virtuelle (VM) en modifiant la strophe spec.domain.devices.gpus du manifeste VirtualMachine:

    Exemple de manifeste de machine virtuelle

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    spec:
      domain:
        devices:
          gpus:
          - deviceName: nvidia.com/TU104GL_Tesla_T4 1
            name: gpu1 2
          - deviceName: nvidia.com/GRID_T4-1Q
            name: gpu2

    1
    Le nom de la ressource associée au dispositif médiatisé.
    2
    Nom permettant d'identifier le périphérique sur la VM.

Vérification

  • Pour vérifier que le périphérique est disponible dans la machine virtuelle, exécutez la commande suivante, en remplaçant <device_name> par la valeur deviceName du manifeste VirtualMachine:

    $ lspci -nnk | grep <device_name>

10.18.11.4. Ressources supplémentaires

10.18.12. Configuration d'un chien de garde

Exposer un chien de garde en configurant la machine virtuelle (VM) pour un périphérique de chien de garde, en installant le chien de garde et en démarrant le service de chien de garde.

10.18.12.1. Conditions préalables

  • La machine virtuelle doit disposer d'une prise en charge par le noyau d'un périphérique de surveillance i6300esb. Les images Red Hat Enterprise Linux (RHEL) prennent en charge i6300esb.

10.18.12.2. Définition d'un dispositif de surveillance

Définir comment le chien de garde procède lorsque le système d'exploitation (OS) ne répond plus.

Tableau 10.4. Actions disponibles

poweroff

La machine virtuelle (VM) s'éteint immédiatement. Si spec.running est défini sur true, ou si spec.runStrategy n'est pas défini sur manual, la VM redémarre.

reset

La VM redémarre sur place et le système d'exploitation invité ne peut pas réagir. Étant donné que le temps nécessaire au redémarrage du système d'exploitation invité peut entraîner un dépassement du délai d'exécution des sondes d'intégrité, l'utilisation de cette option est déconseillée. Ce délai peut prolonger le temps nécessaire au redémarrage de la VM si les protections au niveau du cluster remarquent que la sonde d'intégrité a échoué et la replanifient de force.

shutdown

La VM s'éteint de manière gracieuse en arrêtant tous les services.

Procédure

  1. Créez un fichier YAML avec le contenu suivant :

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      labels:
        kubevirt.io/vm: vm2-rhel84-watchdog
      name: <vm-name>
    spec:
      running: false
      template:
        metadata:
         labels:
            kubevirt.io/vm: vm2-rhel84-watchdog
        spec:
          domain:
            devices:
              watchdog:
                name: <watchdog>
                i6300esb:
                  action: "poweroff" 1
    ...
    1
    Spécifiez l'action watchdog (poweroff, reset, ou shutdown).

    L'exemple ci-dessus configure le dispositif de surveillance i6300esb sur une VM RHEL8 avec l'action de mise hors tension et expose le dispositif en tant que /dev/watchdog.

    Ce dispositif peut maintenant être utilisé par le binaire chien de garde.

  2. Appliquez le fichier YAML à votre cluster en exécutant la commande suivante :

    oc apply -f <nom_du_fichier>.yaml
Important

Cette procédure sert uniquement à tester la fonctionnalité du chien de garde et ne doit pas être exécutée sur des machines de production.

  1. Exécutez la commande suivante pour vérifier que la VM est connectée au dispositif de surveillance :

    $ lspci | grep watchdog -i
  2. Exécutez l'une des commandes suivantes pour confirmer que le chien de garde est actif :

    • Déclencher une panique du noyau :

      # echo c > /proc/sysrq-trigger
    • Mettre fin au service de chien de garde :

      # pkill -9 watchdog

10.18.12.3. Installation d'un dispositif de surveillance

Installez le paquet watchdog sur votre machine virtuelle et démarrez le service watchdog.

Procédure

  1. En tant qu'utilisateur root, installez le paquetage watchdog et ses dépendances :

    # yum install watchdog
  2. Décommentez la ligne suivante dans le fichier /etc/watchdog.conf et enregistrez les modifications :

    #watchdog-device = /dev/watchdog
  3. Activer le service watchdog pour qu'il démarre au démarrage :

    # systemctl enable --now watchdog.service

10.18.12.4. Ressources supplémentaires

10.18.13. Importation et mise à jour automatiques de sources de démarrage prédéfinies

Vous pouvez utiliser des sources de démarrage qui sont system-defined et incluses avec OpenShift Virtualization ou user-defined, que vous créez. Les importations et les mises à jour de sources de démarrage définies par le système sont contrôlées par le portail de fonctionnalités du produit. Vous pouvez activer, désactiver ou réactiver les mises à jour à l'aide du portail de fonctionnalités. Les sources de démarrage définies par l'utilisateur ne sont pas contrôlées par le portail de fonctionnalités du produit et doivent être gérées individuellement pour activer ou désactiver les importations et les mises à jour automatiques.

Important

À partir de la version 4.10, OpenShift Virtualization importe et met à jour automatiquement les sources de démarrage, sauf si vous vous désengagez manuellement ou si vous ne définissez pas de classe de stockage par défaut.

Si vous passez à la version 4.10, vous devez activer manuellement les importations et les mises à jour automatiques pour les sources de démarrage de la version 4.9 ou antérieure.

10.18.13.1. Activation des mises à jour automatiques des sources de démarrage

Si vous avez des sources de démarrage d'OpenShift Virtualization 4.9 ou antérieures, vous devez activer manuellement les mises à jour automatiques pour ces sources de démarrage. Toutes les sources de démarrage d'OpenShift Virtualization 4.10 et plus sont automatiquement mises à jour par défaut.

Pour activer les importations et les mises à jour automatiques des sources de démarrage, définissez le champ cdi.kubevirt.io/dataImportCron sur true pour chaque source de démarrage que vous souhaitez mettre à jour automatiquement.

Procédure

  • Pour activer les mises à jour automatiques pour une source de démarrage, utilisez la commande suivante pour appliquer l'étiquette dataImportCron à la source de données :

    oc label --overwrite DataSource rhel8 -n openshift-virtualization-os-images cdi.kubevirt.io/dataImportCron=true 1
    1
    En spécifiant true, vous activez les mises à jour automatiques pour la source de démarrage rhel8.

10.18.13.2. Désactivation des mises à jour automatiques des sources de démarrage

La désactivation des importations et des mises à jour automatiques de la source de démarrage peut s'avérer utile pour réduire le nombre de journaux dans les environnements déconnectés ou pour réduire l'utilisation des ressources.

Pour désactiver les importations et les mises à jour automatiques de la source de démarrage, définissez le champ spec.featureGates.enableCommonBootImageImport dans la ressource personnalisée (CR) HyperConverged sur false.

Note

Les sources de démarrage définies par l'utilisateur ne sont pas affectées par ce paramètre.

Procédure

  • Utilisez la commande suivante pour désactiver les mises à jour automatiques de la source de démarrage :

    $ oc patch hco kubevirt-hyperconverged -n openshift-cnv \
     --type json -p '[{"op": "replace", "path": "/spec/featureGates/enableCommonBootImageImport", \
     "value": false}]'

10.18.13.3. Réactivation des mises à jour automatiques des sources de démarrage

Si vous avez précédemment désactivé les mises à jour automatiques des sources de démarrage, vous devez réactiver manuellement cette fonctionnalité. Définissez le champ spec.featureGates.enableCommonBootImageImport dans la ressource personnalisée (CR) HyperConverged sur true.

Procédure

  • Utilisez la commande suivante pour réactiver les mises à jour automatiques :

    $ oc patch hco kubevirt-hyperconverged -n openshift-cnv --type json -p '[{"op": "replace", "path": "/spec/featureGates/enableCommonBootImageImport", "value": true}]'

10.18.13.4. Configuration d'une classe de stockage pour les mises à jour de sources de démarrage définies par l'utilisateur

Vous pouvez configurer une classe de stockage qui permet l'importation et la mise à jour automatiques des sources de démarrage définies par l'utilisateur.

Procédure

  1. Définir un nouveau storageClassName en modifiant la ressource personnalisée (CR) HyperConverged.

    apiVersion: hco.kubevirt.io/v1beta1
    kind: HyperConverged
    metadata:
      name: kubevirt-hyperconverged
    spec:
      dataImportCronTemplates:
      - metadata:
          name: rhel8-image-cron
        spec:
          template:
            spec:
              storageClassName: <appropriate_class_name>
    ...
  2. Définissez la nouvelle classe de stockage par défaut en exécutant les commandes suivantes :

    $ oc patch storageclass <current_default_storage_class> -p '{"metadata" : {"annotations":{"storageclass.kubernetes.io/is-default-class":\N "false"}}}'
    $ oc patch storageclass <appropriate_storage_class> -p '{"metadata" : {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

10.18.13.5. Activation des mises à jour automatiques pour les sources de démarrage définies par l'utilisateur

OpenShift Virtualization met automatiquement à jour les sources de démarrage définies par le système par défaut, mais ne met pas automatiquement à jour les sources de démarrage définies par l'utilisateur. Vous devez activer manuellement les importations et les mises à jour automatiques sur les sources de démarrage définies par l'utilisateur en modifiant la ressource personnalisée (CR) HyperConverged.

Procédure

  1. La commande suivante permet d'ouvrir le CR HyperConverged pour l'éditer :

    $ oc edit -n openshift-cnv HyperConverged
  2. Modifiez le CR HyperConverged en ajoutant le modèle et la source de démarrage appropriés dans la section dataImportCronTemplates. Par exemple :

    Exemple sous CentOS 7

    apiVersion: hco.kubevirt.io/v1beta1
    kind: HyperConverged
    metadata:
      name: kubevirt-hyperconverged
    spec:
      dataImportCronTemplates:
      - metadata:
          name: centos7-image-cron
          annotations:
            cdi.kubevirt.io/storage.bind.immediate.requested: "true" 1
        spec:
          schedule: "0 */12 * * *" 2
          template:
            spec:
              source:
                registry: 3
                  url: docker://quay.io/containerdisks/centos:7-2009
              storage:
                resources:
                  requests:
                    storage: 10Gi
          managedDataSource: centos7 4
          retentionPolicy: "None" 5

    1
    Cette annotation est requise pour les classes de stockage dont la valeur volumeBindingMode est fixée à WaitForFirstConsumer.
    2
    Planification du travail spécifié au format cron.
    3
    Permet de créer un volume de données à partir d'une source de registre. Utilisez la valeur par défaut pod pullMethod et non node pullMethod , qui est basée sur le cache de docker node. Le cache docker node est utile lorsqu'une image de registre est disponible via Container.Image, mais que l'importateur CDI n'est pas autorisé à y accéder.
    4
    Pour que l'image personnalisée soit détectée comme source de démarrage disponible, le nom de l'image managedDataSource doit correspondre au nom du modèle DataSource, qui se trouve sous spec.dataVolumeTemplates.spec.sourceRef.name dans le fichier YAML du modèle VM.
    5
    Utilisez All pour conserver les volumes et les sources de données lorsque la tâche cron est supprimée. Utilisez None pour supprimer les volumes et les sources de données lorsque la tâche cron est supprimée.

10.18.13.6. Désactivation d'une mise à jour automatique pour une source de démarrage définie par le système ou par l'utilisateur

Vous pouvez désactiver les importations et les mises à jour automatiques pour une source de démarrage définie par l'utilisateur et pour une source de démarrage définie par le système.

Les sources de démarrage définies par le système n'étant pas répertoriées par défaut dans le site spec.dataImportCronTemplates de la ressource personnalisée (CR) HyperConverged, vous devez ajouter la source de démarrage et désactiver les importations et mises à jour automatiques.

Procédure

  • Pour désactiver les importations et les mises à jour automatiques d'une source de démarrage définie par l'utilisateur, supprimez la source de démarrage du champ spec.dataImportCronTemplates dans la liste des ressources personnalisées.
  • Pour désactiver les importations et les mises à jour automatiques d'une source de démarrage définie par le système :

    • Modifiez le CR HyperConverged et ajoutez la source de démarrage à spec.dataImportCronTemplates.
    • Désactivez les importations et les mises à jour automatiques en définissant l'annotation dataimportcrontemplate.kubevirt.io/enable sur false. Par exemple :

      apiVersion: hco.kubevirt.io/v1beta1
      kind: HyperConverged
      metadata:
        name: kubevirt-hyperconverged
      spec:
        dataImportCronTemplates:
        - metadata:
            annotations:
              dataimportcrontemplate.kubevirt.io/enable: false
            name: rhel8-image-cron
      ...

10.18.13.7. Vérification de l'état d'une source de démarrage

Vous pouvez vérifier si une source de démarrage est définie par le système ou par l'utilisateur.

La section status de chaque source d'amorçage répertoriée dans le champ status.dataImportChronTemplates du CR HyperConverged indique le type de source d'amorçage. Par exemple, commonTemplate: true indique une source d'amorçage définie par le système (commonTemplate) et status: {} indique une source d'amorçage définie par l'utilisateur.

Procédure

  1. Utilisez la commande oc get pour dresser la liste des dataImportChronTemplates dans le CR HyperConverged.
  2. Vérifier l'état de la source de démarrage.

    Exemple de sortie

    ...
    apiVersion: hco.kubevirt.io/v1beta1
    kind: HyperConverged
    ...
    spec:
      ...
    status: 1
      ...
      dataImportCronTemplates: 2
      - metadata:
          annotations:
            cdi.kubevirt.io/storage.bind.immediate.requested: "true"
          name: centos-7-image-cron
        spec:
          garbageCollect: Outdated
          managedDataSource: centos7
          schedule: 55 8/12 * * *
          template:
            metadata: {}
            spec:
              source:
                registry:
                  url: docker://quay.io/containerdisks/centos:7-2009
              storage:
                resources:
                  requests:
                    storage: 30Gi
            status: {}
        status:
          commonTemplate: true 3
        ...
      - metadata:
          annotations:
            cdi.kubevirt.io/storage.bind.immediate.requested: "true"
          name: user-defined-dic
        spec:
          garbageCollect: Outdated
          managedDataSource: user-defined-centos-stream8
          schedule: 55 8/12 * * *
          template:
            metadata: {}
            spec:
              source:
                registry:
                  pullMethod: node
                  url: docker://quay.io/containerdisks/centos-stream:8
              storage:
                resources:
                  requests:
                    storage: 30Gi
            status: {}
        status: {} 4
    ...

    1
    Le champ status pour le CR HyperConverged.
    2
    Le champ dataImportCronTemplates, qui répertorie toutes les sources de démarrage définies.
    3
    Indique une source de démarrage définie par le système.
    4
    Indique une source de démarrage définie par l'utilisateur.

10.18.14. Activation des évictions du désordre sur les machines virtuelles

Vous pouvez utiliser l'ordonnanceur pour expulser les pods afin qu'ils puissent être replanifiés sur des nœuds plus appropriés. Si le pod est une machine virtuelle, l'éviction du pod entraîne la migration en direct de la machine virtuelle vers un autre nœud.

Important

L'éviction du Descheduler pour les machines virtuelles est une fonctionnalité d'aperçu technologique uniquement. Les fonctionnalités de l'aperçu technologique ne sont pas prises en charge par les accords de niveau de service (SLA) de production de Red Hat et peuvent ne pas être complètes sur le plan fonctionnel. Red Hat ne recommande pas de les utiliser en production. Ces fonctionnalités offrent un accès anticipé aux fonctionnalités des produits à venir, ce qui permet aux clients de tester les fonctionnalités et de fournir un retour d'information pendant le processus de développement.

Pour plus d'informations sur la portée de l'assistance des fonctionnalités de l'aperçu technologique de Red Hat, voir Portée de l'assistance des fonctionnalités de l'aperçu technologique.

10.18.14.1. Profils du déschedulateur

Utilisez le profil Technology Preview DevPreviewLongLifecycle pour activer le descheduler sur une machine virtuelle. Il s'agit du seul profil de déscheduler actuellement disponible pour OpenShift Virtualization. Pour garantir une planification correcte, créez des VM avec des demandes de CPU et de mémoire pour la charge attendue.

DevPreviewLongLifecycle

Ce profil équilibre l'utilisation des ressources entre les nœuds et permet les stratégies suivantes :

  • RemovePodsHavingTooManyRestarts: supprime les pods dont les conteneurs ont été redémarrés trop de fois et les pods dont la somme des redémarrages de tous les conteneurs (y compris les Init Containers) est supérieure à 100. Le redémarrage du système d'exploitation invité de la VM n'augmente pas ce nombre.
  • LowNodeUtilizationl'ordonnanceur : évince les pods des nœuds sur-utilisés lorsqu'il y a des nœuds sous-utilisés. Le nœud de destination du pod évincé sera déterminé par l'ordonnanceur.

    • Un nœud est considéré comme sous-utilisé si son utilisation est inférieure à 20 ou à tous les seuils (CPU, mémoire et nombre de pods).
    • Un nœud est considéré comme surutilisé si son utilisation est supérieure à 50 ou à l'un des seuils (CPU, mémoire et nombre de pods).

10.18.14.2. Installation du déschedulateur

Le descheduler n'est pas disponible par défaut. Pour l'activer, vous devez installer Kube Descheduler Operator depuis OperatorHub et activer un ou plusieurs profils de descheduler.

Par défaut, le descheduler fonctionne en mode prédictif, ce qui signifie qu'il ne fait que simuler les évictions de pods. Vous devez changer le mode en mode automatique pour que le descheduler effectue les évictions de pods.

Important

Si vous avez activé les plans de contrôle hébergés dans votre cluster, définissez un seuil de priorité personnalisé pour réduire le risque d'éviction des pods dans les espaces de noms des plans de contrôle hébergés. Définissez le nom de la classe de seuil de priorité sur hypershift-control-plane, car elle a la valeur de priorité la plus basse (100000000) des classes de priorité du plan de contrôle hébergé.

Conditions préalables

  • Privilèges d'administrateur de cluster.
  • Accès à la console web d'OpenShift Container Platform.

Procédure

  1. Connectez-vous à la console web de OpenShift Container Platform.
  2. Créer l'espace de noms requis pour l'opérateur Kube Descheduler.

    1. Naviguez jusqu'à Administration Namespaces et cliquez sur Create Namespace.
    2. Entrez openshift-kube-descheduler-operator dans le champ Name, entrez openshift.io/cluster-monitoring=true dans le champ Labels pour activer les métriques du déscheduler, et cliquez sur Create.
  3. Installez l'opérateur Kube Descheduler.

    1. Naviguez jusqu'à Operators OperatorHub.
    2. Tapez Kube Descheduler Operator dans le champ de filtre.
    3. Sélectionnez le site Kube Descheduler Operator et cliquez sur Install.
    4. Sur la page Install Operator, sélectionnez A specific namespace on the cluster. Sélectionnez openshift-kube-descheduler-operator dans le menu déroulant.
    5. Ajustez les valeurs de Update Channel et Approval Strategy aux valeurs souhaitées.
    6. Cliquez sur Install.
  4. Créer une instance de déscheduler.

    1. Dans la page Operators Installed Operators, cliquez sur Kube Descheduler Operator.
    2. Sélectionnez l'onglet Kube Descheduler et cliquez sur Create KubeDescheduler.
    3. Modifiez les paramètres si nécessaire.

      1. Pour expulser des pods au lieu de simuler les expulsions, remplacez le champ Mode par Automatic.
      2. Développez la section Profiles et sélectionnez DevPreviewLongLifecycle. Le profil AffinityAndTaints est activé par défaut.

        Important

        Le seul profil actuellement disponible pour OpenShift Virtualization est DevPreviewLongLifecycle.

Vous pouvez également configurer les profils et les paramètres du déscheduler ultérieurement à l'aide de la CLI OpenShift (oc).

10.18.14.3. Activation des évictions du déscheduler sur une machine virtuelle (VM)

Une fois le descheduler installé, vous pouvez activer les évictions du descheduler sur votre VM en ajoutant une annotation à la ressource personnalisée (CR) VirtualMachine.

Conditions préalables

  • Installez le descheduler dans la console web de OpenShift Container Platform ou OpenShift CLI (oc).
  • Assurez-vous que la machine virtuelle n'est pas en cours d'exécution.

Procédure

  1. Avant de démarrer la VM, ajoutez l'annotation descheduler.alpha.kubernetes.io/evict au CR VirtualMachine:

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    spec:
      template:
        metadata:
          annotations:
            descheduler.alpha.kubernetes.io/evict: "true"
  2. Si vous n'avez pas déjà défini le profil DevPreviewLongLifecycle dans la console web lors de l'installation, spécifiez le profil DevPreviewLongLifecycle dans la section spec.profile de l'objet KubeDescheduler:

    apiVersion: operator.openshift.io/v1
    kind: KubeDescheduler
    metadata:
      name: cluster
      namespace: openshift-kube-descheduler-operator
    spec:
      deschedulingIntervalSeconds: 3600
      profiles:
      - DevPreviewLongLifecycle
      mode: Predictive 1
    1
    Par défaut, le descheduler n'évince pas les pods. Pour évincer des pods, définissez mode à Automatic.

L'ordonnanceur est maintenant activé sur la VM.

10.18.14.4. Ressources supplémentaires

Red Hat logoGithubRedditYoutubeTwitter

Apprendre

Essayez, achetez et vendez

Communautés

À propos de la documentation Red Hat

Nous aidons les utilisateurs de Red Hat à innover et à atteindre leurs objectifs grâce à nos produits et services avec un contenu auquel ils peuvent faire confiance.

Rendre l’open source plus inclusif

Red Hat s'engage à remplacer le langage problématique dans notre code, notre documentation et nos propriétés Web. Pour plus de détails, consultez leBlog Red Hat.

À propos de Red Hat

Nous proposons des solutions renforcées qui facilitent le travail des entreprises sur plusieurs plates-formes et environnements, du centre de données central à la périphérie du réseau.

© 2024 Red Hat, Inc.