Como engenheiro de DevOps, você pode provisionar uma VM e seu SO convidado de forma declarativa, gravando as especificações de implantação da VM em um arquivo YAML do Kubernetes.

Pré-requisitos

  • Verifique se você tem recursos disponíveis para implantar uma VM no seu namespace. Consulte o Exibir recursos de VM disponíveis em um namespace no vSphere with Tanzu.
  • Se você usar NVIDIA vGPU ou outros dispositivos PCI para suas VMs, as seguintes considerações se aplicam:
    • Certifique-se de usar a classe de VM apropriada com a configuração de PCI. Consulte o Adicionar dispositivos PCI a uma classe de VM no vSphere with Tanzu.
    • VMs com dispositivos vGPU exigem imagens que tenham o modo de inicialização definido como EFI, como CentOS. Certifique-se de ter acesso a essas imagens. Para obter informações sobre imagens compatíveis, procure por VM Service image no site VMware Cloud Marketplace .
    • As VMs com dispositivos vGPU gerenciados pelo VM Service são desligadas automaticamente quando um host ESXi entra no modo de manutenção. Isso pode afetar temporariamente as cargas de trabalho em execução nas VMs. As VMs são ligadas automaticamente depois que o host entra no modo de manutenção.

Procedimento

  1. Prepare o arquivo YAML da VM.
    No arquivo, especifique os seguintes parâmetros:
    Opção Descrição
    apiVersão Especifica a versão da API do serviço de VM. Como vmoperator.vmware.com/v1alpha1 .
    tipo Especifica o tipo de recurso do Kubernetes a ser criado. O único valor disponível é VirtualMachine .
    spec.imageName Especifica a imagem da biblioteca de conteúdo que a VM deve usar. Por exemplo, centos-stream-8-vmservice-v1alpha1-xxxxxxxxxxxxx .
    spec.storageClass Identifica a classe de armazenamento a ser usada para armazenamento dos volumes persistentes. Por exemplo, wcpglobal-storage-profile .
    spec.className Especifica o nome da classe de VM que descreve as configurações de hardware virtual a serem usadas. Por exemplo, personalizado .
    spec.networkInterfaces Especifica as configurações relacionadas à rede para a VM.
    • networkType. Os valores para essa chave podem ser nsx-t ou vsphere-Distributed .
    • networkName. Especifique o nome somente se networkType for vsphere-Distributed . Você pode obter essas informações usando o comando kubectl get network.

      Se networkType for nsx-t , você não precisará indicar networkName.

    spec.vmMetadata Inclui metadados adicionais para passar para a VM. Você pode usar essa chave para personalizar a imagem do sistema operacional convidado e definir itens como o hostname da VM e o user-data, incluindo senhas, chaves SSH e assim por diante. O exemplo de YAML abaixo usa ConfigMap para armazenar os metadados.
    Use o seguinte como um exemplo de um arquivo 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 contém o blob cloud-config que especifica o nome de usuário e a senha para o sistema operacional convidado. Neste exemplo, user-data em vmsvc-centos-nginx-cm ConfigMap representa o seguinte trecho no 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
    Para obter mais informações sobre as especificações de configuração de nuvem, consulte https://cloudinit.readthedocs.io/en/latest/topics/examples.html.
  2. Implante a VM.
    kubectl apply -f vmsvc-centos-vm.yaml
  3. Verifique se a VM foi criada.
    kubectl get vm -n my-ns-centos
    NAME              AGE
    vmsvc-centos-vm   28s
  4. Verifique o status da VM e dos eventos associados.
    kubectl describe virtualmachine vmsvc-centos-vm

    A saída é semelhante à seguinte. Na saída, você também pode obter o endereço IP da VM, que aparece no 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. Verifique se o IP da VM está acessível.
    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

Resultados

Uma VM criada por meio do Serviço de VM pode ser gerenciada apenas pelo DevOps do namespace do Kubernetes. Seu ciclo de vida não pode ser gerenciado a partir do vSphere Client, mas os administradores do vSphere podem monitorar a VM e seus recursos. Para obter mais informações, consulte Monitoramento de máquinas virtuais disponíveis em vSphere with Tanzu.

O que Fazer Depois

Para obter detalhes adicionais, consulte o blog Introducing Virtual Machine Provisioning .

Se a VM incluir um dispositivo PCI configurado para vGPU, instale o driver de vídeo NVIDIA. Consulte o Instale o driver convidado NVIDIA em uma VM no vSphere with Tanzu.