Como ingeniero de desarrollo y operaciones, puede aprovisionar una máquina virtual y su SO invitado de forma declarativa al escribir especificaciones de implementación de máquina virtual en un archivo YAML de Kubernetes.

Requisitos previos

  • Compruebe si dispone de recursos para implementar una máquina virtual en el espacio de nombres. Consulte Ver recursos de máquina virtual disponibles en un espacio de nombres en vSphere with Tanzu.
  • Si utiliza vGPU de NVIDIA u otros dispositivos PCI para sus máquinas virtuales, se aplican las siguientes consideraciones:
    • Asegúrese de utilizar la clase de máquina virtual adecuada con la configuración de PCI. Consulte Agregar dispositivos PCI a una clase de máquina virtual en vSphere with Tanzu.
    • Las máquinas virtuales con dispositivos de vGPU requieren imágenes que tengan el modo de arranque establecido en EFI, como CentOS. Asegúrese de tener acceso a estas imágenes. Si desea información sobre imágenes compatibles, busque la imagen del servicio de máquina virtual en el sitio web VMware Cloud Marketplace.
    • Las máquinas virtuales con dispositivos vGPU administradas por el servicio de máquina virtual se apagan automáticamente cuando un host ESXi entra en modo de mantenimiento. Esto puede afectar temporalmente a las cargas de trabajo que se ejecutan en las máquinas virtuales. Las máquinas virtuales se encienden automáticamente después de que el host sale del modo de mantenimiento.

Procedimiento

  1. Prepare el archivo YAML de la máquina virtual.
    En el archivo, especifique los siguientes parámetros:
    Opción Descripción
    apiVersion Especifica la versión de la API del servicio de máquina virtual. Por ejemplo, vmoperator.vmware.com/v1alpha1.
    kind Especifica el tipo de recurso de Kubernetes que se debe crear. El único valor disponible es VirtualMachine.
    spec.imageName Especifica la imagen de la biblioteca de contenido que debe utilizar la máquina virtual. Por ejemplo, centos-stream-8-vmservice-v1alpha1-xxxxxxxxxxxxx.
    spec.storageClass​ Identifica la clase de almacenamiento que se utilizará para el almacenamiento de los volúmenes persistentes. Por ejemplo, wcpglobal-storage-profile.
    spec.className Especifica el nombre de la clase de máquina virtual que describe la configuración de hardware virtual que se utilizará. Por ejemplo, custom.
    spec.networkInterfaces Especifica la configuración relacionada con la red para la máquina virtual.
    • networkType. Los valores para esta clave pueden ser nsx-t o vsphere-distributed.
    • networkName. Especifique el nombre solo si networkType es vsphere-distributed. Puede obtener esta información mediante el comando kubectl get network.

      Si networkType es nsx-t, no es necesario que indique networkName.

    spec.vmMetadata Incluye metadatos adicionales que se transferirán a la máquina virtual. Puede utilizar esta clave para personalizar la imagen del SO invitado y establecer estos elementos como el hostname de la máquina virtual y user-data, incluidas las contraseñas, las claves SSH, etc. El YAML de ejemplo siguiente utiliza ConfigMap para almacenar los metadatos.
    Utilice lo siguiente como ejemplo de un archivo 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 el blob de cloud-config que especifica el nombre de usuario y la contraseña del SO invitado. En este ejemplo, user-data en vmsvc-centos-nginx-cm, ConfigMap representa el siguiente fragmento de código en 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 obtener más información sobre las especificaciones de cloud-config, consulte https://cloudinit.readthedocs.io/en/latest/topics/examples.html.
  2. Implemente la máquina virtual.
    kubectl apply -f vmsvc-centos-vm.yaml
  3. Compruebe que se haya creado la máquina virtual.
    kubectl get vm -n my-ns-centos
    NAME              AGE
    vmsvc-centos-vm   28s
  4. Compruebe el estado de la máquina virtual y los eventos asociados.
    kubectl describe virtualmachine vmsvc-centos-vm

    Los resultados son similares al siguiente. De los resultados también puede obtener la dirección IP de la máquina virtual, que aparece en el 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. Compruebe que se pueda acceder a la IP de la máquina virtual.
    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

Una máquina virtual creada a través del servicio de máquina virtual solo puede administrarla desarrollo y operaciones desde el espacio de nombres de Kubernetes. Su ciclo de vida no puede administrarse desde vSphere Client, pero los administradores de vSphere pueden supervisar la máquina virtual y sus recursos. Para obtener más información, consulte Supervisar máquinas virtuales disponibles en vSphere with Tanzu.

Qué hacer a continuación

Para obtener más información, consulte el blog Introducción al aprovisionamiento de máquinas virtuales.

Si la máquina virtual incluye un dispositivo PCI configurado para vGPU, instale el controlador de pantalla NVIDIA. Consulte Instalar el controlador invitado de NVIDIA en una máquina virtual en vSphere with Tanzu.