En tant qu'ingénieur DevOps, vous pouvez vérifier les ressources de machine virtuelle disponibles et provisionner une machine virtuelle autonome dans un espace de noms sur un Superviseur. Utilisez la commande kubectl pour effectuer les tâches suivantes.

Conditions requises

Pour pouvoir déployer une machine virtuelle autonome dans vSphere with Tanzu, un ingénieur DevOps doit avoir accès à des ressources de machine virtuelle spécifiques. Assurez-vous qu'un administrateur vSphere a effectué ces étapes pour rendre les ressources de machine virtuelle disponibles :

Afficher les ressources de machine virtuelle disponibles dans un espace de noms dans vSphere with Tanzu

En tant qu'ingénieur DevOps, vérifiez que vous pouvez accéder à ces ressources de machine virtuelle sur votre espace de noms et afficher les classes et les modèles de machine virtuelle disponibles dans votre environnement. Vous pouvez également répertorier les classes de stockage et d'autres éléments dont vous pouvez avoir besoin pour utiliser une machine virtuelle en libre-service.

Cette tâche couvre les commandes que vous utilisez pour accéder aux ressources disponibles pour un déploiement d'une machine virtuelle autonome. Pour plus d'informations sur les ressources nécessaires pour déployer des clusters et des machines virtuelles Tanzu Kubernetes Grid qui constituent les clusters, reportez-vous à la section Classes de machines virtuelles pour les clusters TKG dans la documentation Utilisation de Tanzu Kubernetes Grid 2 avec vSphere with Tanzu.

Procédure

  1. Accédez à votre espace de noms dans l'environnement Kubernetes.
    Reportez-vous à la section Obtenir et utiliser le contexte du Superviseur.
  2. Pour afficher les classes de machine virtuelle disponibles dans votre espace de noms, exécutez la commande suivante.
    kubectl get virtualmachineclassbindings
    Vous pouvez voir la sortie suivante.
    Note : Étant donné que le type de classe de machine virtuelle Meilleur effort permet de surcharger les ressources, vous pouvez manquer de ressources si vous avez défini des limites sur l'espace de noms dans lequel vous provisionnez les machines virtuelles. Pour cette raison, utilisez le type de classe de machine virtuelle Garantie dans l'environnement de production.
    NAME                       VIRTUALMACHINECLASS        AGE
    
    best-effort-large          best-effort-large          44m
    best-effort-medium         best-effort-medium         44m
    best-effort-small          best-effort-small          44m
    best-effort-xsmall         best-effort-xsmall         44m
    custom                     custom                     44m
  3. Pour afficher les détails d'une classe de machine virtuelle spécifique, exécutez les commandes suivantes.
    • kubectl describe virtualmachineclasses name_vm_class

      Si une classe de machine virtuelle inclut un périphérique vGPU, vous pouvez voir son profil sous spec: hardware: devices: vgpuDevices.

      ......
      spec:
        hardware:
          cpus: 4
          devices:
            vgpuDevices:
            - profileName: grid_v100-q4
      ......
      
    • kubectl get virtualmachineclasses -o wide

      Si la classe de machine virtuelle inclut un périphérique vGPU ou de relais, la sortie l'affiche dans la colonne VGPUDevicesProfileNames ou PassthroughDeviceIDs.

  4. Affichez les images de machine virtuelle.
    kubectl get virtualmachineimages​
    La sortie obtenue est semblable à l'exemple suivant.
    NAME                                              VERSION  OSTYPE                FORMAT  IMAGESUPPORTED  AGE
    centos-stream-8-vmservice-v1alpha1-xxxxxxxxxxxxx           centos8_64Guest       ovf     true            4d3h
  5. Pour décrire une image spécifique, utilisez la commande suivante.
    kubectl describe virtualmachineimage/centos-stream-8-vmservice-v1alpha1-xxxxxxxxxxxxx

    Les machines virtuelles disposant de périphériques vGPU requièrent des images dont le mode de démarrage est défini sur EFI, tels que CentOS. Assurez-vous d'avoir accès à ces images.

  6. Vérifiez que vous pouvez accéder aux classes de stockage.
    kubectl get resourcequotas
    NAME                        AGE   REQUEST                                                                                         LIMIT
    my-ns-ubuntu-storagequota   24h   wcpglobal-storage-profile.storageclass.storage.k8s.io/requests.storage: 0/9223372036854775807
  7. Si vous utilisez vSphere Distributed Switch pour la mise en réseau de votre charge de travail, obtenez le nom du réseau.
    Note : Vous utilisez ces informations pour spécifier le paramètre networkName dans le fichier YAML de la machine virtuelle lorsque la valeur de networkType est vsphere-distributed. Vous n'avez pas besoin d'obtenir et de spécifier le nom du réseau si vous utilisez VMware NSX.
    kubectl get network
    NAME      AGE
    primary   7d2h

Déployer une machine virtuelle dans vSphere with Tanzu

