Risoluzione dei problemi delle macchine virtuali

Questa pagina illustra la risoluzione dei problemi della macchina virtuale (VM) per l'operatore di applicazioni (AO) nell'appliance con air gap di Google Distributed Cloud (GDC).

Recupera un disco di avvio della VM completo

Se una VM esaurisce lo spazio sul disco di avvio, ad esempio quando un'applicazione riempie la partizione del disco di avvio con i log, le funzionalità critiche delle VM non funzionano. Potresti non essere in grado di aggiungere una nuova chiave SSH tramite la risorsa VirtualMachineAccessRequest o stabilire una connessione SSH alla VM utilizzando le chiavi esistenti.

Questa pagina descrive i passaggi per creare una nuova VM e collegare il disco per recuperare i contenuti in una nuova VM come disco aggiuntivo. Questi passaggi dimostrano quanto segue:

  • Una connessione SSH riuscita alla nuova VM.
  • Aumenta lo spazio montando il disco da recuperare ed elimina i dati non necessari.
  • Elimina la nuova VM e sostituisci il disco originale con la VM originale.

Prima di iniziare

Prima di continuare, assicurati di richiedere l'accesso alla VM a livello di progetto. Segui i passaggi indicati per assegnare il ruolo Amministratore macchine virtuali progetto (project-vm-admin).

Per le operazioni sulle VM che utilizzano gcloud CLI, chiedi all'amministratore IAM del progetto di assegnarti il ruolo Amministratore di macchine virtuali del progetto e il ruolo Visualizzatore progetto (project-viewer).

Per utilizzare i comandi dell'interfaccia a riga di comando (CLI) gdcloud, assicurati di aver scaricato, installato e configurato la CLI gdcloud. Tutti i comandi per l'appliance GDC air-gapped utilizzano la CLI gdcloud o kubectl e richiedono un ambiente del sistema operativo (OS).

Recupera il percorso del file kubeconfig

Per eseguire comandi sul server API Management, assicurati di disporre delle seguenti risorse:

  1. Individua il nome del server dell'API Management o chiedi all'amministratore della piattaforma (PA) qual è il nome del server.

  2. Accedi e genera il file kubeconfig per il server API Management se non ne hai uno.

  3. Utilizza il percorso per sostituire MANAGEMENT_API_SERVER{"</var>"}} in queste istruzioni.

Recupera un disco VM senza spazio

Per recuperare lo spazio su disco di avvio di una VM, completa i seguenti passaggi:

  1. Arresta la VM esistente seguendo la procedura descritta in Arresta una VM.

  2. Modifica la VM esistente:

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

    Sostituisci il nome del disco VM esistente nel campo spec con un nuovo nome segnaposto:

    ...
    spec:
      disks:
      - boot: true
        virtualMachineDiskRef:
          name: VM_DISK_PLACEHOLDER_NAME
    
  3. Crea una nuova VM con un sistema operativo (OS) immagine diverso dalla VM originale. Ad esempio, se il disco originale utilizza il sistema operativo ubuntu-2004, crea la nuova VM con rocky-8.

  4. Collega il disco originale come disco aggiuntivo alla nuova VM:

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

    Sostituisci quanto segue:

    • NEW_VM_DISK_NAME: il nome che assegni al nuovo disco VM.
    • ORIGINAL_VM_DISK_NAME: il nome del disco VM originale.
  5. Dopo aver creato la VM e averla avviata, stabilisci una connessione SSH alla VM seguendo le istruzioni riportate in Connettersi a una VM.

  6. Crea una directory e monta il disco originale in un punto di montaggio. Ad esempio, /mnt/disks/new-disk.

  7. Controlla i file e le directory nella directory di montaggio utilizzando spazio aggiuntivo:

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

    Sostituisci MOUNT_DIR con il nome della directory in cui hai montato il disco originale.

    L'output è simile al seguente:

    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. Controlla ogni file e directory per verificare la quantità di spazio utilizzata da ciascuno. Questo esempio controlla la directory home perché utilizza 18G di spazio.

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

    L'output è simile al seguente:

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

    Il file di esempio log_file è un file da cancellare perché occupa 17G di spazio e non è necessario.

  9. Elimina i file non necessari che consumano spazio aggiuntivo o esegui il backup dei file sul nuovo disco di avvio della VM:

    • Sposta i file che vuoi conservare:

      mv /mnt/disks/MOUNT_DIR/home/FILENAME/home/backup/
      
    • Elimina i file che occupano spazio aggiuntivo:

      rm /mnt/disks/MOUNT_DIR/home/FILENAME
      

      Sostituisci FILENAME con il nome del file che vuoi spostare o eliminare.

  10. Esci dalla nuova VM e arrestala.

  11. Modifica la nuova VM per rimuovere il disco originale dal campo spec:

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

    Rimuovi l'elenco virtualMachineDiskRef che contiene il nome del disco della VM originale:

    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. Modifica la VM originale e sostituisci VM_DISK_PLACEHOLDER_NAME che hai impostato nel passaggio 2 con il nome precedente:

    ...
    spec:
      disks:
      - boot: true
        virtualMachineDiskRef:
          name: VM_DISK_PLACEHOLDER_NAME # Replace this name with the previous VM name
    
  13. Avvia la VM originale. Se hai liberato spazio a sufficienza, la VM si avvia correttamente.

  14. Se non hai bisogno della nuova VM, eliminala:

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

