Solución de problemas de máquinas virtuales

En esta página, se explica cómo solucionar problemas de la máquina virtual (VM) del operador de aplicaciones (AO) en el dispositivo aislado de Google Distributed Cloud (GDC).

Recupera un disco de arranque de VM completo

Si una VM se queda sin espacio en el disco de arranque, por ejemplo, cuando una aplicación llena la partición del disco de arranque con registros, las capacidades críticas de las VMs no funcionan. Es posible que no puedas agregar una clave SSH nueva a través del recurso VirtualMachineAccessRequest ni establecer una conexión SSH a la VM con claves existentes.

En esta página, se describen los pasos para crear una VM nueva y conectar el disco para recuperar el contenido en una VM nueva como un disco adicional. En estos pasos, se demuestra lo siguiente:

  • Una conexión SSH exitosa a la nueva VM
  • Aumenta la cantidad de espacio disponible. Para ello, conecta el disco para recuperar y borrar los datos innecesarios.
  • Borra la VM nueva y reemplaza el disco original en la VM original.

Antes de comenzar

Antes de continuar, asegúrate de solicitar acceso a la VM a nivel del proyecto. Sigue los pasos indicados para asignar el rol de administrador de máquinas virtuales del proyecto (project-vm-admin).

Para las operaciones de VM con la CLI de gdcloud, solicita a tu administrador de IAM del proyecto que te asigne el rol de administrador de máquinas virtuales del proyecto y el rol de visualizador del proyecto (project-viewer).

Para usar los comandos de la interfaz de línea de comandos (CLI) de gdcloud, asegúrate de haber descargado, instalado y configurado la CLI de gdcloud. Todos los comandos para el dispositivo aislado de GDC usan la CLI de gdcloud o kubectl, y requieren un entorno de sistema operativo (SO).

Obtén la ruta de acceso del archivo kubeconfig

Para ejecutar comandos en el servidor de la API de Management, asegúrate de tener los siguientes recursos:

  1. Ubica el nombre del servidor de la API de Management o pregúntale a tu administrador de la plataforma (PA) cuál es el nombre del servidor.

  2. Accede y genera el archivo kubeconfig para el servidor de la API de Management si no tienes uno.

  3. Usa la ruta de acceso para reemplazar MANAGEMENT_API_SERVER{"</var>"}} en estas instrucciones.

Recupera un disco de VM sin espacio

