Administra máquinas virtuales

En esta página, se describe cómo administrar máquinas virtuales en tu implementación conectada de Google Distributed Cloud que ejecuta VM Runtime en Google Distributed Cloud. Antes de completar los pasos de esta página, debes conocer el entorno de ejecución de VM en GDC. Para obtener una lista de los sistemas operativos invitados compatibles, consulta Sistemas operativos invitados verificados para el entorno de ejecución de VM en GDC.

Para obtener información sobre cómo las máquinas virtuales son un componente esencial de la plataforma conectada de Distributed Cloud, consulta Extiende GKE Enterprise para administrar VMs perimetrales locales.

Los clústeres conectados de Distributed Cloud admiten webhooks de máquina virtual. Esto permite que Distributed Cloud Connected valide las solicitudes de los usuarios realizadas al servidor de la API de Kubernetes local. Las solicitudes rechazadas generan información detallada sobre el motivo del rechazo.

Configura Symcloud Storage

Google Distributed Cloud connected usa Rakuten Symcloud Storage como solución de almacenamiento. Symcloud Storage es una solución de terceros que actúa como una capa de abstracción de almacenamiento local en cada nodo conectado de Distributed Cloud y pone su almacenamiento local a disposición de las cargas de trabajo que se ejecutan en otros nodos conectados de Distributed Cloud.

Symcloud Storage se implementa desde Google Cloud Marketplace y está sujeto a las condiciones que se indican allí. Google proporciona asistencia limitada para usar Symcloud Storage con Distributed Cloud conectado y puede contratar al proveedor externo para obtener asistencia. Las actualizaciones de software de Symcloud Storage se incluyen en las actualizaciones de software conectadas de Distributed Cloud.

Configura tu clúster conectado de Google Distributed Cloud de la siguiente manera para habilitar Symcloud Storage para máquinas virtuales. Para obtener más información, consulta Instala Symcloud Storage en un nodo conectado de Distributed Cloud.

  1. Crea el espacio de nombres robin-admin con el siguiente comando:

    kubectl create ns robin-admin
    
  2. Obtén el archivo de licencia de Symcloud Storage y aplícalo al clúster con el siguiente comando:

    kubectl apply LICENSE_FILE
    
  3. Verifica que Symcloud Storage esté en funcionamiento con el siguiente comando:

    kubectl describe robincluster
    

    El comando muestra un resultado similar al siguiente:

     Name:         robin
     Namespace:
     Labels:       app.kubernetes.io/instance=robin
                   app.kubernetes.io/managed-by=robin.io
                   app.kubernetes.io/name=robin
     Annotations:  <none>
     API Version:  manage.robin.io/v1
     Kind:         RobinCluster
     Metadata:
       
     Spec:
       
     Status:
       
       Phase:             Ready
       
    
  4. Aplica la siguiente configuración al clúster para crear la clase de almacenamiento robin-block-immediate:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: robin-block-immediate
    parameters:
      faultdomain: host
      replication: "3"
      blocksize:   "512"
    provisioner: robin
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
    allowVolumeExpansion: true
    
  5. Crea la clase de instantánea de volumen robin-snapshotclass aplicando la siguiente configuración al clúster:

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
      name: robin-snapshotclass
      labels:
        app.kubernetes.io/instance: robin
        app.kubernetes.io/managed-by: robin.io
        app.kubernetes.io/name: robin
      annotations:
        snapshot.storage.kubernetes.io/is-default-class: "true"
    driver: robin
    deletionPolicy: Delete
    
  6. Modifica el storageprofile para la clase de almacenamiento robin-block-immediate con el siguiente contenido y aplícalo a tu clúster:

    apiVersion: cdi.kubevirt.io/v1beta1
    kind: StorageProfile
    metadata:
      name: robin-block-immediate
    spec:
      claimPropertySets:
        accessModes:
          ReadWriteMany
      volumeMode: Block

Instala la herramienta de administración de virtctl

Necesitas la herramienta de cliente virtctl para administrar máquinas virtuales en tu clúster conectado a Distributed Cloud. Para instalar la herramienta, completa los siguientes pasos:

  1. Instala la herramienta de cliente virtctl como un complemento kubectl:

    export VERSION=GDC_SO_VERSION
    gcloud storage cp gs://anthos-baremetal-release/virtctl/${VERSION}/linux-amd64/virtctl ./virtctl
    sudo mv ./virtctl /usr/local/bin/virtctl
    cd /usr/local/bin
    sudo ln -s virtctl kubectl-virt
    sudo chmod a+x virtctl
    cd -

    Reemplaza GDC_SO_VERSION por la versión de destino del software de Distributed Cloud.

  2. Verifica que el complemento virt esté instalado:

    kubectl plugin list

    Si el complemento se instaló correctamente, el resultado del comando mostrará kubectl-virt como uno de los complementos.

Crea un bucket de Cloud Storage para las imágenes de VM

Completa los pasos de esta sección para crear un bucket de Cloud Storage para las imágenes de tu máquina virtual. El bucket usa la federación de identidades para cargas de trabajo para vincular una cuenta de servicio de Kubernetes a la cuenta de servicio de Google Cloud correspondiente para acceder al bucket; en otras palabras, la cuenta de servicio de Kubernetes suplanta a la cuenta de servicio de Google Cloud. Si ya tienes un repositorio de imágenes establecido, omite esta sección.

