Dépannage des machines virtuelles

Cette page explique comment résoudre les problèmes liés à la machine virtuelle (VM) de l'Application Operator (AO) dans l'appliance Google Distributed Cloud (GDC) isolée du réseau.

Récupérer un disque de démarrage de VM saturé

Si une VM manque d'espace sur le disque de démarrage, par exemple lorsqu'une application remplit la partition du disque de démarrage avec des journaux, les fonctionnalités critiques des VM ne fonctionnent plus. Il est possible que vous ne puissiez pas ajouter de clé SSH via la ressource VirtualMachineAccessRequest ni établir de connexion SSH à la VM à l'aide des clés existantes.

Cette page décrit la procédure à suivre pour créer une VM et y associer le disque afin de récupérer le contenu sur une nouvelle VM en tant que disque supplémentaire. Ces étapes illustrent les points suivants :

  • Une connexion SSH réussie à la nouvelle VM.
  • Augmentez l'espace en montant le disque pour récupérer et supprimer les données inutiles.
  • Supprimez la nouvelle VM et remplacez le disque d'origine par celui de la VM d'origine.

Avant de commencer

Avant de continuer, assurez-vous de demander l'accès aux VM au niveau du projet. Suivez la procédure indiquée pour attribuer le rôle Administrateur de machine virtuelle du projet (project-vm-admin).

Pour les opérations sur les VM à l'aide de la gcloud CLI, demandez à l'administrateur IAM de votre projet de vous attribuer le rôle d'administrateur de machines virtuelles du projet et le rôle de lecteur du projet (project-viewer).

Pour utiliser les commandes de l'interface de ligne de commande (CLI) gdcloud, assurez-vous d'avoir téléchargé, installé et configuré la CLI gdcloud. Toutes les commandes pour l'appliance GDC isolée utilisent la CLI gdcloud ou kubectl et nécessitent un environnement de système d'exploitation (OS).

Obtenir le chemin d'accès au fichier kubeconfig

Pour exécuter des commandes sur le serveur de l'API Management, assurez-vous de disposer des ressources suivantes :

  1. Localisez le nom du serveur de l'API Management ou demandez-le à votre administrateur de plate-forme.

  2. Connectez-vous et générez le fichier kubeconfig pour le serveur d'API Management si vous n'en avez pas.

  3. Utilisez le chemin d'accès pour remplacer MANAGEMENT_API_SERVER{"</var>"}} dans ces instructions.

Récupérer un disque de VM dont l'espace est insuffisant

Pour récupérer un disque de démarrage de VM dont l'espace est insuffisant, procédez comme suit :

  1. Arrêtez la VM existante en suivant Arrêter une VM.

  2. Modifiez la VM existante :

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

    Remplacez le nom du disque de VM existant dans le champ spec par un nouveau nom de code :

    ...
    spec:
      disks:
      - boot: true
        virtualMachineDiskRef:
          name: VM_DISK_PLACEHOLDER_NAME
    
  3. Créez une VM avec un système d'exploitation (OS) d'image différent de celui de la VM d'origine. Par exemple, si le disque d'origine utilise l'OS ubuntu-2004, créez la nouvelle VM avec rocky-8.

  4. Associez le disque d'origine en tant que disque supplémentaire à la nouvelle VM :

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

    Remplacez les éléments suivants :

    • NEW_VM_DISK_NAME : nom que vous donnez au nouveau disque de VM.
    • ORIGINAL_VM_DISK_NAME : nom du disque de la VM d'origine.
  5. Une fois la VM créée et en cours d'exécution, établissez une connexion SSH avec la VM en suivant Se connecter à une VM.

  6. Créez un répertoire et installez le disque d'origine sur un point d'installation. Exemple :/mnt/disks/new-disk

  7. Parcourez les fichiers et les répertoires du répertoire de montage en utilisant des espaces supplémentaires :

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

    Remplacez MOUNT_DIR par le nom du répertoire dans lequel vous avez installé le disque d'origine.

    Le résultat ressemble à ce qui suit :

    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. Parcourez chaque fichier et répertoire pour vérifier l'espace qu'ils utilisent. Cet exemple vérifie le répertoire home, car il utilise 18G d'espace.

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

    Le résultat ressemble à ce qui suit :

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

    L'exemple de fichier log_file est un fichier à supprimer, car il consomme 17G d'espace et n'est pas nécessaire.

  9. Supprimez les fichiers dont vous n'avez pas besoin et qui consomment de l'espace supplémentaire, ou sauvegardez les fichiers sur le nouveau disque de démarrage de la VM :

    • Déplacez les fichiers que vous souhaitez conserver :

      mv /mnt/disks/MOUNT_DIR/home/FILENAME/home/backup/
      
    • Supprimez les fichiers qui consomment de l'espace supplémentaire :

      rm /mnt/disks/MOUNT_DIR/home/FILENAME
      

      Remplacez FILENAME par le nom du fichier que vous souhaitez déplacer ou supprimer.

  10. Déconnectez-vous de la nouvelle VM et arrêtez-la.

  11. Modifiez la nouvelle VM pour supprimer le disque d'origine du champ spec :

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

    Supprimez la liste virtualMachineDiskRef qui contient le nom du disque de la VM d'origine :

    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. Modifiez la VM d'origine et remplacez VM_DISK_PLACEHOLDER_NAME que vous avez défini à l'étape 2 par le nom précédent :

    ...
    spec:
      disks:
      - boot: true
        virtualMachineDiskRef:
          name: VM_DISK_PLACEHOLDER_NAME # Replace this name with the previous VM name
    
  13. Démarrez la VM d'origine. Si vous avez libéré suffisamment d'espace, la VM démarre correctement.

  14. Si vous n'avez pas besoin de la nouvelle VM, supprimez-la :

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

