Crear y gestionar discos virtuales en Google Distributed Cloud

Este documento está dirigido a los propietarios de aplicaciones que ejecutan Google Distributed Cloud. En este documento se explica cómo crear y gestionar recursos de disco para máquinas virtuales que usan VM Runtime en GDC.

Antes de empezar

Para completar este documento, necesitas tener acceso a los siguientes recursos:

Crear una VM con un disco conectado

Cuando creas una VM, puedes adjuntar un disco de arranque o de datos, crear un disco a partir de una imagen (incluido el disco de arranque) o crear un disco en blanco.

Disco en blanco

En este caso, creas un disco en blanco y lo adjuntas a la VM. Este escenario le permite crear un disco de datos para almacenar datos de aplicaciones.

  1. Crea un manifiesto que defina un VirtualMachineDisk y un VirtualMachine, como my-vm.yaml, en el editor que prefieras:

    nano my-vm.yaml
    
  2. Copia y pega la siguiente definición de YAML:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: DISK_NAME
    spec:
      size: 10Gi
    ---
    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - boot: true
          virtualMachineDiskName: VM_NAME-boot-dv
        - virtualMachineDiskName: DISK_NAME
    

    Haz los cambios siguientes:

    • DISK_NAME: el nombre del disco en blanco que vas a crear y adjuntar a tu VM.

      .
    • VM_NAME: el nombre de la VM que vas a crear.

      En este ejemplo, se crea un disco 10Gi (10 gibibytes) en blanco llamado DISK_NAME. En la sección spec.disks de la VM, también debes adjuntar un disco de arranque, como el de una imagen, tal como se muestra en la sección siguiente.

  3. Guarda y cierra el archivo de manifiesto en el editor.

  4. Crea la VM y el disco con kubectl:

    kubectl apply -f my-vm.yaml --kubeconfig KUBECONFIG
    

    Sustituye KUBECONFIG por la ruta al archivo kubeconfig del clúster.

Desde una imagen

En este caso, crearás un disco a partir de una imagen y lo asociarás a la VM. Este escenario te permite crear un disco de arranque, por ejemplo, a partir de una imagen. También puedes crear y adjuntar discos de datos a partir de una imagen.

Fuentes de imágenes admitidas

VM Runtime en GDC permite usar una gran variedad de formatos de imagen y admite tres tipos de fuentes de imagen que se pueden especificar en la especificación VirtualMachineDisk. En cada uno de los siguientes ejemplos se crea un disco de 20 gibibytes a partir de una fuente de imagen admitida diferente.

  • Protocolo de transferencia de hipertexto (HTTP)

    En el siguiente ejemplo de VirtualMachineDisk se muestra la estructura básica de una fuente de imagen HTTP. El campo url debe contener una URL HTTP o HTTPS.

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: my-disk
    spec:
      source:
        http:
          url: https://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img
      size: 20GiB
      storageClassName: local-shared
    
  • Cloud Storage

    En el siguiente ejemplo se muestra cómo crear un disco a partir de una imagen de un segmento de Cloud Storage. Si las credenciales predeterminadas de la aplicación en la máquina no son suficientes para acceder a la URL de Cloud Storage, debes proporcionar credenciales. En el ejemplo siguiente, my-gcs es un secreto que contiene una clave de cuenta de servicio codificada en base64.

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: my-disk
    spec:
      source:
        gcs:
          url: gs://kubevirt-ci-vm-images/rhel8.2/rhel8_2_cloud.qcow2
          secretRef: my-gcs
      size: 20GiB
      storageClassName: local-shared
    

    Si has usado claves de cuentas de servicio descargadas para crear tu clúster, puedes usar la clave de cuenta de servicio de Artifact Registry para acceder a Cloud Storage. Si quieres crear una cuenta de servicio independiente para acceder a Cloud Storage, consulta el artículo Configurar una cuenta de servicio que pueda acceder a un segmento de Cloud Storage.

    Usa el siguiente comando para crear un secreto de Kubernetes a partir del archivo de clave de cuenta de servicio descargado:

    kubectl create secret generic SECRET_NAME --from-file=KEY_FILE --namespace default \
        --kubeconfig KUBECONFIG
    

    Haz los cambios siguientes:

    • SECRET_NAME: nombre del secreto.
    • KEY_FILE: ruta al archivo JSON de la clave de cuenta de servicio descargado. Por ejemplo, bmctl-workspace/.sa-keys/my-project-anthos-baremetal-gcr.json.
    • KUBECONFIG: ruta al archivo kubeconfig del clúster.

    Para obtener más información sobre cómo usar las credenciales para acceder a Cloud Storage, consulta Crear y usar credenciales para importar imágenes de Cloud Storage.

  • Ejemplo de registro de contenedor

    Se admiten los registros de contenedores que cumplen la distribución-spec de Open Container Initiative (OCI). En el siguiente ejemplo se crea un disco a partir de una imagen almacenada en un registro de Docker.

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: my-disk
    spec:
      source:
        registry:
          url: docker://kubevirt/fedora-cloud-registry-disk-demo
      size: 20GiB
      storageClassName: local-shared
    