Para reducir el riesgo de identidad idéntica en una flota de varios clústeres, sigue los lineamientos que se indican en Prácticas recomendadas para la federación de identidades para cargas de trabajo de la flota cuando completes los pasos de esta sección.

  1. Completa los pasos en Crea buckets para crear un bucket.

  2. Crea una cuenta de servicio Google Cloud para acceder al bucket:

    export GSA_PROJECT_ID=GSA_PROJECT_ID
    export GSA_NAME=GSA_NAME
    gcloud iam service-accounts create ${GSA_NAME}

    Reemplaza lo siguiente:

    • GSA_NAME: Un nombre significativo para esta Google Cloud cuenta de servicio.
    • GSA_PROJECT_ID: Es el ID del proyecto Google Cloud que aloja la cuenta de servicioGoogle Cloud de destino.
  3. Otorga permisos a la cuenta de servicio Google Cloud para acceder al bucket:

    export BUCKET_PROJECT_ID=BUCKET_PROJECT_ID
    export GSA_NAME=GSA_NAME
    gcloud storage buckets add-iam-policy-binding gs://${BUCKET_PROJECT_ID}-vm-images \
       --member="serviceAccount:${GSA_NAME}@${GSA_PROJECT_ID}.iam.gserviceaccount.com" \
       --role="roles/storage.objectViewer" \
       --project=${BUCKET_PROJECT_ID}

    Reemplaza lo siguiente:

    • GSA_NAME: Es el nombre de la cuenta de servicio Google Cloud de destino.
    • BUCKET_PROJECT_ID: Es el ID del proyecto de Google Cloud que aloja el bucket.
    • GSA_PROJECT_ID: Es el ID del proyecto Google Cloud que aloja la cuenta de servicioGoogle Cloud de destino.
  4. Crea una cuenta de servicio de Kubernetes en el espacio de nombres de la máquina virtual de destino para vincularla a tu cuenta de servicio Google Cloud :

    export GSA_PROJECT_ID=GSA_PROJECT_ID
    export VM_NAMESPACE=NAMESPACE
    export KSA_NAME=KSA_NAME
    export GSA_EMAIL=${GSA_NAME}@${GSA_PROJECT_ID}.iam.gserviceaccount.com
    kubectl create serviceaccount ${KSA_NAME} -n ${VM_NAMESPACE}
    kubectl annotate serviceaccount ${KSA_NAME} gsaEmail=${GSA_EMAIL} -n ${VM_NAMESPACE}

    Reemplaza lo siguiente:

    • GSA_PROJECT_ID: Es el ID del proyecto Google Cloud que aloja la cuenta de servicioGoogle Cloud de destino.
    • NAMESPACE: Es el espacio de nombres de la máquina virtual de destino.
    • KSA_NAME: Es un nombre significativo para esta cuenta de servicio de Kubernetes.
    • GSA_NAME: Es el nombre de la cuenta de servicio Google Cloud correspondiente.
  5. Busca el nombre del grupo de identidades para cargas de trabajo y el proveedor de identidad de tu clúster:

    gcloud container fleet memberships describe MEMBERSHIP_ID \
        --project=FLEET_PROJECT_ID \
        --format="table(authority.identityProvider,authority.workloadIdentityPool,name)"

    Reemplaza lo siguiente:

    • MEMBERSHIP_ID: Es el nombre de la membresía de la flota del clúster. Por lo general, es el nombre de tu clúster.
    • FLEET_PROJECT_ID: Es el ID del proyecto Google Cloud host de la flota.

    El comando muestra un resultado similar al siguiente:

    IDENTITY_PROVIDER: IDENTITY_PROVIDER
    WORKLOAD_IDENTITY_POOL: WORKLOAD_IDENTITY_POOL
    

    En el resultado, toma nota de los siguientes valores:

  6. Vincula la cuenta de servicio de Kubernetes a la cuenta de servicio de Google Cloud para configurar la suplantación:

    export GSA_PROJECT_ID=GSA_PROJECT_ID
    export GSA_NAME=GSA_NAME
    export KSA_NAME=KSA_NAME
    export VM_NAMESPACE=NAMESPACE
    export WI_POOL=WORKLOAD_IDENTITY_POOL
    gcloud iam service-accounts add-iam-policy-binding ${GSA_NAME}@${GSA_PROJECT_ID}.iam.gserviceaccount.com \
       --project=${GSA_PROJECT_ID} \
       --role=roles/iam.workloadIdentityUser \
       --member="serviceAccount:${WI_POOL}[${VM_NAMESPACE}/${KSA_NAME}]"
       --condition="IAM_CONDITION"
       --condition-from-file="IAM_CONDITION_FILE"

    Reemplaza lo siguiente:

    • GSA_PROJECT_ID: Es el ID del proyecto Google Cloud que aloja la cuenta de servicioGoogle Cloud de destino.
    • GSA_NAME: Es el nombre de la cuenta de servicio Google Cloud correspondiente.
    • KSA_NAME: Es el nombre de la cuenta de servicio de Kubernetes de destino.
    • NAMESPACE: Es el espacio de nombres de la máquina virtual de destino.
    • WORKLOAD_IDENTITY_POOL: Es el nombre del grupo de identidades para cargas de trabajo de tu clúster.
    • IAM_CONDITION: Opcional. Especifica las condiciones de IAM para limitar el acceso a clústeres específicos dentro de la flota. Si se omite o se establece en None, no se aplican condiciones de IAM.
    • IAM_CONDITION_FILE: Opcional. Especifica el archivo que contiene las condiciones de IAM para limitar el acceso a clústeres específicos dentro de la flota. Si se omite, no se aplican condiciones de IAM, a menos que se especifique la marca --condition y se establezca en un valor distinto de None.
  7. Almacena tus imágenes en el bucket.

También tienes la opción de usar el método heredado con un secreto generado a partir de la clave activa de tu cuenta de servicio de Google. Para obtener más información, consulta Crea un bucket de Cloud Storage para máquina virtual virtuales.

Restringe el acceso al bucket con condiciones de IAM

Las condiciones de IAM te permiten especificar a qué clústeres de la flota se puede acceder al bucket. Si no se especifican condiciones de IAM, todos los clústeres de la flota con la misma cuenta de servicio de Kubernetes en el mismo espacio de nombres pueden acceder al bucket, lo que plantea un riesgo de similitud de identidad. Si no especificas condiciones de IAM, también puedes recurrir al mecanismo de acceso heredado que usa un secreto generado a partir de la clave activa de una cuenta de servicio de Google. A continuación, se muestra un ejemplo de cómo configurar y aplicar condiciones de IAM para limitar el acceso a tu bucket:

  1. Crea el archivo de condición de IAM:

    cat <<EOF > iam_condition.yaml
    > expression: request.auth.claims.google.providerId == '$IDENTITY_PROVIDER'
    title: allow_only_this_cluster
    > EOF
  2. Aplica el archivo de condiciones de IAM cuando vincules la GSA a la KSA. Ejecuta el siguiente comando en tu proyecto de GSA Google Cloud :

    gcloud iam service-accounts add-iam-policy-binding "${GSA_NAME}@${GSA_PROJECT_ID}.iam.gserviceaccount.com" \
      --project="${GSA_PROJECT_ID}" \
      --role=roles/iam.workloadIdentityUser \
      --member="serviceAccount:${WI_POOL}[${VM_NAMESPACE}/${KSA_NAME}]" \
      --condition-from-file=iam_condition.yaml

