Trabaja con cargas de trabajo basadas en VM

En esta página, se muestra cómo implementar VM en clústeres de Anthos en equipos físicos mediante el entorno de ejecución de VM de Anthos. El entorno de ejecución de VM de Anthos usa KubeVirt para organizar las VM de los clústeres, lo que te permite trabajar con tus apps y cargas de trabajo basadas en VM en un entorno de desarrollo uniforme. Puedes habilitar el entorno de ejecución de VM de Anthos cuando creas un clúster nuevo y en clústeres existentes.

Antes de comenzar

En estas instrucciones, se supone que tienes un clúster en funcionamiento. De lo contrario, puedes seguir las instrucciones de la guía de inicio rápido para clústeres de Anthos alojados en equipos físicos para configurar un clúster en tu estación de trabajo con rapidez.

Habilita el entorno de ejecución de VM de Anthos

El entorno de ejecución de VM de Anthos está inhabilitado de forma predeterminada. Para habilitar el entorno de ejecución de VM de Anthos, edita el recurso personalizado VMRuntime en el clúster. A partir de los clústeres de Anthos en la versión 1.10.0 de equipos físicos, el recurso personalizado VMRuntime se instala de forma automática en los clústeres.

Para habilitar el entorno de ejecución de VM de Anthos, sigue estos pasos:

  1. Actualiza el recurso personalizado VMRuntime para establecer enabled en true.

    apiVersion: vm.cluster.gke.io/v1
    kind: VMRuntime
    metadata:
      name: vmruntime
    spec:
      enabled: true
      # useEmulation default to false if not set.
      useEmulation: true
      # vmImageFormat default to "qcow2" if not set.
      vmImageFormat: qcow2
    
  2. Si tu nodo no admite la virtualización de hardware, o no estás seguro, establece useEmulation en true.

    Si está disponible, la virtualización de hardware proporciona un mejor rendimiento que la emulación de software. El campo useEmulation se configura de forma predeterminada en false, si no se especifica.

    apiVersion: vm.cluster.gke.io/v1
    kind: VMRuntime
    metadata:
      name: vmruntime
    spec:
      enabled: true
      # useEmulation default to false if not set.
      useEmulation: true
      # vmImageFormat default to "qcow2" if not set.
      vmImageFormat: qcow2
    
  3. Puedes cambiar el formato de imagen que se usa para las VM que creas si configuras el campo vmImageFormat.

    El campo vmImageFormat admite dos valores de formato de imagen de disco: raw y qcow2. Si no configuras vmImageFormat, el entorno de ejecución de VM de Anthos usa el formato de imagen de disco raw para crear VM. El formato raw puede proporcionar un rendimiento mejorado sobre qcow2, una copia en formato de escritura, pero puede usar más capacidad de disco. Si deseas obtener más información sobre los formatos de imagen para tu VM, consulta Formatos de archivo de imagen de disco en la documentación de QEMU.

    apiVersion: vm.cluster.gke.io/v1
    kind: VMRuntime
    metadata:
      name: vmruntime
    spec:
      enabled: true
      # useEmulation default to false if not set.
      useEmulation: true
      # vmImageFormat default to "qcow2" if not set.
      vmImageFormat: qcow2
    
  4. Guarda la configuración y verifica que el recurso personalizado VMRuntime esté habilitado:

    kubectl describe vmruntime vmruntime
    

    En los detalles del recurso personalizado VMRuntime, se incluye una sección Status. El entorno de ejecución de VM de Anthos está habilitado y funciona cuando VMRuntime.Status.Ready se establece en true.

Actualiza los clústeres 1.9.x

El recurso personalizado VMRuntime se instala de forma automática en los clústeres actualizados a la versión 1.10.0 o superior. Cuando actualizas un clúster 1.9.x a la versión 1.10.0 y superior, el proceso de actualización verifica la configuración del clúster y configura el recurso personalizado VMRuntime para que coincida con la configuración del entorno de ejecución de VM de Anthos en tu clúster 1.9.x. Si spec.kubevirt está presente en el recurso del clúster 1.9.x, el proceso de actualización habilita el entorno de ejecución de VM de Anthos.