Formatos de imagen válidos

Puedes usar cualquiera de los siguientes formatos de imagen al crear un disco a partir de una imagen:

  • Archivo GNU zip (gzip) (.gz)
  • RAW (.raw, .img)
  • Imagen de disco de copia en escritura de QEMU versión 2 (qcow2) (.qcow2)
  • Archivo comprimido XZ (.xz)
  • Archivo de disco de máquina virtual (VMDK) (.vmdk)
  • Archivo de imagen de disco virtual de VirtualBox (VDI) (.vdi)
  • Archivo de imagen de disco duro virtual (VHD) (.vdh)
  • Archivo de disco duro virtual versión 2 (VHDX) (.vdhx)
  • Archivo de imagen de disco ISO (.iso)

Ejemplo de un disco creado a partir de una imagen HTTP

Sigue estos pasos para crear un disco de arranque a partir de una imagen de Ubuntu:

  1. Crea un manifiesto que defina un VirtualMachineDisk y un VirtualMachine, como my-vm.yaml,en el editor que prefieras:

    nano my-vm.yaml
    
  2. Copia y pega la siguiente definición de YAML:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: VM_NAME-boot-dv
    spec:
      size: 20Gi
      source:
        http:
          url: https://cloud-images.ubuntu.com/releases/focal/release/ubuntu-20.04-server-cloudimg-amd64.img
    ---
    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - boot: true
          virtualMachineDiskName: VM_NAME-boot-dv
    

    En este ejemplo se crea un disco 20Gi (20 gibibytes) llamado VM_NAME-boot-dv con una imagen pública de Ubuntu. En la sección spec.disks de la VM, el disco está configurado como boot: true.

    .
  3. Guarda y cierra el archivo de manifiesto en tu editor.

  4. Crea la VM y el disco con kubectl:

    kubectl apply -f my-vm.yaml --kubeconfig KUBECONFIG
    

    Sustituye KUBECONFIG por la ruta al archivo kubeconfig del clúster.

Disco disponible

En este caso, creas un disco en blanco y lo adjuntas a la VM. Este escenario le permite crear un disco de datos para almacenar datos de aplicaciones.

  1. Crea un archivo de VirtualMachine manifiesto, como my-vm.yaml,en el editor que prefieras:

    nano my-vm.yaml
    
  2. Copia y pega la siguiente definición de YAML:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - boot: true
          virtualMachineDiskName: VM_NAME-boot-dv
        - virtualMachineDiskName: EXISTING_DISK_NAME
    

    En este ejemplo se acopla un disco llamado EXISTING_DISK_NAME.

    En la sección spec.disks de la VM, también debes adjuntar un disco de arranque, como una imagen, tal como se muestra en la sección anterior.

  3. Guarda y cierra el manifiesto de la VM en tu editor.

  4. Crea la VM con kubectl:

    kubectl apply -f my-vm.yaml --kubeconfig KUBECONFIG
    

    Sustituye KUBECONFIG por la ruta al archivo kubeconfig del clúster.