Crea un disco de máquina virtual a partir de una imagen de máquina virtual

Completa los pasos de esta sección para crear un disco de máquina virtual a partir de una imagen de máquina virtual.

Crea un disco a partir de una imagen almacenada en Cloud Storage

Crea un disco de máquina virtual a partir de una máquina virtual almacenada en tu bucket de Cloud Storage aplicando la siguiente configuración a tu clúster:

 apiVersion: vm.cluster.gke.io/v1
 kind: VirtualMachineDisk
 metadata:
   name: DISK_NAME
   namespace: NAMESPACE
 spec:
   source:
     gcs:
       url: gs://${BUCKET_PROJECT_ID}-vm-images/IMAGE_FILE_PATH
       serviceAccount: KSA_NAME
   size: DISK_SIZE
   storageClassName: robin-block-immediate

Reemplaza lo siguiente:

  • DISK_NAME: Es el nombre de este disco de máquina virtual.
  • NAMESPACE: Es el espacio de nombres de la máquina virtual de destino.
  • IMAGE_FILE_PATH: Es la ruta de acceso completa y el nombre del archivo de imagen de la máquina virtual. Haz clic con el botón derecho en la imagen de la Google Cloud consola y selecciona Copiar URI de gsutil para obtener esta ruta de acceso.
  • KSA_NAME: Es la cuenta de servicio de Kubernetes para descargar imágenes de máquinas virtuales que creaste antes.
  • DISK_SIZE: Es el tamaño del disco de destino. Este valor debe ser mayor que el valor virtual-size del archivo de imagen de la máquina virtual. Puedes encontrar este valor con el comando qemu-img info DISK_SIZE.

Si no especificas un valor de storageClassName, se usa el valor predeterminado especificado en el recurso VMRuntime.

Crea un disco a partir de una imagen almacenada en un servicio de terceros

También tienes la opción de usar http, https, S3 o un registro de imágenes para almacenar las imágenes de tus máquina virtual. Si tu servicio de almacenamiento requiere credenciales para el acceso, conviértelas en un secreto y especifícalo con el campo secretRef. Por ejemplo:

source:
    http/s3/registry:
       url: 
       secretRef: "SECRET_NAME" # optional

Reemplaza SECRET_NAME por el nombre de tu secreto.

Para obtener más información, consulta Fuente de HTTP/S3/GCS/registro.

Crea un disco vacío

Aplica la siguiente configuración a tu clúster para crear un disco de máquina virtual vacío:

 apiVersion: vm.cluster.gke.io/v1
 kind: VirtualMachineDisk
 metadata:
   name: DISK_NAME
   namespace: NAMESPACE
 spec:
   size: DISK_SIZE
   storageClassName: robin-block-immediate

Reemplaza lo siguiente:

  • DISK_NAME: Es el nombre de este disco de máquina virtual.
  • NAMESPACE: Es el espacio de nombres de destino.
  • DISK_SIZE: Es el tamaño de disco deseado en gibibytes. Este valor debe ser mayor que el valor virtual-size del archivo de imagen de la máquina virtual. Puedes encontrar este valor con el comando qemu-img info DISK_SIZE.

Si no especificas un valor de storageClassName, se usa el valor predeterminado especificado en el recurso VMRuntime.

Configura redes virtuales

Sigue los pasos que se indican en Networking para configurar las redes virtuales de tus máquinas virtuales.

Crea una máquina virtual

Completa los pasos de esta sección para crear una máquina virtual en la implementación del servidor conectado de Distributed Cloud. Las instrucciones de esta sección son ejemplos destinados a ilustrar configuraciones para diferentes situaciones. Para obtener información detallada sobre la configuración de máquinas virtuales, consulta Crea una VM con recursos de CPU y memoria específicos usando el entorno de ejecución de VM en GDC.

Crea una máquina virtual con la Google Cloud consola