En tant qu'ingénieur DevOps, provisionnez une machine virtuelle et son système d'exploitation invité de manière déclarative en écrivant des spécifications de déploiement de machines virtuelles dans un fichier YAML Kubernetes.

Conditions préalables

Si vous utilisez NVIDIA vGPU ou d'autres périphériques PCI pour vos machines virtuelles, les considérations suivantes s'appliquent :
  • Veillez à utiliser la classe de machine virtuelle appropriée avec la configuration PCI. Reportez-vous à la section Ajouter des périphériques PCI à une classe de machine virtuelle dans vSphere with Tanzu.
  • Les machines virtuelles disposant de périphériques vGPU requièrent des images dont le mode de démarrage est défini sur EFI, tels que CentOS.
  • Les machines virtuelles disposant de périphériques vGPU gérées par le service de VM sont automatiquement mises hors tension lorsqu'un hôte ESXi passe en mode de maintenance. Cela peut affecter temporairement les charges de travail en cours d'exécution dans les machines virtuelles. Les machines virtuelles sont automatiquement mises sous tension dès que l'hôte sort du mode de maintenance.

Procédure

  1. Préparez le fichier YAML de la machine virtuelle.
    Dans le fichier, spécifiez les paramètres suivants :
    Option Description
    apiVersion Spécifie la version de l'API de service de machine virtuelle. Par exemple, vmoperator.vmware.com/v1alpha1.
    kind Spécifie le type de ressource Kubernetes à créer. La seule valeur disponible est VirtualMachine.
    spec.imageName Spécifie l'image de bibliothèque de contenu que la machine virtuelle doit utiliser.
    spec.storageClass​ Identifie la classe de stockage à utiliser pour le stockage des volumes persistants.
    spec.className Spécifie le nom de la classe de machine virtuelle qui décrit les paramètres de matériel virtuel à utiliser.
    spec.networkInterfaces Spécifie les paramètres liés au réseau pour la machine virtuelle.
    • networkType. Les valeurs de la clé peuvent être nsx-t ou vsphere-distributed.
    • networkName. Spécifiez le nom uniquement si la valeur de networkType est vsphere-distributed. Vous pouvez obtenir ces informations à l'aide de la commande kubectl get network.

      Si networkType a la valeur nsx-t, vous n'avez pas besoin d'indiquer networkName.

    spec.vmMetadata Inclut des métadonnées supplémentaires à transmettre à la machine virtuelle. Vous pouvez utiliser cette clé pour personnaliser l'image du système d'exploitation invité et définir des éléments tels que le hostname de la machine virtuelle et des user-data, notamment les mots de passe, les clés SSH, etc. L'exemple de YAML ci-dessous utilise ConfigMap pour stocker les métadonnées.
    topology.kubernetes.io/zone Contrôle le placement des machines virtuelles sur un Superviseur à trois zones. Par exemple, topology.kubernetes.io/zone: zone-a02.
    Utilisez ce qui suit comme exemple de fichier YAML ubuntu-impish-vm.yaml.
    apiVersion: vmoperator.vmware.com/v1alpha1
    kind: VirtualMachine
    metadata:
      name: ubuntu-impish-vm
      namespace: sr-1
      annotations:
        vmoperator.vmware.com/image-supported-check: disable
    spec:
      networkInterfaces:
      - networkName: ""
        networkType: nsx-t
      className: best-effort-medium
      imageName: ubuntu-impish-21.10-cloudimg 
      powerState: poweredOn
      storageClass: vsan-default-storage-policy
      vmMetadata:
        configMapName: user-data-2
        transport: CloudInit
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
        name: user-data-2
        namespace: sr-1
    data:
      user-data: |
        #cloud-config
        ssh_pwauth: true
        users:
          - name: vmware
            sudo: ALL=(ALL) NOPASSWD:ALL
            lock_passwd: false
            passwd: '$1$salt$SOC33fVbA/ZxeIwD5yw1u1'
            shell: /bin/bash
        write_files:
          - content: |
              VMSVC Says Hello World
            path: /helloworld
    ConfigMap contient le blob cloud-config qui spécifie le nom d'utilisateur et le mot de passe du système d'exploitation invité.
    Pour plus d'informations sur les spécifications cloud-config, reportez-vous à la section https://cloudinit.readthedocs.io/en/latest/topics/examples.html.
  2. Déployez la machine virtuelle.
    kubectl apply -f ubuntu-impish-vm.yaml
  3. Vérifiez que la machine virtuelle a été créée.
    kubectl get vm -n ubuntu-impish-vm
    NAME              AGE
    ubuntu-impish-vm  28s
  4. Vérifiez l'état de la machine virtuelle et les événements associés.
    kubectl describe virtualmachine ubuntu-impish-vm

    Le résultat est semblable à l'exemple suivant. À partir de la sortie, vous pouvez également obtenir l'adresse IP de la machine virtuelle, qui s'affiche dans le champ Vm Ip.

    Name:         ubuntu-impish-vm
    Namespace:    sr-1
    Annotations:  vmoperator.vmware.com/image-supported-check: disabled
    API Version:  vmoperator.vmware.com/v1alpha1
    Kind:         VirtualMachine
    Metadata:
      Creation Timestamp:  2021-03-23T19:07:36Z
      Finalizers:
        virtualmachine.vmoperator.vmware.com
      Generation:  1
      Managed Fields:
     ...  
     ... 
    Spec:
      Class Name:  best-effort-medium
      Image Name:  ubuntu-impish-21.10-cloudimg
      Network Interfaces:
        Network Name:  ""
        Network Type:  nsx-t
      Power State:     poweredOn
      Storage Class:   vsan-default-storage-policy
      Vm Metadata:
        Config Map Name:  user-data-2
        Transport:        CloudInit
    Status:
      Bios UUID:              4218ec42-aeb3-9491-fe22-19b6f954ce38
      Change Block Tracking:  false
      Conditions:
        Last Transition Time:  2021-03-23T19:08:59Z
        Status:                True
        Type:                  VirtualMachinePrereqReady
      Host:                    10.185.240.10
      Instance UUID:           50180b3a-86ee-870a-c3da-90ddbaffc950
      Phase:                   Created
      Power State:             poweredOn
      Unique ID:               vm-73
      Vm Ip:                   10.161.75.162
    Events:                    <none>
    ...
    
  5. Vérifiez que l'adresse IP de la VM est atteignable.
    ping 10.161.75.162
    PING 10.161.75.162 (10.161.75.162): 56 data bytes
    64 bytes from 10.161.75.162: icmp_seq=0 ttl=59 time=43.528 ms
    64 bytes from 10.161.75.162: icmp_seq=1 ttl=59 time=53.885 ms
    64 bytes from 10.161.75.162: icmp_seq=2 ttl=59 time=31.581 ms