Localizar discos

A partir de la versión 1.13.0 de Google Distributed Cloud, cuando creas una VM, VM Runtime en GDC usa los nombres de disco que especificas en el recurso de VM para definir los números de serie de los discos. En concreto, los nombres que especifiques con spec.disks.virtualMachineDiskName en el recurso personalizado VirtualMachine se usarán en el número de serie de los discos. Esta función facilita la localización de los discos en la VM cuando necesitas realizar operaciones con ellos, como formatearlos o montarlos.

Por ejemplo, si has creado una VM y has especificado un disco de arranque llamado sample-boot-dv, tu recurso personalizado VirtualMachine tendrá un aspecto similar al siguiente:

apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
  name: sample-vm
spec:
  osType: Linux
  compute:
    cpu:
      vcpus: 2
    memory:
      capacity: 4Gi
  interfaces:
    - name: eth0
      networkName: pod-network
      default: true
  disks:
    - boot: true
      virtualMachineDiskName: sample-vm-boot-dv
    - virtualMachineDiskName: attached-disk

En las máquinas virtuales Linux, cuando inicies sesión en tu máquina virtual, puedes ejecutar el siguiente comando para enumerar los discos por su número de serie:

ls -l /dev/disk/by-id/

Tu respuesta debería tener un aspecto similar al de este ejemplo, en el que los nombres de los discos aparecen como números de serie:

total 0
lrwxrwxrwx 1 root root  9 Oct 19 17:17 ata-QEMU_HARDDISK_agentInstallation -> ../../sdb
lrwxrwxrwx 1 root root  9 Oct 19 17:17 ata-QEMU_HARDDISK_agentSADisk -> ../../sda
lrwxrwxrwx 1 root root  9 Oct 19 17:17 virtio-sample-boot-dv -> ../../vda
lrwxrwxrwx 1 root root 10 Oct 19 17:17 virtio-sample-boot-dv-part1 -> ../../vda1
lrwxrwxrwx 1 root root 11 Oct 19 17:17 virtio-sample-boot-dv-part14 -> ../../vda14
lrwxrwxrwx 1 root root 11 Oct 19 17:17 virtio-sample-boot-dv-part15 -> ../../vda15
lrwxrwxrwx 1 root root 11 Oct 19 17:17 virtio-attached-disk -> ../../vdb

Ten en cuenta el siguiente comportamiento de la función contextual:

  • Si el valor de virtualMachineDiskName tiene más de 20 caracteres, el tiempo de ejecución de VM en GDC solo usará los primeros 20 caracteres como número de serie.
  • Si hay dos discos con los mismos 20 primeros caracteres, solo el primer disco tendrá un número de serie.

Crear y adjuntar discos a una VM

Si tienes una máquina virtual, puedes crear y adjuntar discos para admitir los ciclos de vida de tu aplicación. La VM debe estar detenida para poder adjuntar un disco.

Disco en blanco

En este caso, creas un disco en blanco y lo adjuntas a la VM. Este escenario le permite crear un disco de datos para almacenar datos de aplicaciones.

  1. Usa kubectl para detener la VM, si es necesario:

    kubectl virt stop vm VM_NAME --kubeconfig KUBECONFIG
    

    Haz los cambios siguientes:

    • VM_NAME: el nombre de la VM que quieres detener.
    • KUBECONFIG: la ruta al archivo kubeconfig del clúster.
  2. Edita el recurso de VM que quieras, como my-vm:

    kubectl edit gvm VM_NAME --kubeconfig KUBECONFIG
    
  3. Actualiza el manifiesto YAML de VirtualMachine para añadir una sección VirtualMachineDisk en la parte superior y, a continuación, acopla el disco al final de la sección spec.disks de la VM:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: DISK_NAME
    spec:
      size: 10Gi
    ---
    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - boot: true
          virtualMachineDiskName: VM_NAME-boot-dv
        - virtualMachineDiskName: DISK_NAME
    

    En este ejemplo, se crea un disco 10Gi (10 gibibytes) en blanco llamado DISK_NAME.

  4. Guarda y cierra el manifiesto de la VM actualizado en tu editor.

  5. Usa kubectl para iniciar la VM:

    kubectl virt start vm VM_NAME --kubeconfig KUBECONFIG
    