Para crear una máquina virtual con la consola de Google Cloud , haz lo siguiente:

  1. En la consola de Google Cloud , ve a la página Clústeres.

    Ir a los clústeres

  2. Selecciona el proyecto Google Cloud de destino.

  3. (Opcional) Si aún no lo hiciste, accede al clúster de destino:

    1. En el panel de navegación de la izquierda, haz clic en Clusters.

    2. En la lista Clústeres administrados de Anthos, haz clic en el clúster de destino.

    3. En el panel de información del lado derecho, haz clic en ACCEDER.

    4. En el cuadro de diálogo emergente que aparece, selecciona tu método de autenticación preferido, ingresa tus credenciales y haz clic en ACCEDER.

  4. Ve a la página Virtual Machines.

    Ir a Virtual Machines

  5. Haz clic en CREAR.

  6. En la sección Básicos, haz lo siguiente:

    1. En el campo Nombre, ingresa un nombre significativo para la máquina virtual.

    2. En el campo Seleccionar clúster, selecciona el clúster de destino para la máquina virtual.

    3. En el campo Espacio de nombres, selecciona el espacio de nombres de destino.

    4. En el campo Tipo de SO, selecciona el sistema operativo de destino.

    5. (Opcional) Si deseas agregar una o más etiquetas a la configuración de esta máquina virtual, haz clic en AGREGAR ETIQUETA.

  7. En la sección Configuración de la máquina, realiza una de las siguientes acciones:

    • Si deseas especificar la cantidad de CPU virtuales y la cantidad de memoria para esta máquina virtual, selecciona Configuración personalizada, ingresa los valores objetivo y, luego, haz clic en SIGUIENTE.

    • Si deseas usar una cantidad predeterminada de CPU virtuales y memoria para esta máquina virtual, selecciona Configuración estándar y elige una configuración de máquina en la lista desplegable Tipo de máquina. Luego, haz clic en SIGUIENTE.

  8. En la sección Almacenamiento, realiza una de las siguientes acciones:

    • Si deseas crear un disco virtual nuevo para esta máquina virtual, selecciona Agregar un disco nuevo y, luego, ingresa un nombre significativo en el campo Nombre, un tamaño en gigabytes en el campo GiB y una URL en el campo Imagen.

    • Si deseas usar un disco virtual existente para esta máquina virtual, selecciona Seleccionar un disco existente y elige la imagen de disco de destino en la lista desplegable Seleccionar un disco.

    • Especifica si quieres que el disco sea de solo lectura y si se borrará automáticamente cuando se borre esta máquina virtual con las casillas de verificación Solo lectura y Borrado automático.

    • Especifica un controlador de disco virtual en la lista desplegable Controlador.

    • Para agregar otro disco a esta máquina virtual, haz clic en AGREGAR UN DISCO en la sección Discos adicionales.

    • Haz clic en SIGUIENTE.

  9. En la sección Red, haz lo siguiente:

    1. En la subsección Interfaz de red predeterminada, especifica el nombre de la interfaz de red principal para esta máquina virtual en el campo Nombre de la interfaz.

    2. Selecciona el tipo de red correspondiente en la lista desplegable Tipo de red.

    3. Especifica si deseas permitir el acceso externo a esta interfaz de red con la casilla de verificación Permitir acceso externo. Si habilitas esta opción, debes ingresar una lista de puertos separados por comas para exponerlos de forma externa en el campo Puertos expuestos.

    4. Si quieres agregar una o más interfaces de red secundarias a esta máquina virtual, haz clic en AGREGAR UNA INTERFAZ DE RED.

    5. Haz clic en SIGUIENTE.

  10. En la sección Opciones avanzadas, usa la casilla de verificación Reinicio automático tras la actualización para especificar si se debe reiniciar esta máquina virtual después de que se actualice el software conectado de Distributed Cloud en el clúster de destino.

  11. En la sección Firmware, haz lo siguiente:

    1. Selecciona el tipo de firmware de destino en el campo Tipo de bootloader. Si seleccionas el firmware UEFI, tienes la opción de habilitar el inicio seguro con la casilla de verificación Inicio seguro.

    2. Especifica un número de serie para esta máquina virtual en el campo Serie.

    3. Especifica un identificador único universal (UUID) para esta máquina virtual en el campo UUID.

  12. En la sección Cloud-init, haz lo siguiente:

    • Especifica un valor secreto de datos de red en el campo Secret de datos de red.

    • Especifica un valor secreto de datos del usuario en el campo Secreto de datos del usuario.

  13. Haz clic en CREATE VM para crear la máquina virtual.

Crea una máquina virtual a partir de un archivo YAML

Para crear una máquina virtual a partir de un archivo de configuración YAML, haz lo siguiente:

  1. En la consola de Google Cloud , ve a la página Clústeres.

    Ir a los clústeres

  2. Selecciona el proyecto Google Cloud de destino.

  3. (Opcional) Si aún no lo hiciste, accede al clúster de destino:

    1. En el panel de navegación de la izquierda, haz clic en Clusters.

    2. En la lista Clústeres administrados de Anthos, haz clic en el clúster de destino.

    3. En el panel de información del lado derecho, haz clic en ACCEDER.

    4. En el cuadro de diálogo emergente que aparece, selecciona tu método de autenticación preferido, ingresa tus credenciales y haz clic en ACCEDER.

  4. Ve a la página Virtual Machines.

    Ir a Virtual Machines

  5. Haz clic en CREAR CON YAML.

  6. En el campo Seleccionar clúster, selecciona el clúster de destino para la máquina virtual.

  7. Pega la configuración de la máquina virtual en formato YAML en el campo YAML.

  8. Haz clic en CREAR.

Crea una máquina virtual a partir de una imagen de disco de arranque

Para crear una máquina virtual a partir de una imagen de disco de arranque, aplica la siguiente configuración a tu clúster:

kind: VirtualMachine
metadata:
  name: my-virtual-machine
  namespace: my-vm-namespace
spec:
  osType: Linux/Windows
  guestEnvironment: {} // comment out this line to enable guest environment for access management
  compute:
    cpu:
      vcpus: 6
    memory:
      capacity: 8Gi
  interfaces:
      - name: eth0
        networkName: network-410
        ipAddresses:
        - 10.223.237.10/25
  disks:
    - virtualMachineDiskName: my-boot-disk
      boot: true
    - virtualMachineDiskName: my-data-disk

Reemplaza lo siguiente:

  • DISK_NAME: Es el nombre de este disco de máquina virtual.
  • NAMESPACE: Es el espacio de nombres de destino.

Crea una máquina virtual a partir de una imagen de disco óptico ISO

Para crear una máquina virtual a partir de una imagen de disco óptico ISO, completa los pasos que se indican en Crea una VM de Windows a partir de una imagen ISO en Google Distributed Cloud.

Crea una máquina virtual con asistencia de GPU

Completa los pasos que se describen en esta página para crear una máquina virtual configurada de acuerdo con los requisitos de tu empresa y, luego, completa los pasos que se indican en Configura una máquina virtual para usar recursos de GPU.

Accede a una máquina virtual

Completa los pasos de esta sección para acceder a una máquina virtual que se ejecuta en la implementación del servidor conectado de Distributed Cloud.

Obtén credenciales de acceso

