En tant qu'ingénieur DevOps, vous pouvez provisionner 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

  • Vérifiez que vous disposez de ressources disponibles pour déployer une machine virtuelle dans votre espace de noms. Reportez-vous à la section Afficher les ressources de machine virtuelle disponibles dans un espace de noms dans vSphere with Tanzu.
  • 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. Assurez-vous d'avoir accès à ces images. Pour obtenir des informations sur les images prises en charge, recherchez VM Service image sur le site VMware Cloud Marketplace.
    • 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. Par exemple, centos-stream-8-vmservice-v1alpha1-xxxxxxxxxxxxx.
    spec.storageClass​ Identifie la classe de stockage à utiliser pour le stockage des volumes persistants. Par exemple, wcpglobal-storage-profile.
    spec.className Spécifie le nom de la classe de machine virtuelle qui décrit les paramètres de matériel virtuel à utiliser. Par exemple, custom.
    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.
    Utilisez ce qui suit comme exemple de fichier YAML vmsvc-centos-vm.yaml.
    apiVersion: vmoperator.vmware.com/v1alpha1
    kind: VirtualMachine
    metadata:
      name: vmsvc-centos-vm
      namespace: my-ns-centos
    spec:
      imageName: centos-stream-8-vmservice-v1alpha1-xxxxxxxxxxxxx
      className: custom
      powerState: poweredOn
      storageClass: wcpglobal-storage-profile
      networkInterfaces:
      - networkName: primary
        networkType: vsphere-distributed
      vmMetadata:
          configMapName: vmsvc-centos-nginx-cm
          transport: OvfEnv
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
        name: vmsvc-centos-nginx-cm
        namespace: my-ns-centos
    data:
      user-data: >-
        I2Nsb3VkLWNvbmZpZwoKcGFzc3dvcmQ6IFZNV0FSRQpzc2hfcHdhdXRoOiB0cnVlCgp1c2VyczoKICAtIG5hbWU6IHZtd2FyZQogICAgc3VkbzogQUxMPShBTEwpIE5PUEFTU1dEOkFMTAogICAgbG9ja19wYXNzd2Q6IGZhbHNlCiAgICAjIFBhc3N3b3JkIHNldCB0byBBZG1pbiEyMwogICAgcGFzc3dkOiAnJDEkc2FsdCRTT0MzM2ZWYkEvWnhlSXdENXl3MXUxJwogICAgc2hlbGw6IC9iaW4vYmFzaAoKd3JpdGVfZmlsZXM6CiAgLSBjb250ZW50OiB8CiAgICAgIFZNU1ZDIFNheXMgSGVsbG8gV29ybGQKICAgIHBhdGg6IC9oZWxsb3dvcmxkCg==
    ConfigMap contient le blob cloud-config qui spécifie le nom d'utilisateur et le mot de passe du système d'exploitation invité. Dans cet exemple, user-data dans le ConfigMap vmsvc-centos-nginx-cm représente l'extrait de code suivant au format base64 :
    #cloud-config
    password: VMWARE
    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
    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 vmsvc-centos-vm.yaml
  3. Vérifiez que la machine virtuelle a été créée.
    kubectl get vm -n my-ns-centos
    NAME              AGE
    vmsvc-centos-vm   28s
  4. Vérifiez l'état de la machine virtuelle et les événements associés.
    kubectl describe virtualmachine vmsvc-centos-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:         vmsvc-centos-vm
    Namespace:    my-ns-centos
    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:  custom
      Image Name:  vmservice-centos-20-10-server-cloudimg-amd64
      Network Interfaces:
        Network Name:  primary
        Network Type:  vsphere-distributed
      Power State:     poweredOn
      Storage Class:   wcpglobal-storage-profile
      Vm Metadata:
        Config Map Name:  vmsvc-centos-nginx-cm
        Transport:        OvfEnv
    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.

Si la machine virtuelle inclut un périphérique PCI configuré pour vGPU, installez le pilote d'affichage NVIDIA. Reportez-vous à la section Installer le pilote NVIDIA invité dans une machine virtuelle dans vSphere with Tanzu.