Desde una imagen

En este caso, creas un disco a partir de una imagen de origen y lo vinculas a la máquina virtual.

  1. Usa kubectl para detener la VM, si es necesario:

    kubectl virt stop vm VM_NAME --kubeconfig KUBECONFIG
    

    Haz los cambios siguientes:

    • VM_NAME: el nombre de la VM que quieres detener.
    • KUBECONFIG: la ruta al archivo kubeconfig del clúster.
  2. Edita el recurso de VM que quieras, como my-vm:

    kubectl edit gvm VM_NAME --kubeconfig KUBECONFIG
    
  3. Actualiza el archivo de manifiesto VirtualMachine para añadir una sección VirtualMachineDisk en la parte superior y, a continuación, acopla el disco al final de la sección spec.disks de la VM:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: DISK_NAME
    spec:
      size: 10Gi
      source:
        http:
          url: http://example.com/my-disk-img.qcow2
    ---
    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - boot: true
          virtualMachineDiskName: VM_NAME-boot-dv
        - virtualMachineDiskName: DISK_NAME
    

    En este ejemplo se crea un disco de 10Gi (10 gibibytes) llamado DISK_NAME a partir de la fuente HTTP http://example.com/my-disk-img.qcow2.

    .
  4. Guarda y cierra el manifiesto de la VM actualizado en tu editor.

  5. Usa kubectl para iniciar la VM:

    kubectl virt start vm VM_NAME --kubeconfig KUBECONFIG
    

Crear un disco

En este caso, los recursos de disco se crean por separado de los recursos de la VM. Este caso práctico te permite crear discos con antelación y, a continuación, adjuntarlos a las VMs según sea necesario.

Disco en blanco

Para crear un disco en blanco, sigue estos pasos.

  1. Crea un archivo de VirtualMachineDisk manifiesto, como my-disk.yaml,en el editor que prefieras:

    nano my-disk.yaml
    
  2. Copia y pega la siguiente definición de YAML:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: DISK_NAME
    spec:
      size: 10Gi
    

    En este ejemplo, se crea un disco 10Gi (10 gibibytes) en blanco llamado DISK_NAME.

  3. Guarda y cierra el manifiesto del disco en tu editor.

  4. Crea el disco con kubectl:

    kubectl apply -f my-disk.yaml --kubeconfig KUBECONFIG
    

    Sustituye KUBECONFIG por la ruta al archivo kubeconfig del clúster.

Desde una imagen

Para crear un disco a partir de una imagen, sigue estos pasos:

  1. Crea un archivo de manifiesto VirtualMachineDisk, como my-disk.yaml, en el editor que prefieras:

    nano my-disk.yaml
    
  2. Copia y pega la siguiente definición de YAML:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: DISK_NAME
    spec:
      size: 20Gi
      source:
        http:
          url: https://cloud-images.ubuntu.com/releases/focal/release/ubuntu-20.04-server-cloudimg-amd64.img
    

    En este ejemplo se crea un disco 20Gi (20 gibibytes) llamado DISK_NAME con una imagen pública de Ubuntu.

  3. Guarda y cierra el manifiesto del disco en tu editor.

  4. Crea el disco con kubectl:

    kubectl apply -f my-disk.yaml --kubeconfig KUBECONFIG
    

    Sustituye KUBECONFIG por la ruta al archivo kubeconfig del clúster.

Siguientes pasos