Il tecnico di DevOps può eseguire il provisioning di una macchina virtuale e del relativo sistema operativo guest in modo dichiarativo scrivendo le specifiche di distribuzione della macchina virtuale in un file YAML Kubernetes.

Prerequisiti

  • Verificare di disporre delle risorse disponibili per distribuire una macchina virtuale nello spazio dei nomi. Vedere Visualizzazione delle risorse della macchina virtuale disponibili in uno spazio dei nomi in vSphere with Tanzu.
  • Se si utilizza NVIDIA vGPU o altri dispositivi PCI per le macchine virtuali, tenere presenti le considerazioni seguenti:
    • Assicurarsi di utilizzare la classe di macchine virtuali appropriata con la configurazione PCI. Vedere Aggiunta di dispositivi PCI a una classe di macchine virtuali in vSphere with Tanzu.
    • Le macchine virtuali con dispositivi vGPU richiedono immagini con modalità di avvio impostata su EFI, ad esempio CentOS. Assicurarsi di poter accedere a queste immagini. Per informazioni sulle immagini supportate, cercare VM Service image sul sito Web di VMware Cloud Marketplace.
    • Le macchine virtuali con dispositivi vGPU gestiti dal servizio della macchina virtuale vengono disattivate automaticamente quando un host ESXi passa alla modalità di manutenzione. Questa operazione potrebbe influire temporaneamente sui carichi di lavoro in esecuzione nelle macchine virtuali. Le macchine virtuali vengono accese automaticamente dopo che nell'host è presente la modalità di manutenzione.

Procedura

  1. Preparare il file YAML della macchina virtuale.
    Nel file, specificare i seguenti parametri:
    Opzione Descrizione
    apiVersion Specifica la versione dell'API del servizio della macchina virtuale. Ad esempio vmoperator.vmware.com/v1alpha1.
    kind Specifica il tipo di risorsa Kubernetes da creare. L'unico valore disponibile è VirtualMachine.
    spec.imageName Specifica l'immagine della libreria di contenuti che la macchina virtuale deve utilizzare. Ad esempio, centos-stream-8-vmservice-v1alpha1-xxxxxxxxxxxxx.
    spec.storageClass​ Identifica la classe di storage da utilizzare per lo storage dei volumi persistenti. Ad esempio, wcpglobal-storage-profile.
    spec.className Specifica il nome della classe di macchine virtuali che descrive le impostazioni dell'hardware virtuale da utilizzare. Ad esempio, custom.
    spec.networkInterfaces Specifica le impostazioni relative alla rete per la macchina virtuale.
    • networkType. I valori di questa chiave possono essere nsx-t o vsphere-distributed.
    • networkName. Specificare il nome solo se networkType è vsphere-distributed. È possibile ottenere queste informazioni utilizzando la comando kubectl get network.

      Se networkType è nsx-t, non è necessario indicare networkName.

    spec.vmMetadata Include ulteriori metadati da passare alla macchina virtuale. È possibile utilizzare questa chiave per personalizzare l'immagine del sistema operativo guest e impostare elementi come il hostname della macchina virtuale e dei user-data, tra cui password, chiavi SSH e così via. Il codice YAML di esempio seguente utilizza ConfigMap per archiviare i metadati.
    Utilizzare quanto segue come esempio di un file 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 contiene il blob di cloud-config che specifica il nome utente e la password per il sistema operativo guest. In questo esempio, user-data in vmsvc-centos-nginx-cm ConfigMap rappresenta il seguente frammento in formato 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
    Per maggiori informazioni sulle specifiche di cloud-config, vedere https://cloudinit.readthedocs.io/en/latest/topics/examples.html.
  2. Distribuire la macchina virtuale.
    kubectl apply -f vmsvc-centos-vm.yaml
  3. Verificare che la macchina virtuale sia stata creata.
    kubectl get vm -n my-ns-centos
    NAME              AGE
    vmsvc-centos-vm   28s
  4. Controllare lo stato della macchina virtuale e gli eventi associati.
    kubectl describe virtualmachine vmsvc-centos-vm

    L'output è simile al seguente. Dall'output, è anche possibile ottenere l'indirizzo IP della macchina virtuale, che viene visualizzato nel campo 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. Verificare che l'IP della macchina virtuale sia raggiungibile.
    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

risultati

Una macchina virtuale creata tramite il servizio della macchina virtuale può essere gestita solo da DevOps dallo spazio dei nomi Kubernetes. Il suo ciclo di vita non può essere gestito dal vSphere Client, ma gli amministratori di vSphere possono monitorare la macchina virtuale e le relative risorse. Per ulteriori informazioni, vedere Monitorare le macchine virtuali disponibili in vSphere with Tanzu.

Operazioni successive

Per ulteriori dettagli, vedere il blog Introducing Virtual Machine Provisioning.

Se la macchina virtuale include un dispositivo PCI configurato per la vGPU, installare il driver del monitor NVIDIA. Vedere Installare il driver guest NVIDIA in una macchina virtuale in vSphere with Tanzu.