Si aún no tienes credenciales para acceder a la máquina virtual, completa los pasos de esta sección para obtenerlas con la función de entorno invitado de Linux.

  1. Aplica la siguiente configuración a tu clúster para habilitar el entorno invitado de Linux en la máquina virtual de destino:

    kind: VirtualMachine
    metadata:
     name: my-virtual-machine
     namespace: my-vm-namespace
    spec:
     osType: Linux
     guestEnvironment: // enabled by default; disable with guestEnvironment: {}
       accessManagement:
        enable: true
  2. Genera un archivo id_rsa.pub que contenga un par de claves SSH con el siguiente comando:

    ssh-keygen -t rsa
  3. Crea un recurso VirtualMachineAccessRequest aplicando la siguiente configuración a tu clúster:

    apiVersion: vm.cluster.gke.io/v1alpha1
    kind: VirtualMachineAccessRequest
    metadata:
     name: RESOURCE_NAME
     namespace: NAMESPACE
    spec:
      vm: VM_NAME
      user: USER_NAME
      ssh:
        key: RSA_KEY
        ttl: 2h

Reemplaza lo siguiente:

  • RESOURCE_NAME: Es un nombre descriptivo para este recurso de solicitud de acceso a la máquina virtual.
  • NAMESPACE: Es el espacio de nombres de destino.
  • VM_NAME: Es el nombre de la máquina virtual de destino.
  • USER_NAME: Es el nombre del usuario al que se le otorga acceso.
  • RSA_KEY: Es el contenido del archivo id_rsa.pub que generaste en el paso anterior.
  1. Verifica el estado de la solicitud de acceso con el siguiente comando:

    kubectl get vmar
    

    Cuando el comando muestre el estado Configured, continúa con el siguiente paso.

  2. Accede a la máquina virtual con SSH o Escritorio remoto:

    • Si la máquina virtual está conectada a tu red local, puedes acceder a ella directamente.
    • Si la máquina virtual está conectada a la red de Pods, debes crear un servicio de balanceador de cargas para acceder a los puertos requeridos.

Cómo iniciar, reiniciar o detener una máquina virtual

Usa los siguientes comandos para iniciar, reiniciar o detener una máquina virtual:

  • Inicia una máquina virtual: kubectl virt start vmVM_NAME-nNAMESPACE
  • Reinicia una máquina virtual: kubectl virt restart vmVM_NAME-nNAMESPACE
  • Detén una máquina virtual: kubectl virt stop vmVM_NAME-nNAMESPACE

Reemplaza lo siguiente:

  • VM_NAME: Es el nombre de la máquina virtual de destino.
  • NAMESPACE: Es el espacio de nombres de destino.

Cómo iniciar o detener una máquina virtual con la consola de Google Cloud

  1. En la consola de Google Cloud , ve a la página Clústeres.

    Ir a los clústeres

  2. Selecciona el proyecto Google Cloud de destino.

  3. (Opcional) Si aún no lo hiciste, accede al clúster de destino:

    1. En el panel de navegación de la izquierda, haz clic en Clusters.

    2. En la lista Clústeres administrados de Anthos, haz clic en el clúster de destino.

    3. En el panel de información del lado derecho, haz clic en ACCEDER.

    4. En el diálogo que aparece, selecciona tu método de autenticación preferido, ingresa tus credenciales y haz clic en ACCEDER.

  4. Ve a la página Virtual Machines.

    Ir a Virtual Machines

  5. En la lista de máquinas virtuales, selecciona las casillas de verificación de las máquina virtual de destino.

  6. En la parte superior de la página, haz clic en INICIAR o DETENER, según corresponda.

Visualiza el estado de una máquina virtual con la consola de Google Cloud

  1. En la consola de Google Cloud , ve a la página Clústeres.

    Ir a los clústeres

  2. Selecciona el proyecto Google Cloud de destino.

  3. (Opcional) Si aún no lo hiciste, accede al clúster de destino:

    1. En el panel de navegación de la izquierda, haz clic en Clusters.

    2. En la lista Clústeres administrados de Anthos, haz clic en el clúster de destino.

    3. En el panel de información del lado derecho, haz clic en ACCEDER.

    4. En el cuadro de diálogo emergente que aparece, selecciona tu método de autenticación preferido, ingresa tus credenciales y haz clic en ACCEDER.

  4. Ve a la página Virtual Machines.

    Ir a Virtual Machines

  5. Haz clic en la máquina virtual de destino.

  6. En la página que aparece, haz clic en las pestañas Detalles, Eventos y YAML para ver la información correspondiente sobre esta máquina virtual.

Modifica una máquina virtual

Para modificar una máquina virtual, debes borrarla y volver a crearla con la configuración actualizada.

Borra una máquina virtual con la consola de Google Cloud

  1. En la consola de Google Cloud , ve a la página Clústeres.

    Ir a los clústeres

  2. Selecciona el proyecto Google Cloud de destino.

  3. (Opcional) Si aún no lo hiciste, accede al clúster de destino:

    1. En el panel de navegación de la izquierda, haz clic en Clusters.

    2. En la lista Clústeres administrados de Anthos, haz clic en el clúster de destino.

    3. En el panel de información del lado derecho, haz clic en ACCEDER.

    4. En el diálogo que aparece, selecciona tu método de autenticación preferido, ingresa tus credenciales y haz clic en ACCEDER.

  4. Ve a la página Virtual Machines.

    Ir a Virtual Machines

  5. En la lista de máquinas virtuales, selecciona la casilla de verificación de la máquina virtual de destino.

  6. Haz clic en BORRAR en la parte superior de la página.

  7. En el diálogo de confirmación que aparece, ingresa el nombre de la máquina virtual y haz clic en BORRAR.

Crea una copia de seguridad de una máquina virtual

En esta sección, se describe cómo configurar tu entorno para crear copias de seguridad de tus cargas de trabajo de máquina virtual y cómo administrar tus copias de seguridad. Para habilitar esta función, comunícate con tu representante de Google.

