Fehlerbehebung bei virtuellen Maschinen

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:

  1. Suchen Sie den Namen des Management API-Servers oder fragen Sie Ihren Plattformadministrator danach.

  2. Melden Sie sich an und generieren Sie die kubeconfig-Datei für den Management API-Server, falls Sie noch keine haben.

  3. 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:

  1. Beenden Sie die vorhandene VM, indem Sie der Anleitung unter VM beenden folgen.

  2. 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
    
  3. 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 mit rocky-8.

  4. 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.
  5. 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.

  6. Erstellen Sie ein Verzeichnis und stellen Sie das ursprüngliche Laufwerk an einem Bereitstellungspunkt bereit. Beispiel: /mnt/disks/new-disk.

  7. 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
    
  8. 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 es 18G 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 sie 17G Speicherplatz belegt und nicht benötigt wird.

  9. 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.

  10. Melden Sie sich von der neuen VM ab und beenden Sie die VM.

  11. 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
    
  12. 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
    
  13. Starten Sie die ursprüngliche VM. Wenn Sie genügend Speicherplatz freigegeben haben, wird die VM erfolgreich gestartet.

  14. 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:

    1. Aktualisieren Sie den spec.dataVolumeTemplate.spec.pvc.storageClassName-Wert der VM mit einer Speicherklasse, die den Zugriffsmodus ReadWriteMany unterstützt und einen CSI-Treiber (Container Storage Interface) als Speicherbereitsteller verwendet.

    2. Wenn keine anderen Speicherklassen im Cluster die Funktion ReadWriteMany bereitstellen können, aktualisieren Sie den Wert spec.dataVolumeTemplate.spec.pvc.accessMode, sodass der Zugriffsmodus ReadWriteOnce enthalten ist.

  • Der CSI-Treiber kann kein PersistentVolume bereitstellen:

    1. 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.
    2. Konfigurieren Sie den Treiber, um den Fehler zu beheben. Damit die PersistentVolume-Bereitstellung funktioniert, erstellen Sie einen Test-PVC in einem neuen spec mit einem anderen Namen als dem in der dataVolumeTemplate.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
      
    3. 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:

  1. Prüfen Sie die Logs der virtuellen Maschine:

    kubectl get vm VM_NAME -n NAMESPACE_NAME
    
  2. 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:

  1. Rufen Sie zusätzliche Details zum Status des Pods ab:

    kubectl get pod -l kubevirt.io/vm=VM_NAME
    
  2. 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.

  3. 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:

  1. 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.

  2. Reduzieren Sie die Werte spec.domain.resources.requests.cpu und spec.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:

  1. So rufen Sie die Logs aus dem Pod für VM-Logs auf:

    kubectl logs -l  kubevirt.io/vm=VM_NAME  -c log
    
  2. 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 von 1 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:

  1. Erstellen Sie eine Textdatei.
  2. 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.
  3. 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.
  4. Beenden Sie die VM.

  5. 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.

  6. 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
    
  7. Starten Sie die VM.

    • 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:

  1. Stellen Sie eine Verbindung zur seriellen Konsole her:

    gdcloud compute connect-to-serial-port VM_NAME \
    --project PROJECT_NAMESPACE
    
  2. Geben Sie bei Aufforderung den Nutzernamen und das Passwort ein, die Sie unter Nutzernamen und Passwort konfigurieren definiert haben.