Auf dieser Seite wird die Fehlerbehebung für die virtuelle Maschine (VM) für den Application Operator (AO) in der Air-Gap-Appliance von Google Distributed Cloud (GDC) behandelt.
Vollständiges VM-Bootlaufwerk wiederherstellen
Wenn auf dem Bootlaufwerk einer VM der Speicherplatz ausgeht, z. B. wenn eine Anwendung die Bootlaufwerkpartition mit Logs füllt, funktionieren kritische Funktionen auf den VMs nicht mehr. Möglicherweise können Sie über die VirtualMachineAccessRequest
-Ressource keinen neuen SSH-Schlüssel hinzufügen oder mit vorhandenen Schlüsseln keine SSH-Verbindung zur VM herstellen.
Auf dieser Seite wird beschrieben, wie Sie eine neue VM erstellen und das Laufwerk anhängen, um den Inhalt als zusätzliches Laufwerk auf einer neuen VM wiederherzustellen. Diese Schritte veranschaulichen Folgendes:
- Eine erfolgreiche SSH-Verbindung zur neuen VM.
- Erhöhen Sie den Speicherplatz, indem Sie das Laufwerk einhängen, um unnötige Daten wiederherzustellen und zu löschen.
- Löschen Sie die neue VM und hängen Sie das ursprüngliche Laufwerk wieder an die ursprüngliche VM an.
Hinweise
Bevor Sie fortfahren, müssen Sie VM-Zugriff auf Projektebene anfordern. Folgen Sie der Anleitung, um die Rolle „Project VirtualMachine Admin“ (project-vm-admin
) zuzuweisen.
Für VM-Vorgänge mit der gcloud CLI bitten Sie Ihren Projekt-IAM-Administrator, Ihnen sowohl die Rolle „Project VirtualMachine Admin“ als auch die Rolle „Project Viewer“ (project-viewer
) zuzuweisen.
Wenn Sie die Befehlszeilenbefehle (Command-Line Interface, CLI) von gdcloud
verwenden möchten, müssen Sie die gdcloud
-CLI heruntergeladen, installiert und konfiguriert haben.
Für alle Befehle für die GDC-Air-Gap-Appliance wird die gdcloud
- oder kubectl
-Befehlszeile verwendet. Außerdem ist eine Betriebssystemumgebung erforderlich.
Pfad der kubeconfig-Datei abrufen
Damit Sie Befehle für den Management API-Server ausführen können, benötigen Sie die folgenden Ressourcen:
Suchen Sie den Namen des Management API-Servers oder fragen Sie Ihren Plattformadministrator danach.
Melden Sie sich an und generieren Sie die kubeconfig-Datei für den Management API-Server, falls Sie noch keine haben.
Verwenden Sie den Pfad, um
MANAGEMENT_API_SERVER{"</var>"}}
in dieser Anleitung zu ersetzen.
VM-Laufwerk mit wenig Speicherplatz wiederherstellen
So stellen Sie ein VM-Bootlaufwerk wieder her, auf dem der Speicherplatz knapp ist:
Beenden Sie die vorhandene VM, indem Sie der Anleitung unter VM beenden folgen.
Bearbeiten Sie die vorhandene VM:
kubectl --kubeconfig ADMIN_KUBECONFIG edit \ virtualmachine.virtualmachine.gdc.goog -n PROJECT VM_NAME
Ersetzen Sie den vorhandenen VM-Festplattennamen im Feld
spec
durch einen neuen Platzhalternamen:... spec: disks: - boot: true virtualMachineDiskRef: name: VM_DISK_PLACEHOLDER_NAME
Erstellen Sie eine neue VM mit einem Betriebssystem-Image, das sich vom Betriebssystem der ursprünglichen VM unterscheidet. Wenn auf dem ursprünglichen Laufwerk beispielsweise das Betriebssystem
ubuntu-2004
verwendet wird, erstellen Sie die neue VM mitrocky-8
.Hängen Sie das ursprüngliche Laufwerk als zusätzliches Laufwerk an die neue VM an:
... spec: disks: - boot: true autoDelete: true virtualMachineDiskRef: name: NEW_VM_DISK_NAME - virtualMachineDiskRef: name: ORIGINAL_VM_DISK_NAME
Ersetzen Sie Folgendes:
- NEW_VM_DISK_NAME: der Name, den Sie dem neuen VM-Laufwerk geben.
- ORIGINAL_VM_DISK_NAME: Der Name des ursprünglichen VM-Laufwerks.
Nachdem Sie die VM erstellt haben und sie ausgeführt wird, stellen Sie eine SSH-Verbindung zur VM her. Folgen Sie dazu der Anleitung unter Verbindung zu einer VM herstellen.
Erstellen Sie ein Verzeichnis und stellen Sie das ursprüngliche Laufwerk an einem Bereitstellungspunkt bereit. Beispiel:
/mnt/disks/new-disk
.Prüfen Sie die Dateien und Verzeichnisse im Mount-Verzeichnis mit zusätzlichem Leerraum:
cd /mnt/disks/MOUNT_DIR du -hs -- * | sort -rh | head -10
Ersetzen Sie MOUNT_DIR durch den Namen des Verzeichnisses, in dem Sie das ursprüngliche Laufwerk bereitgestellt haben.
Die Ausgabe sieht etwa so aus:
18G home 1.4G usr 331M var 56M boot 5.8M etc 36K snap 24K tmp 16K lost+found 16K dev 8.0K run
Prüfen Sie die einzelnen Dateien und Verzeichnisse, um zu sehen, wie viel Speicherplatz sie jeweils belegen. In diesem Beispiel wird das Verzeichnis
home
geprüft, da es18G
Speicherplatz belegt.cd home du -hs -- * | sort -rh | head -10
Die Ausgabe sieht etwa so aus:
17G log_file ... 4.0K readme.md 4.0K main.go
Die Beispieldatei
log_file
ist eine Datei, die gelöscht werden kann, da sie17G
Speicherplatz belegt und nicht benötigt wird.Löschen Sie die Dateien, die Sie nicht benötigen und die zusätzlichen Speicherplatz belegen, oder sichern Sie die Dateien auf dem neuen Bootlaufwerk der VM:
Verschieben Sie die Dateien, die Sie behalten möchten:
mv /mnt/disks/MOUNT_DIR/home/FILENAME/home/backup/
Löschen Sie die Dateien, die zusätzlichen Speicherplatz belegen:
rm /mnt/disks/MOUNT_DIR/home/FILENAME
Ersetzen Sie FILENAME durch den Namen der Datei, die Sie verschieben oder löschen möchten.
Melden Sie sich von der neuen VM ab und beenden Sie die VM.
Bearbeiten Sie die neue VM, um das ursprüngliche Laufwerk aus dem Feld
spec
zu entfernen:kubectl --kubeconfig ADMIN_KUBECONFIG \ edit virtualmachine.virtualmachine.gdc.goog -n PROJECT NEW_VM_NAME
Entfernen Sie die Liste
virtualMachineDiskRef
, die den Namen des ursprünglichen VM-Laufwerks enthält: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
Bearbeiten Sie die ursprüngliche VM und ersetzen Sie VM_DISK_PLACEHOLDER_NAME, das Sie in Schritt 2 festgelegt haben, durch den vorherigen Namen:
... spec: disks: - boot: true virtualMachineDiskRef: name: VM_DISK_PLACEHOLDER_NAME # Replace this name with the previous VM name
Starten Sie die ursprüngliche VM. Wenn Sie genügend Speicherplatz freigegeben haben, wird die VM erfolgreich gestartet.
Wenn Sie die neue VM nicht benötigen, löschen Sie sie:
kubectl --kubeconfig ADMIN_KUBECONFIG \ delete virtualmachine.virtualmachine.gdc.goog -n PROJECT NEW_VM_NAME
Virtuelle Maschine bereitstellen
In diesem Abschnitt wird beschrieben, wie Sie Probleme beheben, die beim Bereitstellen einer neuen VM in einer GDC-Appliance (Google Distributed Cloud) ohne Internetverbindung auftreten können.
Der Application Operator (AO) muss alle Befehle für den Standardnutzercluster ausführen.
Laufwerk kann nicht erstellt werden
Wenn sich ein PersistentVolumeClaim
(PVC) im Status Pending
befindet, haben Sie folgende Möglichkeiten, den Status zu beheben:
Die StorageClass unterstützt das Erstellen eines PVC mit dem Zugriffsmodus
ReadWriteMany
nicht:Aktualisieren Sie den
spec.dataVolumeTemplate.spec.pvc.storageClassName
-Wert der VM mit einer Speicherklasse, die den ZugriffsmodusReadWriteMany
unterstützt und einen CSI-Treiber (Container Storage Interface) als Speicherbereitsteller verwendet.Wenn keine anderen Speicherklassen im Cluster die Funktion
ReadWriteMany
bereitstellen können, aktualisieren Sie den Wertspec.dataVolumeTemplate.spec.pvc.accessMode
, sodass der ZugriffsmodusReadWriteOnce
enthalten ist.
Der CSI-Treiber kann kein
PersistentVolume
bereitstellen:Prüfen Sie, ob eine Fehlermeldung angezeigt wird:
kubectl describe pvc VM_NAME-boot-dv -n NAMESPACE_NAME
Ersetzen Sie die folgenden Variablen:
VM_NAME
: Der Name der VM.NAMESPACE_NAME
: Der Name des Namespace.
Konfigurieren Sie den Treiber, um den Fehler zu beheben. Damit die
PersistentVolume
-Bereitstellung funktioniert, erstellen Sie einen Test-PVC in einem neuenspec
mit einem anderen Namen als dem in derdataVolumeTemplate.spec.pvc
angegebenen: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
Nachdem die Bereitstellung des
PersistentVolume
-Objekts erfolgreich war, löschen Sie den Test-PVC nach der Bestätigung:kubectl delete pvc test-pvc -n NAMESPACE_NAME
Virtuelle Maschine kann nicht erstellt werden
Wenn die VM-Ressource angewendet wird, aber nicht den Status Running
erreicht, gehen Sie so vor:
Prüfen Sie die Logs der virtuellen Maschine:
kubectl get vm VM_NAME -n NAMESPACE_NAME
Prüfen Sie den entsprechenden Pod-Status der virtuellen Maschine:
kubectl get pod -l kubevirt.io/vm=VM_NAME
Die Ausgabe zeigt einen Pod-Status. Folgende Optionen sind möglich:
Der ContainerCreating
-Status
Wenn sich der Pod im Status ContainerCreating
befindet, führe die folgenden Schritte aus:
Rufen Sie zusätzliche Details zum Status des Pods ab:
kubectl get pod -l kubevirt.io/vm=VM_NAME
Wenn die Volumes nicht bereitgestellt sind, müssen Sie dafür sorgen, dass alle im Feld
spec.volumes
angegebenen Volumes erfolgreich bereitgestellt werden. Wenn es sich bei dem Volume um eine Festplatte handelt, prüfen Sie den Festplattenstatus.Im Feld
spec.accessCredentials
wird ein Wert zum Einbinden eines öffentlichen SSH-Schlüssels angegeben. Achten Sie darauf, dass das Secret im selben Namespace wie die VM erstellt wird.
Wenn im Cluster nicht genügend Ressourcen zum Erstellen des Pods vorhanden sind, gehen Sie so vor:
Wenn der Cluster nicht über genügend Rechenressourcen verfügt, um den VM-Pod zu planen, entfernen Sie andere unerwünschte Pods, um Ressourcen freizugeben.
Reduzieren Sie die Werte
spec.domain.resources.requests.cpu
undspec.domain.resources.requests.memory
der virtuellen Maschine.
Der Status Error
oder CrashLoopBackoff
Wenn Sie Pods mit dem Status Error
oder CrashLoopBackoff
beheben möchten, rufen Sie Logs aus dem Compute-Pod der virtuellen Maschine ab:
kubectl logs -l kubevirt.io/vm=VM_NAME -c compute
Der Status von Running
und Fehler bei der virtuellen Maschine
Wenn sich der Pod im Status Running
befindet, die virtuelle Maschine jedoch fehlschlägt, führen Sie die folgenden Schritte aus:
So rufen Sie die Logs aus dem Pod für VM-Logs auf:
kubectl logs -l kubevirt.io/vm=VM_NAME -c log
Wenn im Log Fehler beim Starten der virtuellen Maschine angezeigt werden, prüfen Sie das richtige Bootgerät der virtuellen Maschine. Legen Sie den Wert
spec.domain.devices.disks.bootOrder
der primären Bootdisk mit dem Wert von1
fest. Verwenden Sie das folgende Beispiel als Referenz:… spec: domain: devices: disks: - bootOrder: 1 disk: bus: virtio name: VM_NAME-boot-dv …
Wenn Sie Konfigurationsprobleme mit dem VM-Image beheben möchten, erstellen Sie eine weitere VM mit einem anderen Image.
Auf die serielle Konsole zugreifen
In diesem Abschnitt wird beschrieben, wie Sie die serielle Konsole einer VM-Instanz verwenden, um Start- und Netzwerkprobleme zu beheben, Instanzen mit Fehlfunktionen zu korrigieren, mit dem GRand Unified Bootloader (GRUB) zu interagieren und andere Fehler zu beheben.
Die Interaktion mit einer seriellen Schnittstelle ähnelt der Verwendung eines Terminalfensters: Die Ein- und Ausgabe erfolgt im Textmodus, ohne Unterstützung einer grafischen Benutzeroberfläche. Das Betriebssystem der Instanz und das BIOS (Basic Input/Output System) schreiben Ausgaben häufig an die seriellen Ports und akzeptieren Eingaben wie Befehle.
Gehen Sie die folgenden Abschnitte durch, um Zugriff auf die serielle Konsole zu erhalten:
Nutzername und Passwort konfigurieren
GDC Linux-System-Images sind standardmäßig so konfiguriert, dass sie eine passwortbasierte Anmeldung für lokale Nutzer nicht zulassen.
Wenn auf Ihrer VM ein Image mit vorkonfigurierten Anmeldekonten für serielle Konsolen ausgeführt wird, können Sie ein lokales Passwort auf der VM einrichten und sich über die serielle Konsole anmelden. In GDC-Linux-VMs konfigurieren Sie den Nutzernamen und das Passwort über ein Startskript, das während oder nach der VM-Erstellung als Kubernetes-Secret gespeichert wird.
In der folgenden Anleitung wird beschrieben, wie Sie ein lokales Passwort nach dem Erstellen einer VM einrichten. Führen Sie die folgenden Schritte aus, um den Nutzernamen und das Passwort zu konfigurieren:
- Erstellen Sie eine Textdatei.
Konfigurieren Sie in der Textdatei den Nutzernamen und das Passwort:
#!/bin/bash username="USERNAME" password="PASSWORD" sudo useradd -m -s /bin/bash "$username" echo "$username:$password" | sudo chpasswd sudo usermod -aG sudo "$username"
Ersetzen Sie Folgendes:
USERNAME
: der Nutzername, den Sie hinzufügen möchten.PASSWORD
: Passwort für den Nutzernamen Vermeiden Sie einfache Passwörter, da einige Betriebssysteme möglicherweise eine minimale Passwortlänge und Komplexität erfordern.
Erstellen Sie das Startskript als Kubernetes-Secret:
kubectl --kubeconfig=ADMIN_KUBECONFIG create secret \ generic STARTUP_SCRIPT_NAME -n PROJECT_NAMESPACE \ --from-file=STARTUP_SCRIPT_PATH
Ersetzen Sie Folgendes:
PROJECT_NAMESPACE
: der Namespace des Projekts, in dem sich die VM befindet.- STARTUP_SCRIPT_NAME
: the name you give to the startup script. For example,
configure-credentials“. STARTUP_SCRIPT_PATH
: der Pfad zum Startskript, das den von Ihnen konfigurierten Nutzernamen und das von Ihnen konfigurierte Passwort enthält.
Bearbeiten Sie die VM-Spezifikation:
kubectl --kubeconfig=ADMIN_KUBECONFIG edit gvm \ -n PROJECT_NAMESPACE VM_NAME
Ersetzen Sie
VM_NAME
durch den Namen der VM, die dem Startskript hinzugefügt werden soll.Fügen Sie im Feld
startupScripts
den im dritten Schritt erstellten Kubernetes-Secret-Verweis hinzu:spec: compute: memory: 8Gi vcpus: 8 disks: - boot: true virtualMachineDiskRef: name: disk-name startupScripts: - name: STARTUP_SCRIPT_NAME scriptSecretRef: name: STARTUP_SCRIPT_NAME
-
- Wenn Sie an einer neuen VM arbeiten, überspringen Sie diesen Schritt.
Auf die serielle Konsole der VM zugreifen
So greifen Sie auf die serielle Konsole der VM zu:
Stellen Sie eine Verbindung zur seriellen Konsole her:
gdcloud compute connect-to-serial-port VM_NAME \ --project PROJECT_NAMESPACE
Geben Sie bei Aufforderung den Nutzernamen und das Passwort ein, die Sie unter Nutzernamen und Passwort konfigurieren definiert haben.