Para recuperar un disco de arranque de VM sin espacio, completa los siguientes pasos:

  1. Detén la VM existente siguiendo los pasos que se indican en Cómo detener una VM.

  2. Edita la VM existente:

    kubectl --kubeconfig ADMIN_KUBECONFIG edit \
        virtualmachine.virtualmachine.gdc.goog -n PROJECT VM_NAME
    

    Reemplaza el nombre del disco de la VM existente en el campo spec por un nuevo nombre de marcador de posición:

    ...
    spec:
      disks:
      - boot: true
        virtualMachineDiskRef:
          name: VM_DISK_PLACEHOLDER_NAME
    
  3. Crea una VM nueva con un sistema operativo (SO) de imagen diferente al de la VM original. Por ejemplo, si el disco original usa el SO ubuntu-2004, crea la VM nueva con rocky-8.

  4. Conecta el disco original como un disco adicional a la VM nueva:

    ...
    spec:
      disks:
      - boot: true
        autoDelete: true
        virtualMachineDiskRef:
          name: NEW_VM_DISK_NAME
      - virtualMachineDiskRef:
          name: ORIGINAL_VM_DISK_NAME
    

    Reemplaza lo siguiente:

    • NEW_VM_DISK_NAME: Es el nombre que le asignas al disco de VM nuevo.
    • ORIGINAL_VM_DISK_NAME: Es el nombre del disco de la VM original.
  5. Después de crear la VM y de que se esté ejecutando, establece una conexión SSH a la VM siguiendo los pasos que se indican en Cómo conectarse a una VM.

  6. Crea un directorio y activa el disco original en un punto de activación. Por ejemplo, /mnt/disks/new-disk

  7. Revisa los archivos y directorios en el directorio de montaje con espacio adicional:

    cd /mnt/disks/MOUNT_DIR
    du -hs -- * | sort -rh | head -10
    

    Reemplaza MOUNT_DIR por el nombre del directorio en el que activaste el disco original.

    El resultado es similar a este:

    18G   home
    1.4G  usr
    331M  var
    56M   boot
    5.8M  etc
    36K   snap
    24K   tmp
    16K   lost+found
    16K   dev
    8.0K  run
    
  8. Revisa cada uno de los archivos y directorios para verificar la cantidad de espacio que usa cada uno. En este ejemplo, se verifica el directorio home, ya que usa 18G de espacio.

    cd home
    du -hs -- * | sort -rh | head -10
    

    El resultado es similar a este:

    17G   log_file
    ...
    4.0K  readme.md
    4.0K  main.go
    

    El archivo de ejemplo log_file es un archivo que se debe borrar, ya que consume 17G de espacio y no es necesario.

  9. Borra los archivos que no necesites y que consuman espacio adicional, o bien crea una copia de seguridad de los archivos en el nuevo disco de arranque de la VM:

    • Mueve los archivos que quieras conservar:

      mv /mnt/disks/MOUNT_DIR/home/FILENAME/home/backup/
      
    • Borra los archivos que consumen espacio adicional:

      rm /mnt/disks/MOUNT_DIR/home/FILENAME
      

      Reemplaza FILENAME por el nombre del archivo que deseas mover o borrar.

  10. Sal de la VM nueva y detenla.

  11. Edita la VM nueva para quitar el disco original del campo spec:

    kubectl --kubeconfig ADMIN_KUBECONFIG \
        edit virtualmachine.virtualmachine.gdc.goog -n PROJECT NEW_VM_NAME
    

    Quita la lista virtualMachineDiskRef que contiene el nombre del disco de la VM original:

    spec:
      disks:
      - autoDelete: true
        boot: true
        virtualMachineDiskRef:
          name: NEW_VM_DISK_NAME
      - virtualMachineDiskRef: # Remove this list
          name: ORIGINAL_VM_DISK_NAME # Remove this disk name
    
  12. Edita la VM original y reemplaza VM_DISK_PLACEHOLDER_NAME que configuraste en el paso dos por el nombre anterior:

    ...
    spec:
      disks:
      - boot: true
        virtualMachineDiskRef:
          name: VM_DISK_PLACEHOLDER_NAME # Replace this name with the previous VM name
    
  13. Inicia la VM original. Si liberaste suficiente espacio, la VM se iniciará correctamente.

  14. Si no necesitas la VM nueva, bórrala:

    kubectl --kubeconfig ADMIN_KUBECONFIG \
        delete virtualmachine.virtualmachine.gdc.goog -n PROJECT NEW_VM_NAME
    

Aprovisiona una máquina virtual

En esta sección, se describe cómo solucionar los problemas que pueden ocurrir durante el aprovisionamiento de una nueva máquina virtual (VM) en el dispositivo aislado de Google Distributed Cloud (GDC).

El operador de la aplicación (AO) debe ejecutar todos los comandos en el clúster de usuarios predeterminado.

No se pudo crear el disco