Esegui il provisioning di una macchina virtuale

Questa sezione descrive come risolvere i problemi che potrebbero verificarsi durante il provisioning di una nuova macchina virtuale (VM) nell'appliance air-gap di Google Distributed Cloud (GDC).

L'operatore dell'applicazione (AO) deve eseguire tutti i comandi sul cluster utente predefinito.

Impossibile creare il disco

Se una PersistentVolumeClaim (PVC) si trova nello stato Pending, esamina le seguenti alternative per risolvere il problema:

  • La classe di archiviazione non supporta la creazione di un PVC con la modalità di accesso ReadWriteMany:

    1. Aggiorna il valore spec.dataVolumeTemplate.spec.pvc.storageClassName della macchina virtuale con una classe di archiviazione che supporti una modalità di accesso ReadWriteMany e utilizzi un driver Container Storage Interface (CSI) come provisioner di archiviazione.

    2. Se nessun'altra classe di archiviazione nel cluster può fornire la funzionalità ReadWriteMany, aggiorna il valore spec.dataVolumeTemplate.spec.pvc.accessMode in modo da includere la modalità di accesso ReadWriteOnce.

  • Il driver CSI non è in grado di eseguire il provisioning di un PersistentVolume:

    1. Controlla se è presente un messaggio di errore:

      kubectl describe pvc VM_NAME-boot-dv -n NAMESPACE_NAME
      

      Sostituisci le seguenti variabili:

      • VM_NAME: il nome della macchina virtuale.
      • NAMESPACE_NAME: il nome dello spazio dei nomi.
    2. Configura il driver per risolvere l'errore. Per assicurarti che il provisioning di PersistentVolume funzioni, crea un PVC di test in un nuovo spec con un nome diverso da quello specificato in 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. Dopo il provisioning dell'oggetto PersistentVolume, elimina il PVC di test dopo la verifica:

      kubectl delete pvc test-pvc -n NAMESPACE_NAME
      

Impossibile creare una macchina virtuale

Se la risorsa della macchina virtuale viene applicata, ma non raggiunge lo stato Running, segui questi passaggi:

  1. Esamina i log della macchina virtuale:

    kubectl get vm VM_NAME -n NAMESPACE_NAME
    
  2. Controlla lo stato del pod corrispondente della macchina virtuale:

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

    L'output mostra lo stato di un pod. Le opzioni possibili sono le seguenti:

Stato ContainerCreating

Se il pod è nello stato ContainerCreating, segui questi passaggi:

  1. Visualizza ulteriori dettagli sullo stato del pod:

    kubectl get pod -l kubevirt.io/vm=VM_NAME
    
  2. Se i volumi vengono smontati, assicurati che tutti i volumi specificati nel campo spec.volumes siano montati correttamente. Se il volume è un disco, controlla lo stato del disco.

  3. Il campo spec.accessCredentials specifica un valore per montare una chiave pubblica SSH. Assicurati che il secret venga creato nello stesso spazio dei nomi della macchina virtuale.

