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:
Individua il nome del server dell'API Management o chiedi all'amministratore della piattaforma (PA) qual è il nome del server.
Accedi e genera il file kubeconfig per il server API Management se non ne hai uno.
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:
Arresta la VM esistente seguendo la procedura descritta in Arresta una VM.
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
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 conrocky-8
.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.
Dopo aver creato la VM e averla avviata, stabilisci una connessione SSH alla VM seguendo le istruzioni riportate in Connettersi a una VM.
Crea una directory e monta il disco originale in un punto di montaggio. Ad esempio,
/mnt/disks/new-disk
.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
Controlla ogni file e directory per verificare la quantità di spazio utilizzata da ciascuno. Questo esempio controlla la directory
home
perché utilizza18G
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é occupa17G
di spazio e non è necessario.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.
Esci dalla nuova VM e arrestala.
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
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
Avvia la VM originale. Se hai liberato spazio a sufficienza, la VM si avvia correttamente.
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
:Aggiorna il valore
spec.dataVolumeTemplate.spec.pvc.storageClassName
della macchina virtuale con una classe di archiviazione che supporti una modalità di accessoReadWriteMany
e utilizzi un driver Container Storage Interface (CSI) come provisioner di archiviazione.Se nessun'altra classe di archiviazione nel cluster può fornire la funzionalità
ReadWriteMany
, aggiorna il valorespec.dataVolumeTemplate.spec.pvc.accessMode
in modo da includere la modalità di accessoReadWriteOnce
.
Il driver CSI non è in grado di eseguire il provisioning di un
PersistentVolume
: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.
Configura il driver per risolvere l'errore. Per assicurarti che il provisioning di
PersistentVolume
funzioni, crea un PVC di test in un nuovospec
con un nome diverso da quello specificato indataVolumeTemplate.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
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:
Esamina i log della macchina virtuale:
kubectl get vm VM_NAME -n NAMESPACE_NAME
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:
Visualizza ulteriori dettagli sullo stato del pod:
kubectl get pod -l kubevirt.io/vm=VM_NAME
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.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:
Se il cluster non dispone di risorse di calcolo sufficienti per pianificare il pod della macchina virtuale, rimuovi altri pod indesiderati per liberare risorse.
Riduci i valori di
spec.domain.resources.requests.cpu
espec.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:
Visualizza i log del pod di log della macchina virtuale:
kubectl logs -l kubevirt.io/vm=VM_NAME -c log
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 valore1
. 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:
- Crea un file di testo.
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.
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.
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.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
-
- 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:
Connettiti alla console seriale:
gdcloud compute connect-to-serial-port VM_NAME \ --project PROJECT_NAMESPACE
Quando richiesto, inserisci il nome utente e la password definiti in Configurare il nome utente e la password.