Si un PersistentVolumeClaim (PVC) está en estado Pending, revisa las siguientes alternativas para resolver el estado:

  • La clase de almacenamiento no admite la creación de una PVC con el modo de acceso ReadWriteMany:

    1. Actualiza el valor de spec.dataVolumeTemplate.spec.pvc.storageClassName de la máquina virtual con una clase de almacenamiento que admita un modo de acceso ReadWriteMany y use un controlador de Container Storage Interface (CSI) como aprovisionador de almacenamiento.

    2. Si ninguna otra clase de almacenamiento del clúster puede proporcionar la capacidad de ReadWriteMany, actualiza el valor de spec.dataVolumeTemplate.spec.pvc.accessMode para incluir el modo de acceso ReadWriteOnce.

  • El controlador CSI no puede aprovisionar un PersistentVolume:

    1. Busca un mensaje de error:

      kubectl describe pvc VM_NAME-boot-dv -n NAMESPACE_NAME
      

      Reemplaza las siguientes variables:

      • VM_NAME: Es el nombre de la máquina virtual.
      • NAMESPACE_NAME: Es el nombre del espacio de nombres.
    2. Configura el controlador para resolver el error. Para asegurarte de que el aprovisionamiento de PersistentVolume funcione, crea una PVC de prueba en un spec nuevo con un nombre diferente del especificado en dataVolumeTemplate.spec.pvc:

      cat <<EOF | kubectl apply -
      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: test-pvc
        namespace: NAMESPACE_NAME
      spec:
        storageClassName: standard-rwx
        accessModes:
        - ReadWriteMany
        resources:
          requests:
            storage: 10Gi
      EOF
      
    3. Después de que el aprovisionamiento del objeto PersistentVolume se realice correctamente, borra el PVC de prueba después de la verificación:

      kubectl delete pvc test-pvc -n NAMESPACE_NAME
      

No se pudo crear una máquina virtual

Si se aplica el recurso de la máquina virtual, pero no llega a un estado Running, sigue estos pasos:

  1. Revisa los registros de la máquina virtual:

    kubectl get vm VM_NAME -n NAMESPACE_NAME
    
  2. Verifica el estado del Pod correspondiente de la máquina virtual:

    kubectl get pod -l kubevirt.io/vm=VM_NAME
    

    El resultado muestra el estado de un Pod. Las opciones posibles son las siguientes:

El estado ContainerCreating

Si el Pod está en el estado ContainerCreating, sigue estos pasos:

  1. Obtén detalles adicionales sobre el estado del Pod:

    kubectl get pod -l kubevirt.io/vm=VM_NAME
    
  2. Si los volúmenes no están desmontados, asegúrate de que todos los volúmenes especificados en el campo spec.volumes se hayan montado correctamente. Si el volumen es un disco, verifica su estado.

  3. El campo spec.accessCredentials especifica un valor para montar una clave pública de SSH. Asegúrate de que el secreto se cree en el mismo espacio de nombres que la máquina virtual.

Si no hay suficientes recursos en el clúster para crear el Pod, sigue estos pasos:

  1. Si el clúster no tiene suficientes recursos de procesamiento para programar el Pod de la máquina virtual, quita otros Pods no deseados para liberar recursos.

  2. Reduce los valores de spec.domain.resources.requests.cpu y spec.domain.resources.requests.memory de la máquina virtual.

El estado Error o CrashLoopBackoff

Para resolver los problemas relacionados con los Pods en estados Error o CrashLoopBackoff, recupera los registros del Pod de procesamiento de la máquina virtual:

kubectl logs -l  kubevirt.io/vm=VM_NAME  -c compute

El estado Running y la falla de la máquina virtual

Si el Pod está en el estado Running, pero la máquina virtual falla, sigue estos pasos:

  1. Visualiza los registros del Pod de registro de la máquina virtual:

    kubectl logs -l  kubevirt.io/vm=VM_NAME  -c log
    
  2. Si el registro muestra errores en el inicio de la máquina virtual, verifica el dispositivo de inicio correcto de la máquina virtual. Establece el valor spec.domain.devices.disks.bootOrder del disco de arranque principal con el valor de 1. Usa el siguiente ejemplo como referencia:

      spec:
          domain:
            devices:
              disks:
              - bootOrder: 1
                disk:
                  bus: virtio
                name: VM_NAME-boot-dv
      

Para solucionar problemas de configuración con la imagen de la máquina virtual, crea otra máquina virtual con una imagen diferente.

Accede a la consola en serie