Résultats

Une machine virtuelle créée via le service de machine virtuelle peut être gérée uniquement par DevOps à partir de l'espace de noms Kubernetes. Son cycle de vie ne peut pas être géré à partir de vSphere Client, mais les administrateurs vSphere peuvent surveiller la machine virtuelle et ses ressources. Pour plus d'informations, consultez Surveiller les machines virtuelles disponibles dans vSphere with Tanzu.

Que faire ensuite

Pour plus d'informations, consultez le blog Présentation du provisionnement de machine virtuelle.

Installer le pilote NVIDIA invité dans une machine virtuelle dans vSphere with Tanzu

Si la machine virtuelle inclut un périphérique PCI configuré pour vGPU, après avoir créé et démarré la machine virtuelle dans votre environnement vSphere with Tanzu, installez le pilote graphique NVIDIA vGPU pour activer entièrement les opérations GPU.

Conditions préalables

  • Assurez-vous que la machine virtuelle que vous avez créée fait référence à la classe de machine virtuelle avec la définition de vGPU. Reportez-vous à la section Ajouter des périphériques PCI à une classe de machine virtuelle dans vSphere with Tanzu.
  • Vérifiez que vous avez téléchargé le module logiciel vGPU depuis le site de téléchargement NVIDIA, que vous avez décompressé le module et que le composant du lecteur invité est prêt. Pour plus d'informations, reportez-vous à la documentation appropriée du logiciel de GPU virtuel NVIDIA.
    Note : La version du composant de pilote doit correspondre à la version de vGPU Manager qu'un administrateur vSphere a installé sur l'hôte ESXi.

Procédure

  1. Copiez le module du pilote logiciel Linux NVIDIA vGPU, par exemple NVIDIA-Linux-x86_64-version-grid.run, sur la machine virtuelle invitée.
  2. Avant de tenter d’exécuter le programme d’installation du pilote, arrêtez toutes les applications.
  3. Démarrez le programme d'installation du pilote NVIDIA vGPU.
    sudo ./NVIDIA-Linux-x86_64-version-grid.run
  4. Acceptez le contrat de licence du logiciel NVIDIA et sélectionnez Oui pour mettre à jour automatiquement les paramètres de configuration X.
  5. Vérifiez que le pilote a été installé.
    Par exemple,
    ~$ nvidia-smi
    Wed May 19 22:15:04 2021
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 460.63       Driver Version: 460.63       CUDA Version: 11.2     |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |                               |                      |               MIG M. |
    |===============================+======================+======================|
    |   0  GRID V100-4Q        On   | 00000000:02:00.0 Off |                  N/A|
    | N/AN/AP0    N/A/  N/A|    304MiB /  4096MiB |      0%      Default |
    |                               |                      |                  N/A|
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                                  |
    |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
    |        ID   ID                                                   Usage      |
    |=============================================================================|
    |  No running processes found                                                 |
    +-----------------------------------------------------------------------------+