Provisionner une machine virtuelle

Cette section explique comment résoudre les problèmes qui peuvent survenir lors du provisionnement d'une machine virtuelle (VM) dans l'appliance Google Distributed Cloud (GDC) isolée.

L'opérateur d'application (AO) doit exécuter toutes les commandes sur le cluster d'utilisateur par défaut.

Impossible de créer le disque.

Si une PersistentVolumeClaim (PVC) est à l'état Pending, examinez les alternatives suivantes pour résoudre le problème :

  • La classe de stockage ne permet pas de créer un PVC avec le mode d'accès ReadWriteMany :

    1. Mettez à jour la valeur spec.dataVolumeTemplate.spec.pvc.storageClassName de la machine virtuelle avec une classe de stockage compatible avec un mode d'accès ReadWriteMany et qui utilise un pilote Container Storage Interface (CSI) comme provisionneur de stockage.

    2. Si aucune autre classe de stockage du cluster ne peut fournir la fonctionnalité ReadWriteMany, mettez à jour la valeur spec.dataVolumeTemplate.spec.pvc.accessMode pour inclure le mode d'accès ReadWriteOnce.

  • Le pilote CSI ne parvient pas à provisionner un PersistentVolume :

    1. Vérifiez si un message d'erreur s'affiche :

      kubectl describe pvc VM_NAME-boot-dv -n NAMESPACE_NAME
      

      Remplacez les variables suivantes :

      • VM_NAME : nom de la machine virtuelle.
      • NAMESPACE_NAME : nom de l'espace de noms.
    2. Configurez le pilote pour résoudre l'erreur. Pour vous assurer que le provisionnement PersistentVolume fonctionne, créez un PVC de test dans un spec avec un nom différent de celui spécifié dans le 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. Une fois le provisionnement de l'objet PersistentVolume réussi, supprimez le PVC de test après la vérification :

      kubectl delete pvc test-pvc -n NAMESPACE_NAME
      

Impossible de créer une machine virtuelle

Si la ressource de machine virtuelle est appliquée, mais n'atteint pas l'état Running, procédez comme suit :

  1. Consultez les journaux de la machine virtuelle :

    kubectl get vm VM_NAME -n NAMESPACE_NAME
    
  2. Vérifiez l'état du pod correspondant de la machine virtuelle :

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

    Le résultat affiche l'état d'un pod. Voici les options possibles :

État ContainerCreating

Si le pod est à l'état ContainerCreating, procédez comme suit :

  1. Obtenez des informations supplémentaires sur l'état du pod :

    kubectl get pod -l kubevirt.io/vm=VM_NAME
    
  2. Si les volumes sont démontés, assurez-vous que tous les volumes spécifiés dans le champ spec.volumes sont correctement montés. Si le volume est un disque, vérifiez son état.

  3. Le champ spec.accessCredentials spécifie une valeur permettant de monter une clé publique SSH. Assurez-vous que le secret est créé dans le même espace de noms que la machine virtuelle.