En esta sección, se describe cómo usar la consola en serie de la instancia de VM para depurar problemas de inicio y de red, solucionar problemas de instancias que no funcionan correctamente, interactuar con el cargador de arranque unificado GRand (GRUB) y realizar otras tareas de solución de problemas.

Interactuar con un puerto en serie es comparable a usar una ventana de la terminal: la entrada y salida están en modo de texto, sin asistencia de interfaz gráfica. El sistema operativo (SO) de la instancia, el sistema básico de entrada y salida (BIOS), a menudo escribe la salida en los puertos en serie y acepta entradas, como comandos.

Para acceder a la consola en serie, consulta las siguientes secciones:

Configura el nombre de usuario y la contraseña

De forma predeterminada, las imágenes del sistema de Linux de GDC no están configuradas para permitir accesos basados en contraseña de usuarios locales.

Si tu VM ejecuta una imagen preconfigurada con acceso a la consola en serie, puedes configurar una contraseña local en la VM y acceder a través de la consola en serie. En las VMs de Linux de GDC, configuras el nombre de usuario y la contraseña a través de una secuencia de comandos de inicio que se guarda como un secreto de Kubernetes durante la creación de la VM o después de ella.

En las siguientes instrucciones, se describe cómo configurar una contraseña local después de la creación de la VM. Para configurar el nombre de usuario y la contraseña, completa los siguientes pasos:

  1. Crea un archivo de texto.
  2. En el archivo de texto, configura el nombre de usuario y la contraseña:

    #!/bin/bash
    username="USERNAME"
    password="PASSWORD"
    sudo useradd -m -s /bin/bash "$username"
    echo "$username:$password" | sudo chpasswd
    sudo usermod -aG sudo "$username"
    

    Reemplaza lo siguiente:

    • USERNAME: El nombre de usuario que deseas agregar
    • PASSWORD: la contraseña del nombre de usuario. Evita las contraseñas básicas, ya que algunos SO pueden requerir una longitud y complejidad mínimas.
  3. Crea la secuencia de comandos de inicio como un secreto de Kubernetes:

    kubectl --kubeconfig=ADMIN_KUBECONFIG create secret \
    generic STARTUP_SCRIPT_NAME -n PROJECT_NAMESPACE \
    --from-file=STARTUP_SCRIPT_PATH
    

    Reemplaza lo siguiente:

    • PROJECT_NAMESPACE: Es el espacio de nombres del proyecto en el que reside la VM.
    • STARTUP_SCRIPT_NAME: the name you give to the startup script. For example,configure-credentials`.
    • STARTUP_SCRIPT_PATH: Es la ruta de acceso a la secuencia de comandos de inicio que contiene el nombre de usuario y la contraseña que configuraste.
  4. Detén la VM.

  5. Edita la especificación de la VM:

    kubectl --kubeconfig=ADMIN_KUBECONFIG edit gvm \
    -n PROJECT_NAMESPACE VM_NAME
    

    Reemplaza VM_NAME por el nombre de la VM que se agregará en la secuencia de comandos de inicio.

  6. En el campo startupScripts, agrega la referencia del Secret de Kubernetes que creaste en el paso tres:

    spec:
      compute:
        memory: 8Gi
        vcpus: 8
      disks:
      - boot: true
        virtualMachineDiskRef:
          name: disk-name 
      startupScripts:
      - name: STARTUP_SCRIPT_NAME
        scriptSecretRef:
          name: STARTUP_SCRIPT_NAME
    
  7. Inicia la VM.

    • Si trabajas en una VM nueva, omite este paso.

Accede a la consola en serie de la VM

Para comenzar a acceder a la consola en serie de la VM, haz lo siguiente:

  1. Conéctate a la consola en serie:

    gdcloud compute connect-to-serial-port VM_NAME \
    --project PROJECT_NAMESPACE
    
  2. Cuando se te solicite, ingresa el nombre de usuario y la contraseña que definiste en Configura el nombre de usuario y la contraseña.