Se non ci sono risorse sufficienti sul cluster per creare il pod, segui questi passaggi:

  1. Se il cluster non dispone di risorse di calcolo sufficienti per pianificare il pod della macchina virtuale, rimuovi altri pod indesiderati per liberare risorse.

  2. Riduci i valori di spec.domain.resources.requests.cpu e spec.domain.resources.requests.memory della macchina virtuale.

Lo stato Error o CrashLoopBackoff

Per risolvere i problemi relativi ai pod negli stati Error o CrashLoopBackoff, recupera i log dal pod di calcolo della macchina virtuale:

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

Stato Running e guasto della macchina virtuale

Se il pod è nello stato Running, ma la macchina virtuale non funziona, segui questi passaggi:

  1. Visualizza i log del pod di log della macchina virtuale:

    kubectl logs -l  kubevirt.io/vm=VM_NAME  -c log
    
  2. Se il log mostra errori nell'avvio della macchina virtuale, controlla il dispositivo di avvio corretto della macchina virtuale. Imposta il valore spec.domain.devices.disks.bootOrder del disco di avvio principale con il valore 1. Utilizza il seguente esempio come riferimento:

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

Per risolvere i problemi di configurazione dell'immagine della macchina virtuale, crea un'altra macchina virtuale con un'immagine diversa.

Accedere alla console seriale

Questa sezione descrive come utilizzare la console seriale dell'istanza VM per eseguire il debug dei problemi di avvio e di rete, risolvere i problemi relativi alle istanze malfunzionanti, interagire con Grand Unified Bootloader (GRUB) ed eseguire altre attività di risoluzione dei problemi.

L'interazione con una porta seriale è paragonabile all'utilizzo di una finestra del terminale: l'input e l'output sono in modalità testo, senza supporto dell'interfaccia grafica. Il sistema operativo (OS) dell'istanza, l'input e l'output di base (BIOS), spesso scrive l'output sulle porte seriali e accetta input come i comandi.

Per accedere alla console seriale, consulta le seguenti sezioni:

Configurare nome utente e password

Per impostazione predefinita, le immagini di sistema GDC Linux non sono configurate per consentire gli accessi basati su password per gli utenti locali.

Se la tua VM esegue un'immagine preconfigurata con l'accesso alla console seriale, puoi configurare una password locale sulla VM e accedere tramite la console seriale. Nelle VM GDC Linux, configuri il nome utente e la password tramite uno script di avvio salvato come secret Kubernetes durante o dopo la creazione della VM.

Le seguenti istruzioni descrivono come configurare una password locale dopo la creazione della VM. Per configurare il nome utente e la password, completa i seguenti passaggi:

  1. Crea un file di testo.
  2. Nel file di testo, configura il nome utente e la password:

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

    Sostituisci quanto segue:

    • USERNAME: il nome utente che vuoi aggiungere.
    • PASSWORD: la password per il nome utente. Evita le password di base, poiché alcuni sistemi operativi potrebbero richiedere una lunghezza e una complessità minime per le password.
  3. Crea lo script di avvio come secret Kubernetes:

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

    Sostituisci quanto segue:

    • PROJECT_NAMESPACE: lo spazio dei nomi del progetto in cui si trova la VM.
    • STARTUP_SCRIPT_NAME: the name you give to the startup script. For example,configure-credentials`.
    • STARTUP_SCRIPT_PATH: il percorso dello script di avvio che contiene il nome utente e la password che hai configurato.
  4. Arresta la VM.

  5. Modifica la specifica della VM:

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

    Sostituisci VM_NAME con il nome della VM da aggiungere allo script di avvio.

  6. Nel campo startupScripts, aggiungi il riferimento al secret Kubernetes che hai creato nel passaggio 3:

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

    • Se stai lavorando su una nuova VM, salta questo passaggio.

Accedi alla console seriale della VM

Per iniziare ad accedere alla console seriale della VM:

  1. Connettiti alla console seriale:

    gdcloud compute connect-to-serial-port VM_NAME \
    --project PROJECT_NAMESPACE
    
  2. Quando richiesto, inserisci il nome utente e la password definiti in Configurare il nome utente e la password.