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:
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.
Accede y genera el archivo kubeconfig para el servidor de la API de Management si no tienes uno.
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:
Detén la VM existente siguiendo los pasos que se indican en Cómo detener una VM.
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
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 conrocky-8
.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.
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.
Crea un directorio y activa el disco original en un punto de activación. Por ejemplo,
/mnt/disks/new-disk
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
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 usa18G
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 consume17G
de espacio y no es necesario.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.
Sal de la VM nueva y detenla.
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
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
Inicia la VM original. Si liberaste suficiente espacio, la VM se iniciará correctamente.
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
:Actualiza el valor de
spec.dataVolumeTemplate.spec.pvc.storageClassName
de la máquina virtual con una clase de almacenamiento que admita un modo de accesoReadWriteMany
y use un controlador de Container Storage Interface (CSI) como aprovisionador de almacenamiento.Si ninguna otra clase de almacenamiento del clúster puede proporcionar la capacidad de
ReadWriteMany
, actualiza el valor despec.dataVolumeTemplate.spec.pvc.accessMode
para incluir el modo de accesoReadWriteOnce
.
El controlador CSI no puede aprovisionar un
PersistentVolume
: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.
Configura el controlador para resolver el error. Para asegurarte de que el aprovisionamiento de
PersistentVolume
funcione, crea una PVC de prueba en unspec
nuevo con un nombre diferente del especificado endataVolumeTemplate.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
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:
Revisa los registros de la máquina virtual:
kubectl get vm VM_NAME -n NAMESPACE_NAME
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:
Obtén detalles adicionales sobre el estado del Pod:
kubectl get pod -l kubevirt.io/vm=VM_NAME
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.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:
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.
Reduce los valores de
spec.domain.resources.requests.cpu
yspec.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:
Visualiza los registros del Pod de registro de la máquina virtual:
kubectl logs -l kubevirt.io/vm=VM_NAME -c log
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 de1
. 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:
- Crea un archivo de texto.
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 agregarPASSWORD
: 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.
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.
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.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
-
- 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:
Conéctate a la consola en serie:
gdcloud compute connect-to-serial-port VM_NAME \ --project PROJECT_NAMESPACE
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.