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 :
Localisez le nom du serveur de l'API Management ou demandez-le à votre administrateur de plate-forme.
Connectez-vous et générez le fichier kubeconfig pour le serveur d'API Management si vous n'en avez pas.
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 :
Arrêtez la VM existante en suivant Arrêter une VM.
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
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 avecrocky-8
.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.
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.
Créez un répertoire et installez le disque d'origine sur un point d'installation. Exemple :
/mnt/disks/new-disk
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
Parcourez chaque fichier et répertoire pour vérifier l'espace qu'ils utilisent. Cet exemple vérifie le répertoire
home
, car il utilise18G
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 consomme17G
d'espace et n'est pas nécessaire.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.
Déconnectez-vous de la nouvelle VM et arrêtez-la.
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
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
Démarrez la VM d'origine. Si vous avez libéré suffisamment d'espace, la VM démarre correctement.
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
:Mettez à jour la valeur
spec.dataVolumeTemplate.spec.pvc.storageClassName
de la machine virtuelle avec une classe de stockage compatible avec un mode d'accèsReadWriteMany
et qui utilise un pilote Container Storage Interface (CSI) comme provisionneur de stockage.Si aucune autre classe de stockage du cluster ne peut fournir la fonctionnalité
ReadWriteMany
, mettez à jour la valeurspec.dataVolumeTemplate.spec.pvc.accessMode
pour inclure le mode d'accèsReadWriteOnce
.
Le pilote CSI ne parvient pas à provisionner un
PersistentVolume
: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.
Configurez le pilote pour résoudre l'erreur. Pour vous assurer que le provisionnement
PersistentVolume
fonctionne, créez un PVC de test dans unspec
avec un nom différent de celui spécifié dans ledataVolumeTemplate.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
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 :
Consultez les journaux de la machine virtuelle :
kubectl get vm VM_NAME -n NAMESPACE_NAME
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 :
Obtenez des informations supplémentaires sur l'état du pod :
kubectl get pod -l kubevirt.io/vm=VM_NAME
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.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 :
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.
Réduisez les valeurs
spec.domain.resources.requests.cpu
etspec.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 :
Affichez les journaux du pod de journaux de la machine virtuelle :
kubectl logs -l kubevirt.io/vm=VM_NAME -c log
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 valeur1
. 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 :
- Créez un fichier texte.
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.
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.
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.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
-
- 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 :
Connectez-vous à la console série :
gdcloud compute connect-to-serial-port VM_NAME \ --project PROJECT_NAMESPACE
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.