La configuración de recursos personalizados de VMRuntime tiene prioridad sobre la configuración heredada del clúster de entorno de ejecución de la VM de Anthos, como spec.kubevirt.useEmulation, en clústeres de la versión 1.10.0 o superior. Actualiza el recurso personalizado VMRuntime para cambiar la configuración del entorno de ejecución de VM de Anthos para el clúster 1.10.0 o superior.

Instale virtctl

  1. Instala la herramienta de la CLI virtctl como un complemento kubectl

    export GOOGLE_APPLICATION_CREDENTIALS="bm-gcr.json"
    sudo -E ./bmctl install virtctl
    
  2. Verifica que virtctl esté instalado:

    kubectl plugin list
    

    Si virtctl aparece en la respuesta, significa que se instaló correctamente.

Cree una VM

Una vez que habilites KubeVirt en tu clúster e instales el complemento virtctl para kubectl, puedes comenzar a crear VM en tu clúster con el comando kubectl virt create vm. Antes de ejecutar este comando, te recomendamos configurar un archivo cloud-init para asegurarte de tener acceso de consola a la VM una vez creada.

Crea un archivo cloud-init personalizado para el acceso a la consola

Hay dos formas de crear un archivo cloud-init personalizado. La forma más sencilla es especificar la marca --os=<OPERATING_SYSTEM> cuando se crea la VM. Este método configura automáticamente un archivo cloud-init simple y funciona para los siguientes sistemas operativos.

  • Ubuntu
  • En CentOS
  • Debian
  • Fedora

Una vez que se crea la VM, puedes acceder a ella por primera vez con las siguientes credenciales y, luego, cambiar la contraseña:

user: root
password: changeme

Si tu imagen contiene un SO diferente basado en Linux o necesitas una configuración más avanzada, puedes crear de forma manual un archivo cloud-init personalizado y especificar la ruta al archivo mediante la marca --cloud-init-file=<path/to/file>. En su forma más básica, el archivo cloud-init es un archivo YAML que contiene lo siguiente:

#cloud-config
user: root
password: changeme
lock_passwd: false
chpasswd: {expire: false}
disable_root: false
ssh_authorized_keys:
- <ssh-key>

Para obtener opciones de configuración más avanzadas, consulta los ejemplos de configuración de Cloud.

Una vez que hayas determinado qué método usar, estarás listo para crear una VM.

Ejecuta el comando kubectl virt create vm

Puedes crear VM a partir de imágenes públicas o personalizadas.

Imagen pública

Si tu clúster tiene una conexión externa, puedes crear una VM a partir de una imagen pública si ejecutas lo siguiente:

kubectl virt create vm VM_NAME \
    --boot-disk-access-mode=MODE \
    --boot-disk-size=DISK_SIZE \
    --boot-disk-storage-class="DISK_CLASS" \
    --cloud-init-file=FILE_PATH \
    --cpu=CPU_NUMBER \
    --image=IMAGE_NAME \
    --memory=MEMORY_SIZE

Reemplaza lo siguiente:

  • VM_NAME por el nombre de la VM que deseas crear.
  • MODE por el modo de acceso del disco de arranque. Los valores posibles son ReadWriteOnce (predeterminado) o ReadWriteMany.
  • DISK_SIZE por el tamaño que deseas para el disco de arranque. El valor predeterminado es 20Gi.
  • DISK_CLASS por la clase de almacenamiento del disco de arranque. El valor predeterminado es local-shared. Para obtener una lista de las clases de almacenamiento disponibles, ejecuta kubectl get storageclass.
  • FILE_PATH por la ruta completa del archivo cloud-init personalizado. Según la imagen, es posible que se requiera para obtener acceso de consola a la VM después de crearla. Si planeas configurar el archivo cloud-init con la marca --os de forma automática, no especifiques la marca --cloud-init-file. Si especificas la marca --cloud-init-file, se ignorará la marca --os. Los valores aceptables para --os son ubuntu, centos, debian y fedora.
  • CPU_NUMBER por la cantidad de CPU que deseas configurar para la VM. El valor predeterminado es 1.
  • IMAGE_NAME por la imagen de VM, que puede ser ubuntu20.04 (predeterminado), centos8 o una URL de la imagen.
  • MEMORY_SIZE por el tamaño de memoria de la VM. El valor predeterminado es 4Gi.