Requisitos previos

  1. Si aún no lo hiciste, crea el recurso personalizado robin-block-immediate de tipo StorageClass con el siguiente contenido y aplícalo a tu clúster:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
     name: robin-block-immediate
     annotations:
       storageclass.kubernetes.io/is-default-class: "true"
    parameters:
     faultdomain: host
     replication: "3"
     blocksize:   "512"
    provisioner: robin
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
  2. Si aún no lo hiciste, crea un recurso personalizado robin-snapshotclass de tipo VolumeSnapshotClass con el siguiente contenido y aplícalo a tu clúster:

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
     name: robin-snapshotclass
     labels:
       app.kubernetes.io/instance: robin
       app.kubernetes.io/managed-by: robin.io
       app.kubernetes.io/name: robin
     annotations:
       snapshot.storage.kubernetes.io/is-default-class: "true"
    driver: robin
    deletionPolicy: Delete

Crea un repositorio de copias de seguridad en línea

Un repositorio de copias de seguridad en línea es una ubicación de almacenamiento en línea compatible con S3 para las copias de seguridad de tu máquina virtual. También almacena registros de copias de seguridad, planes de copias de seguridad y planes de restablecimiento, y sirve como destino para restablecer copias de seguridad de máquina virtual.

Completa los siguientes pasos para crear un repositorio de copias de seguridad en línea para tus máquinas virtuales:

  1. Crea un bucket de Cloud Storage como se describe en Crea buckets.

  2. Crea una cuenta de servicio y una clave para acceder al bucket con los siguientes comandos:

    export PROJECT_ID=$(gcloud config get-value project)
    export SVC_ACCOUNT=backup-access
    gcloud iam service-accounts create $SVC_ACCOUNT
    gcloud projects add-iam-policy-binding $PROJECT_ID \ 
       --member="serviceAccount:${SVC_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
       --role="roles/backupdr.cloudStorageOperator"
    gcloud storage hmac create  ${SVC_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com > hmac_temp_key_file
    awk 'NR==1{print "ACCESS_ID=" $NF} NR==2{print "SECRET=" $NF}' < hmac_temp_key_file > hmac_key_file
  3. Configura el secreto para acceder al bucket de copia de seguridad con los siguientes comandos:

    source ./hmac_key_file
    kubectl create secret generic SECRET_NAME \
       --from-literal=access-key=$SECRET \
       --from-literal=access-key-id=$ACCESS_ID -n NAMESPACE
    

    Reemplaza lo siguiente:

    • SECRET_NAME: Es un nombre descriptivo para este secreto.
    • NAMESPACE: Es el espacio de nombres de destino.
  4. Crea el recurso BackupRepository aplicando la siguiente configuración a tu clúster:

    apiVersion: backup.gdc.goog/v1
    kind: BackupRepository
    metadata:
      name: "REPOSITORY_NAME"
    spec:
      secretReference:
        namespace: NAMESPACE
        name: gcs-hmac-secret
      endpoint: "https://storage.googleapis.com"
      type: "S3"
      s3Options:
        bucket: "BUCKET_NAME"
        region: "REGION"
        forcePathStyle: true
      importPolicy: "ReadWrite"
    # Force attachment for convenience.
    force: true

    Reemplaza lo siguiente:

    • REPOSITORY_NAME: Es un nombre descriptivo para el repositorio.
    • BUCKET_NAME: Es el nombre del bucket de copia de seguridad.
    • NAMESPACE: Es el espacio de nombres de destino.
    • REGION: Es la región de Google Cloud en la que se creó el clúster de Distributed Cloud de destino.
  5. Verifica que el clúster pueda acceder al repositorio de copias de seguridad con el siguiente comando:

    kubectl get BackupRepository
    

Crea un repositorio de copias de seguridad local

Un repositorio de copias de seguridad local es una ubicación de almacenamiento compatible con S3 para las copias de seguridad de tu máquina virtual que reside de forma local en tu clúster conectado de Distributed Cloud. Un repositorio de copias de seguridad local es funcionalmente idéntico a un repositorio de copias de seguridad en línea.

  1. Genera una clave de encriptación AES256 para usarla en la encriptación de la configuración a nivel de la aplicación:

    openssl rand -base64 32
    

    El comando genera una clave aleatoria de 256 bits codificada en base64. Por ejemplo:

    aBcD_eFgH1iJkLmN0pQrStUvWxFyZgAhIjKlMnOpQ=
    
  2. Codifica dos veces la clave para usarla como carga útil en la configuración de YAML del recurso BackupRepository:

    echo -n "AES_KEY" | base64
    

    Reemplaza AES_KEY por la clave AES256 codificada en base64 que generaste en el paso anterior. Almacena esta clave en un archivo local.

  3. Configura el secreto para acceder al repositorio de copias de seguridad con los siguientes comandos:

    kubectl create secret generic SECRET_NAME \
       --from-literal=access-key=ENCODED_AES_KEY \
       --namespace NAMESPACE
    

    Reemplaza lo siguiente:

    • ENCODED_AES_KEY: Es la clave AES256 con codificación doble que generaste en el paso anterior.
    • SECRET_NAME: Es un nombre descriptivo para este secreto.
    • NAMESPACE: Es el espacio de nombres de destino.
  4. Configura BackupRepository aplicando la siguiente configuración a tu clúster:

    apiVersion: backup.gdc.goog/v1
    kind: BackupRepository
    metadata:
      name: REPOSITORY_NAME
    spec:
      force: true
      importPolicy: ReadWrite
      localOptions:
        encryptionKey:
          name: SECRET_NAME
          namespace: NAMESPACE
      type: Local
  5. Verifica que el clúster pueda acceder al repositorio de copias de seguridad con el siguiente comando:

    kubectl get BackupRepository
    

    Reemplaza lo siguiente:

    • REPOSITORY_NAME: Es un nombre descriptivo para el repositorio.
    • SECRET_NAME: Es el nombre del Secret de Kubernetes que creaste en el paso anterior.
    • NAMESPACE: Es el espacio de nombres en el que creaste el secreto de Kubernetes.

Crear un plan de creación de copias de seguridad

Un plan de copia de seguridad define la programación automatizada para ejecutar la copia de seguridad de tu máquina virtual. Crea un recurso VirtualMachineBackupPlan con el siguiente contenido y aplícalo a tu clúster:

apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachineBackupPlan
metadata:
  name: BACKUP_PLAN_NAME
  namespace: NAMESPACE
spec:
  backupConfig:
    backupRepository: REPOSITORY_NAME
    backupScope:
      selectedVirtualMachines:
      - resourceName: VM_NAME
    volumeStrategy: LocalSnapshotOnly
  backupSchedule:
    cronSchedule: "CRON_SCHEDULE"
    paused: PAUSED
  retentionPolicy:
    backupDeleteLockDays: PLAN_LOCK_LENGTH
    backupRetainDays: 4
    locked: RETENTION_POLICY_LOCKED
  numBackupsToRetain: BACKUPS_RETAINED

Reemplaza lo siguiente:

  • BACKUP_PLAN_NAME: Es un nombre descriptivo para el plan de copia de seguridad.
  • NAMESPACE: Es el nombre del espacio de nombres de destino.
  • REPOSITORY_NAME: Es el repositorio de copias de seguridad de destino.
  • CRON_SCHEDULE: Programación estándar de cron para ejecutar las copias de seguridad. El intervalo mínimo permitido entre las copias de seguridad es de 10 minutos.
  • PAUSED: Especifica si este plan de copia de seguridad está pausado. Los valores válidos son true y false.
  • VM_NAME: Especifica una carga de trabajo de máquina virtual para crear una copia de seguridad a través de este plan de copia de seguridad. Puedes especificar varios recursos de máquina virtual por plan de copia de seguridad.
  • * BACKUP_LOCK_LENGTH: Especifica la cantidad de días después de la creación de la copia de seguridad durante los cuales no se puede borrar.
  • * BACKUP_RETENTION_LENGTH: Especifica la cantidad de días que se retendrá esta copia de seguridad. Cuando vence el período de retención, se borra la copia de seguridad. Si se omite, el valor predeterminado es 4.
  • * RETENTION_POLICY_LOCKED: Especifica si la política de retención de este plan de copia de seguridad está bloqueada. Los valores válidos son true y false.
  • * BACKUPS_RETAINED/var>: Especifica la cantidad de copias de seguridad que se retendrán en este plan de copia de seguridad. Cuando se alcanza este umbral, las copias de seguridad se borran en orden, desde la más antigua hasta la más reciente.

Enumera los planes de copias de seguridad existentes

Para enumerar los planes de copia de seguridad existentes, usa el siguiente comando:

kubectl get VirtualMachineBackupPlans -A

El comando muestra un resultado similar al siguiente:

NAMESPACE      NAME                                LASTBACKUPTIME   LASTBACKUPSTATE   NEXTBACKUPTIME   PAUSED
vm-workloads   bkp-template-vm-windows-vm-local
vm-workloads   sched-snapshotonly-bkp-plan-10min                                                       false

Crea una copia de seguridad manual de una máquina virtual

Completa los pasos de esta sección para crear una copia de seguridad manual de una máquina virtual.

  1. Crea un recurso VirtualMachineBackupPlanTemplate en el espacio de nombres en el que reside la máquina virtual de destino aplicando la siguiente configuración al clúster:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineBackupPlanTemplate
    metadata:
      name: TEMPLATE_NAME
      namespace: NAMESPACE
    spec:
      backupRepository: REPOSITORY_NAME

    Reemplaza lo siguiente:

    • TEMPLATE_NAME: Es un nombre descriptivo para esta plantilla de copia de seguridad.
    • REPOSITORY_NAME: Es el nombre del repositorio de copias de seguridad de destino.
    • NAMESPACE: Es el espacio de nombres de destino.
  2. Para activar la copia de seguridad, crea un recurso VirtualMachineBackupRequest con la siguiente configuración y aplícalo al clúster:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineBackupRequest
    metadata:
      name: BACKUP_REQUEST_NAME
      namespace: NAMESPACE
    spec:
      vmBackupPlanTemplate: TEMPLATE_NAME
      virtualMachine: VM_NAME
      vmBackupName: BACKUP_NAME

    Reemplaza lo siguiente:

    • BACKUP_REQUEST_NAME: Es un nombre descriptivo para esta solicitud de copia de seguridad.
    • TEMPLATE_NAME: Es el nombre de la plantilla de copia de seguridad que creaste en el paso anterior.
    • NAMESPACE: Es el nombre del espacio de nombres de destino.
    • VM_NAME: Es el nombre de la máquina virtual de destino.
    • BACKUP_NAME: Es un nombre descriptivo para esta copia de seguridad.
  3. Verifica la integridad de la copia de seguridad con el siguiente comando:

    kubectl get vmbackup BACKUP_NAME -n NAMESPACE
    

    Reemplaza lo siguiente:

    • BACKUP_NAME: Es el nombre de la copia de seguridad de destino.
    • NAMESPACE: Es el espacio de nombres de destino.

    El comando muestra un resultado similar al siguiente:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineBackup
    metadata:
      creationTimestamp: "2024-04-09T17:57:44Z"
      finalizers:
      - vm.cluster.gke.io/virtual-machine-backup-finalizer
      generation: 1
      name: vmt13-backup-0409-2
      namespace: default
      ownerReferences:
      - apiVersion: backup.gdc.goog/v1
        kind: Backup
        name: vmt13-backup-0409-2
        uid: 0ee0b92c-1e27-48cc-8f8f-5606ea925e88
      resourceVersion: "36192759"
      uid: e471f8c7-637c-485f-acda-108017a5638f
    spec:
      backupConfig:
        backupRepository: default
        backupScope:
          selectedVirtualMachines:
          - resourceName: vm-t13
        volumeStrategy: Portable
      vmBackupPlan: MyVmPlan-vm-vm-t13-portable
    status:
      backedUpVirtualMachineDisks:
      - vm-t13-boot-disk
      - vm-t13-data-disk
      backedUpVirtualMachines:
      - vm-t13
      backup: vmt13-backup-0409-2
      backupStatus:
        clusterMetadata:
          k8sVersion: "1.28"
        completeTime: "2024-04-09T18:07:36Z"
        createTime: "2024-04-09T17:57:44Z"
        jobCreated: true
        resourceCount: 849
        sizeBytes: 1948672
        state: Succeeded
    

Enumera las copias de seguridad de máquina virtual

Para ver las copias de seguridad de máquina virtual existentes, usa el siguiente comando:

kubectl get VirtualMachineBackups -A

El comando muestra un resultado similar al siguiente:

NAMESPACE      NAME        STATE       CREATETIME
vm-workloads   vm-backup   Succeeded   2025-04-08T04:37:32Z

Restablece una máquina virtual a partir de una copia de seguridad

Completa los pasos de esta sección para restablecer una máquina virtual a partir de una copia de seguridad.

  1. Para activar el proceso de restauración, crea un recurso VirtualMachineRestoreRequest con la siguiente configuración y aplícalo a tu clúster:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineRestoreRequest
    metadata:
      name: restore-req
      namespace: NAMESPACE
    spec:
      vmBackup: BACKUP_NAME
      restoreName: RESTORE_NAME
      restoredResourceName: RESTORED_VM_NAME
      restoredResourceDescription: RESTORE_DESCRIPTION

    Reemplaza lo siguiente:

    • BACKUP_NAME: Es el nombre de la copia de seguridad de destino.
    • RESTORE_NAME: Es un nombre descriptivo para esta operación de restablecimiento.
    • NAMESPACE: Es el espacio de nombres de destino.
    • RESTORED_VM_NAME: Es el nombre que se le asignó a la máquina virtual durante la restauración. Este nombre no debe entrar en conflicto con ninguna máquina virtual que ya esté presente en el clúster.
    • RESTORE_DESCRIPTION: Es una descripción de esta operación de restablecimiento.
  2. Usa el siguiente comando para verificar el progreso de la operación de restablecimiento:

    kubectl get virtualmachinerestores.vm.cluster.gke.io RESTORE_NAME -n NAMESPACE
    

    Reemplaza lo siguiente:

    • RESTORE_NAME: Es el nombre de la operación de restablecimiento de destino.
    • NAMESPACE: Es el espacio de nombres de destino.

    El comando muestra un resultado similar al siguiente:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineRestore
    metadata:
      creationTimestamp: "2024-04-09T18:09:51Z"
      finalizers:
      - vm.cluster.gke.io/virtual-machine-restore-finalizer
      generation: 1
      name: vmt13-restore-0409-2-1
      namespace: default
      ownerReferences:
      - apiVersion: backup.gdc.goog/v1
        kind: Restore
        name: vmt13-restore-0409-2-1
        uid: 4ce1ca83-eba0-4cc3-bad3-af6cf9185d7d
      resourceVersion: "36194596"
      uid: aba50b59-e18d-4687-ad11-47baa45478b4
    spec:
      targetVirtualMachineDisks:
      - vm-t13-boot-disk
      - vm-t13-data-disk
      targetVirtualMachines:
      - vm-t13
      vmBackup: vmt13-backup-0409-2
    status:
      restore: vmt13-restore-0409-2-1
      restoreStatus:
        completeTime: "2024-04-09T18:10:00Z"
        jobCreated: true
        resourcesRestoredCount: 5
        restoredVolumesCount: 2
        startTime: "2024-04-09T18:09:51Z"
        state: Succeeded
        stateReason: restore is successful
    

Cómo ver las operaciones de restablecimiento

Para ver las operaciones de restablecimiento que se iniciaron hasta la fecha, usa el siguiente comando:

kubectl get VirtualMachineRestore.vm.cluster.gke.io -A

El comando muestra un resultado similar al siguiente:

NAMESPACE      NAME        STARTTIME              RESTORE     STATE
vm-workloads   restore-1   2025-04-08T04:41:04Z   restore-1   Succeeded

Borra una copia de seguridad de una máquina virtual

Para borrar una copia de seguridad de una máquina virtual, crea un recurso VirtualMachineDeleteBackupRequest con la siguiente configuración y aplícalo a tu clúster:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDeleteBackupRequest
    metadata:
      name: vmdbr
      namespace: BACKUP_NAME
    spec:
      vmBackup: NAMESPACE
   

Reemplaza lo siguiente:

  • NAMESPACE: Es el nombre del espacio de nombres de destino.
  • BACKUP_NAME: Es el nombre de la copia de seguridad de destino.

Visualiza los registros de auditoría de la zona de pruebas de AppArmor

Distributed Cloud conectado automáticamente aísla en un entorno de pruebas las cargas de trabajo de máquina virtual con políticas de AppArmor en audit-mode. Cuando se produce un incumplimiento de política, se emite una entrada de registro de auditoría. Por ejemplo:

{
  "jsonPayload": {
    "_SOURCE_REALTIME_TIMESTAMP": "1734596844149104",
    "SYSLOG_TIMESTAMP": "Dec 19 08:27:24 ",
    "MESSAGE": "type=AVC msg=audit(1734596844.148:27742): apparmor=\"ALLOWED\" operation=\"open\" profile=\"virt-launcher-audit\" name=\"/etc/libvirt/virtlogd.conf\" pid=182406 comm=\"virtlogd\" requested_mask=\"r\" denied_mask=\"r\" fsuid=0 ouid=0 FSUID=\"root\" OUID=\"root\"",
    "PRIORITY": "6",
    ...
    "SYSLOG_RAW": "<14>Dec 19 08:27:24 audisp-syslog: type=AVC msg=audit(1734596844.148:27742): apparmor=\"ALLOWED\" operation=\"open\" profile=\"virt-launcher-audit\" name=\"/etc/libvirt/virtlogd.conf\" pid=182406 comm=\"virtlogd\" requested_mask=\"r\" denied_mask=\"r\" fsuid=0 ouid=0 FSUID=\"root\" OUID=\"root\"\n",
    "SYSLOG_IDENTIFIER": "audisp-syslog",
    "_GID": "0",
  },
  "timestamp": "2024-12-19T08:27:24.149109Z",
  "labels": {
    "gke.googleapis.com/log_type": "system"
  },
  "receiveTimestamp": "2024-12-19T08:27:24.721842807Z"
  ...
  ...
}

¿Qué sigue?