Si le cluster ne dispose pas de suffisamment de ressources pour créer le pod, procédez comme suit :

  1. Si le cluster ne dispose pas de suffisamment de ressources de calcul pour planifier le pod de la machine virtuelle, supprimez les autres pods inutiles pour libérer des ressources.

  2. Réduisez les valeurs spec.domain.resources.requests.cpu et spec.domain.resources.requests.memory de la machine virtuelle.

État Error ou CrashLoopBackoff

Pour résoudre les problèmes liés aux pods à l'état Error ou CrashLoopBackoff, récupérez les journaux du pod de calcul de la machine virtuelle :

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

État Running et défaillance de la machine virtuelle

Si le pod est à l'état Running, mais que la machine virtuelle elle-même échoue, procédez comme suit :

  1. Affichez les journaux du pod de journaux de la machine virtuelle :

    kubectl logs -l  kubevirt.io/vm=VM_NAME  -c log
    
  2. Si le journal indique des erreurs au démarrage de la machine virtuelle, vérifiez le bon périphérique de démarrage de la machine virtuelle. Définissez la valeur spec.domain.devices.disks.bootOrder du disque de démarrage principal sur la valeur 1. Utilisez l'exemple suivant comme référence :

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

Pour résoudre les problèmes de configuration liés à l'image de la machine virtuelle, créez une autre machine virtuelle avec une image différente.

Accéder à la console série

Cette section explique comment utiliser la console série d'une instance de VM pour déboguer les problèmes de démarrage et de mise en réseau, résoudre les incidents, interagir avec le bootloader GRUB (GRand Unified Bootloader) et effectuer d'autres tâches de dépannage.

Les interactions avec un port série sont semblables à l'utilisation d'une fenêtre de terminal : les entrées et les sorties sont en mode texte, sans interface graphique. Le système d'exploitation (OS) de l'instance et le système d'entrée/sortie de base (BIOS) génèrent souvent des données en sortie sur les ports série et acceptent les entrées telles que les commandes.

Pour accéder à la console série, suivez les étapes décrites dans les sections suivantes :

Configurer le nom d'utilisateur et le mot de passe

Par défaut, les images système Linux GDC ne sont pas configurées pour autoriser les connexions par mot de passe aux utilisateurs locaux.

Si votre VM exécute une image préconfigurée avec une connexion à la console série, vous pouvez configurer un mot de passe local sur la VM et vous connecter via la console série. Dans les VM Linux GDC, vous configurez le nom d'utilisateur et le mot de passe à l'aide d'un script de démarrage enregistré en tant que secret Kubernetes lors de la création de la VM ou après.

Les instructions suivantes décrivent comment configurer un mot de passe local après la création de la VM. Pour configurer le nom d'utilisateur et le mot de passe, procédez comme suit :

  1. Créez un fichier texte.
  2. Dans le fichier texte, configurez le nom d'utilisateur et le mot de passe :

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

    Remplacez les éléments suivants :

    • USERNAME : nom d'utilisateur que vous souhaitez ajouter.
    • PASSWORD : mot de passe du nom d'utilisateur. Évitez les mots de passe simples, car certains systèmes d'exploitation peuvent imposer une longueur et une complexité minimales.
  3. Créez le script de démarrage en tant que secret Kubernetes :

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

    Remplacez les éléments suivants :

    • PROJECT_NAMESPACE : espace de noms du projet dans lequel réside la VM.
    • STARTUP_SCRIPT_NAME: the name you give to the startup script. For example,configure-credentials`.
    • STARTUP_SCRIPT_PATH : chemin d'accès au script de démarrage contenant le nom d'utilisateur et le mot de passe que vous avez configurés.
  4. Arrêtez la VM.

  5. Modifiez les spécifications de la VM :

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

    Remplacez VM_NAME par le nom de la VM à ajouter au script de démarrage.

  6. Dans le champ startupScripts, ajoutez la référence au secret Kubernetes que vous avez créé à l'étape 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. Démarrez la VM.

    • Si vous travaillez sur une nouvelle VM, ignorez cette étape.

Accéder à la console série de la VM

Pour commencer à accéder à la console série de la VM, procédez comme suit :

  1. Connectez-vous à la console série :

    gdcloud compute connect-to-serial-port VM_NAME \
    --project PROJECT_NAMESPACE
    
  2. Lorsque vous y êtes invité, saisissez le nom d'utilisateur et le mot de passe que vous avez définis dans Configurer le nom d'utilisateur et le mot de passe.