Imagen personalizada

Cuando creas una VM a partir de una imagen personalizada, puedes especificar una imagen de un servidor de imágenes HTTP o una imagen almacenada de forma local.

Servidor de imágenes HTTP

Puedes configurar un servidor HTTP mediante Apache o nginx y subir la imagen personalizada a su carpeta expuesta. Luego, puedes crear una VM a partir de la imagen personalizada si ejecutas el siguiente comando:

kubectl virt create vm VM_NAME \
    --boot-disk-access-mode=DISK_ACCESS_MODE \
    --boot-disk-size=DISK_SIZE \
    --boot-disk-storage-class=DISK_CLASS \
    --cloud-init-file=FILE_PATH \
    --cpu=CPU_NUMBER \
    --image=http://SERVER_IP/IMAGE_NAME \
    --memory=MEMORY_SIZE

Reemplaza lo siguiente:

  • VM_NAME por el nombre de la VM que deseas crear.
  • DISK_ACCESS_MODE por el modo de acceso del disco de arranque. Los valores posibles son ReadWriteOnce (predeterminado) o ReadWriteMany.
  • DISK_SIZE por el tamaño que deseas para el disco de arranque. El valor predeterminado es 20Gi.
  • DISK_CLASS por la clase de almacenamiento del disco de arranque. El valor predeterminado es local-shared. Para obtener una lista de las clases de almacenamiento disponibles, ejecuta kubectl get storageclass.
  • FILE_PATH por la ruta completa del archivo cloud-init personalizado. Según la imagen, es posible que se requiera para obtener acceso de consola a la VM después de crearla. Si planeas configurar el archivo cloud-init con la marca --os de forma automática, no especifiques la marca --cloud-init-file. Si especificas la marca --cloud-init-file, se ignorará la marca --os. Los valores aceptables para --os son ubuntu, centos, debian y fedora.
  • CPU_NUMBER por la cantidad de CPU que deseas configurar para la VM. El valor predeterminado es 1.
  • SERVER_IP por la dirección IP del servidor que aloja la imagen.
  • IMAGE_NAME por el nombre del archivo de la imagen personalizada.
  • MEMORY_SIZE por el tamaño de memoria de la VM. El valor predeterminado es 4Gi.

Imagen almacenada de forma local

Puedes almacenar la imagen personalizada de forma local y crear una VM a partir de ella si ejecutas el siguiente comando:

kubectl virt create vm VM_NAME \
    --boot-disk-access-mode=DISK_ACCESS_MODE \
    --boot-disk-size=DISK_SIZE \
    --boot-disk-storage-class=DISK_CLASS \
    --cloud-init-file=FILE_PATH \
    --cpu=CPU_NUMBER \
    --image=IMAGE_PATH \
    --memory=MEMORY_SIZE \

Reemplaza lo siguiente:

  • VM_NAME por el nombre de la VM que deseas crear.
  • DISK_ACCESS_MODE por el modo de acceso del disco de arranque. Los valores posibles son ReadWriteOnce (predeterminado) o ReadWriteMany.
  • DISK_SIZE por el tamaño que deseas para el disco de arranque. El valor predeterminado es 20Gi.
  • DISK_CLASS por la clase de almacenamiento del disco de arranque. El valor predeterminado es local-shared.
  • FILE_PATH por la ruta completa del archivo cloud-init personalizado. Según la imagen, es posible que se requiera para obtener acceso de consola a la VM después de crearla. Si planeas configurar el archivo cloud-init con la marca --os de forma automática, no especifiques la marca --cloud-init-file. Si especificas la marca --cloud-init-file, se ignorará la marca --os. Los valores aceptables para --os son ubuntu, centos, debian y fedora.
  • CPU_NUMBER por la cantidad de CPU que deseas configurar para la VM. El valor predeterminado es 1.
  • IMAGE_PATH por la ruta de acceso del archivo local a la imagen personalizada.
  • MEMORY_SIZE por el tamaño de memoria de la VM. El valor predeterminado es 4Gi.

Cambia los valores predeterminados para las marcas

El comando kubectl virt create vm usa valores predeterminados para autocompletar marcas no especificadas cuando se ejecuta el comando. Para cambiar estos valores predeterminados, ejecuta el siguiente comando:

kubectl virt config default FLAG

Reemplaza FLAG por la marca del parámetro del que deseas cambiar el valor predeterminado.

Ejemplo: Con el siguiente comando, se cambia la configuración predeterminada de la CPU del valor predeterminado inicial de 1 a 2:

kubectl virt config default --cpu=2

Para obtener una lista de las marcas compatibles y sus valores predeterminados actuales, ejecuta lo siguiente:

kubectl virt config default -h

Los parámetros de configuración predeterminados se almacenan del lado del cliente como un archivo local llamado ~/.virtctl.default. También puedes cambiar la configuración predeterminada si editas este archivo.

Accede a tu VM

Puedes acceder a las VM mediante los siguientes métodos:

Acceso a Console

Para acceder a una VM desde Console, ejecuta el siguiente comando:

kubectl virt console VM_NAME

Reemplaza VM_NAME por el nombre de la VM a la que deseas acceder.

Acceso de VNC

Para acceder a una VM mediante VNC, ejecuta:

# This requires remote-viewer from the virt-viewer package and a graphical desktop from where you run virtctl
kubectl virt vnc VM_NAME

Reemplaza VM_NAME por el nombre de la VM a la que deseas acceder.

Acceso interno

Todos los otros pods en el clúster pueden acceder directamente a las direcciones IP de las VM de tu clúster. Para encontrar la dirección IP de una VM, ejecuta este comando:

kubectl get vmi VM_NAME

Reemplaza VM_NAME por el nombre de la VM a la que deseas acceder.

El comando muestra un resultado similar al siguiente:

NAME     AGE   PHASE     IP              NODENAME
vm1      13m   Running   192.168.1.194   upgi-bm002

Acceso externo

Las VM creadas en tu clúster tienen direcciones de red de pod a las que solo se puede acceder desde el clúster. Para acceder a las VM del clúster de forma externa, sigue estos pasos:

  1. Expón la VM como un servicio de balanceador de cargas:

    kubectl virt expose vm VM_NAME \
        --port=LB_PORT \
        --target-port=VM_PORT \
        --type=LoadBalancer \
        --name=SERVICE_NAME
    

    Reemplaza lo siguiente:

    • VM_NAME por el nombre de la VM a la que deseas acceder.
    • LB_PORT por el puerto del servicio del balanceador de cargas que se expone.
    • VM_PORT por el puerto en la VM al que deseas acceder a través del servicio del balanceador de cargas.
    • SERVICE_NAME por el nombre que deseas darle a este servicio de balanceador de cargas.
  2. Obtén la dirección IP externa del servicio del balanceador de cargas como sigue:

    kubectl get svc SERVICE_NAME
    

    Reemplaza SERVICE_NAME por el nombre del servicio del balanceador de cargas que expone la VM.

    Puedes acceder al puerto de destino de la VM mediante la dirección IP que aparece en el campo EXTERNAL-IP de la respuesta.

Ejemplo

Si tienes una VM llamada galaxy a la que deseas acceder desde fuera del clúster mediante SSH, debes ejecutar lo siguiente:

kubectl virt expose vm galaxy \
   --port=25022 \
   --target-port=22 \
   --type=LoadBalancer \
   --name=galaxy-ssh

Obtén la dirección IP del balanceador de cargas:

kubectl get svc galaxy-ssh

El comando muestra un resultado similar al siguiente:

NAME        TYPE          CLUSTER-IP     EXTERNAL-IP   PORT(S)           AGE
galaxy-ssh  LoadBalancer  10.96.250.76   21.1.38.202   25000:30499/TCP   4m40s

Ahora puedes acceder a la VM mediante SSH a través de 21.1.38.202:25022 (VIP:port) desde fuera del clúster:

ssh root@21.1.38.202:22 -p 25022

Inspecciona los registros de la consola y la telemetría de VM

Los registros de la consola y la telemetría de VM se integraron en la consola de Google Cloud. La información de telemetría y los datos de registro son fundamentales para supervisar el estado de las VM y solucionar cualquier problema con las VM del clúster.

Telemetría de VM

En el panel Estado de VM de clústeres de Anthos, se proporcionan datos de telemetría activos para las VM del clúster.

Para ver información de telemetría de las VM de tu clúster, haz lo siguiente:

  1. En la consola de Google Cloud, selecciona Monitoring o haz clic en el siguiente botón:

    Ir a Monitoring

  2. Selecciona Paneles.

    Panel de estado de VM de clústeres de Anthos en la lista de paneles de Monitoring

  3. Haz clic en Estado de VM de clústeres de Anthos en la lista Todos los paneles.

    Detalles del estado de VM de clústeres de Anthos

Registros de la consola de VM

Los registros de la consola en serie de VM se transmiten a Cloud Logging y se pueden ver en el Explorador de registros.

Explorador de registros que muestra datos de VM de clústeres de Anthos

Borra las VM y sus recursos

Borra solo la VM

kubectl virt delete vm VM_NAME

Reemplaza VM_NAME por el nombre de la VM que deseas borrar.

Borra solo los discos de VM

kubectl virt delete disk DISK_NAME

Reemplaza DISK_NAME por el nombre del disco que deseas borrar. Si intentas borrar un disco de una VM antes de borrarla, este se marcará para su eliminación pendiente de eliminación de la VM.

Borra VM y recursos

kubectl virt delete vm VM_NAME --all

Reemplaza VM_NAME por el nombre de la VM que deseas borrar.

Si deseas verificar los recursos que usa la VM que se borrarán, puedes especificar la marca --dry-run junto con --all.

Inhabilita el entorno de ejecución de VM de Anthos

Antes de inhabilitar el entorno de ejecución de VM de Anthos en un clúster, debes asegurarte de que todas las VM de ese clúster se hayan borrado. Inhabilitar el entorno de ejecución de VM de Anthos quita todas las implementaciones relacionadas con KubeVirt, como los pods y los servicios en los espacios de nombres de KubeVirt y CDI.

  1. Verifica si hay VM existentes en el clúster.

    kubectl get vm
    

    Si el comando muestra que todavía hay VM en tu clúster, debes borrarlas antes de continuar.

  2. Actualiza el recurso personalizado VMRuntime para establecer enabled en false.

    apiVersion: vm.cluster.gke.io/v1
    kind: VMRuntime
    metadata:
      name: vmruntime
    spec:
      enabled: false
      # useEmulation default to false if not set.
      useEmulation: true
      # vmImageFormat default to "qcow2" if not set.
      vmImageFormat: qcow2
    
  3. Guarda la configuración y verifica que el recurso personalizado VMRuntime esté inhabilitado:

    kubectl describe vmruntime vmruntime
    

    En los detalles del recurso personalizado VMRuntime, se incluye una sección Status. El entorno de ejecución de VM de Anthos está habilitado y funciona cuando VMRuntime.Status.Ready se establece en false.

¿Qué sigue?