Créer des instantanés pour diagnostiquer les problèmes de cluster

Lorsque vous rencontrez un problème avec l'un de vos clusters, vous pouvez obtenir de l'aide auprès de Cloud Customer Care. Le service client peut vous demander de prendre un "instantané" du cluster, qu'il pourra utiliser pour diagnostiquer le problème. Un instantané capture les fichiers de configuration des clusters et des nœuds, puis regroupe ces informations dans un seul fichier tar.

Ce document décrit comment créer des instantanés par défaut ou des instantanés plus personnalisés d'un cluster. Il explique également comment créer des instantanés lorsqu'un cluster rencontre des erreurs particulières.

Instantanés par défaut

Les sections suivantes décrivent le contenu d'un instantané standard et comment en créer un. Pour en savoir plus sur les instantanés personnalisés, consultez la section Instantanés personnalisés.

Quelles informations un instantané par défaut contient-il ?

L'instantané d'un cluster est un fichier tar de fichiers de configuration et de journaux concernant le cluster. Plus précisément, la configuration par défaut de la commande capture les informations suivantes concernant votre cluster :

  • Version de Kubernetes

  • État des ressources Kubernetes dans les espaces de noms kube-system et gke-system : cluster, machine, nœuds, Services, Endpoints, ConfigMaps, ReplicaSets, CronJobs, Pods et les propriétaires de ces pods, y compris les déploiements, DaemonSets et StatefulSets.

  • Détails sur chaque configuration de nœud, y compris les adresses IP, les règles iptables, les points d'installation, le système de fichiers, les connexions réseau et les processus en cours d'exécution.

  • Informations sur l'environnement d'exécution des VM dans Google Distributed Cloud, ainsi que sur les VM et les ressources associées aux VM exécutées dans votre cluster. Pour plus d'informations sur les éléments collectés par défaut et sur la création d'instantanés spécifiques à des VM, consultez la section Informations sur les VM dans les instantanés de ce document.

  • Journaux de la commande bmctl check cluster --snapshot

Les informations d'identification d'un cluster ne sont pas incluses dans l'instantané par défaut. Si l'assistance Cloud Customer Care demande ces informations, consultez la section Récupérer des informations sur un cluster.

Pour obtenir la liste complète des informations collectées lorsque vous exécutez la commande d'instantané, consultez le fichier de configuration présenté dans la section Le fichier de configuration en détail. Ce fichier de configuration indique les commandes exécutées lors de la prise d'un instantané par défaut.

Créer un instantané par défaut

La commande bmctl check cluster prend un instantané d'un cluster. Vous pouvez utiliser cette commande pour effectuer l'une des actions suivantes :

  • Créer un instantané et l'importer automatiquement dans un bucket Cloud Storage
  • Créer un instantané d'un cluster et enregistrer le fichier d'instantané sur l'ordinateur local sur lequel vous exécutez la commande

Méthode 1 : créer un instantané par défaut et l'importer automatiquement dans un bucket Cloud Storage

Pour créer et importer un instantané dans un bucket Cloud Storage, procédez comme suit :

  1. Configurez l'API et le compte de service :

    1. Activez l'API Cloud Storage dans votre projet Google Cloud.
    2. Attribuez un rôle storage.admin au compte de service afin qu'il puisse importer des données dans Cloud Storage.
    3. Téléchargez la clé JSON du compte de service.

    Pour en savoir plus, consultez la section Activer les services et comptes de service Google.

  2. Exécutez la commande bmctl suivante pour créer un instantané et l'importer automatiquement dans un bucket Cloud Storage :

    bmctl check cluster --snapshot --cluster=CLUSTER_NAME \
        --kubeconfig=KUBECONFIG_PATH \
        --upload-to BUCKET_NAME \
        [--service-account-key-file SERVICE_ACCOUNT_KEY_FILE]
    

    Dans la commande, remplacez les entrées suivantes par des informations spécifiques à votre environnement de cluster :

    • CLUSTER_NAME : nom du cluster pour lequel vous souhaitez prendre un instantané.
    • KUBECONFIG_PATH : chemin d'accès au fichier kubeconfig du cluster d'administrateur. (Le chemin d'accès au fichier kubeconfig est bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig par défaut. Toutefois, si vous avez spécifié votre espace de travail avec l'option WORKSPACE_DIR, le chemin d'accès est WORKSPACE_DIR/CLUSTER_NAME/CLUSTER_NAME-kubeconfig).
    • BUCKET_NAME : nom d'un bucket Cloud Storage dont vous êtes propriétaire.
    • SERVICE_ACCOUNT_KEY_FILE : si vous ne fournissez pas l'option --service-account-key-file, bmctl tente d'obtenir le chemin d'accès au fichier de clé du compte de service à partir de la variable d'environnement GOOGLE_APPLICATION_CREDENTIALS.
  3. Créez un compte de service et partagez l'accès avec Cloud Customer Care, comme décrit dans la section Autoriser l'assistance Google Cloud à afficher les instantanés de cluster importés.

Méthode 2 : créer un instantané par défaut sur un ordinateur local

Vous pouvez capturer l'état de vos clusters à l'aide de la commande suivante :

bmctl check cluster --snapshot --cluster=CLUSTER_NAME \
    --kubeconfig=KUBECONFIG_PATH

Remplacez les éléments suivants :

  • CLUSTER_NAME : nom du cluster cible.

  • KUBECONFIG_PATH : chemin d'accès au fichier kubeconfig du cluster d'administrateur. (Le chemin d'accès au fichier kubeconfig est bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig par défaut. Toutefois, si vous avez spécifié votre espace de travail avec l'option WORKSPACE_DIR, le chemin d'accès est WORKSPACE_DIR/CLUSTER_NAME/CLUSTER_NAME-kubeconfig).

Cette commande génère un fichier tar sur votre ordinateur local. Le nom de ce fichier tar est au format snapshot-CLUSTER_NAME-TIMESTAMP.tar.gz, où TIMESTAMP indique la date et l'heure de création du fichier. Ce fichier tar inclut des informations de débogage pertinentes concernant les composants système et les machines d'un cluster.

Lorsque vous exécutez cette commande, les informations sur les pods sont collectées à partir des espaces de noms suivants : gke-system, gke-connect, capi-system, capi-webhook-system, cert-manager et capi-kubeadm-bootstrap-system.

Cependant, vous pouvez étendre le champ d'application des informations de diagnostic collectées à l'aide de l'option --snapshot-scenario all. Cette option augmente le champ d'application de l'instantané de diagnostic pour inclure tous les pods d'un cluster :

bmctl check cluster --snapshot --snapshot-scenario all \
    --cluster=CLUSTER_NAME \
    --kubeconfig=KUBECONFIG_PATH

Scénarios d'instantanés

La commande bmctl check cluster --snapshot accepte deux scénarios. Pour spécifier un scénario, utilisez l'option --scenario. La liste suivante répertorie les valeurs possibles :

  • system : collecter un instantané des composants système, y compris leurs journaux

  • all : collecter un instantané de tous les pods, y compris leurs journaux

Vous pouvez utiliser chacun des deux scénarios avec un cluster d'administrateur ou un cluster d'utilisateur. Par exemple, pour créer un instantané du cluster d'administrateur en utilisant le scénario system :

bmctl check cluster --snapshot --snapshot-scenario system \
    --cluster=ADMIN_CLUSTER_NAME \
    --kubeconfig=ADMIN_KUBECONFIG_PATH

Pour créer un instantané d'un cluster d'utilisateur en utilisant le scénario all :

bmctl check cluster --snapshot --snapshot-scenario all \
    --cluster=USER_CLUSTER_NAME \
    --kubeconfig=ADMIN_KUBECONFIG_PATH

Effectuer une simulation pour un instantané

Lorsque vous utilisez l'option --snapshot-dry-run, la commande ne crée pas d'instantané. Au lieu de cela, elle indique les actions effectuées par la commande d'instantané et génère un fichier de configuration d'instantané. Pour en savoir plus sur le fichier de configuration d'instantané, consultez la page Créer un instantané personnalisé.

Pour exécuter une simulation d'instantané sur votre cluster d'administrateur, saisissez la commande suivante :

bmctl check cluster --snapshot --snapshot-dry-run \
    --cluster=ADMIN_CLUSTER_NAME \
    --kubeconfig=ADMIN_KUBECONFIG_PATH

Pour exécuter une simulation d'instantané sur un cluster d'utilisateur, saisissez la commande suivante :

bmctl check cluster --snapshot --snapshot-dry-run \
    --cluster=USER_CLUSTER_NAME \
    --kubeconfig=ADMIN_KUBECONFIG_PATH

Obtenir les journaux d'une période particulière

Vous pouvez utiliser l'option --since pour récupérer les journaux d'une période qui vous intéresse particulièrement. Vous pouvez ainsi créer des instantanés de journalisation plus petits et plus ciblés des événements survenus au cours des dernières secondes, minutes ou heures.

Par exemple, la commande bmctl suivante crée un instantané de journalisation survenue au cours des trois dernières heures :

bmctl check cluster --snapshot --since=3h \
    --cluster=CLUSTER_NAME \
    --kubeconfig=ADMIN_KUBECONFIG_PATH

Spécifier un répertoire dans lequel l'instantané est enregistré temporairement

Vous pouvez utiliser l'option --snapshot-temp-output-dir pour spécifier un répertoire dans lequel l'instantané est enregistré temporairement :

bmctl check cluster --snapshot --snapshot-temp-output-dir=TEMP_OUTPUT_DIR \
    --cluster=CLUSTER_NAME \
    --kubeconfig=ADMIN_KUBECONFIG_PATH

Si vous ne spécifiez pas de répertoire, l'instantané est enregistré temporairement dans le répertoire /tmp. Il est recommandé d'utiliser l'option --snapshot-temp-output-dir lorsque, par exemple, l'espace est limité dans le répertoire par défaut /tmp.

Supprimer la journalisation de la console

Vous pouvez utiliser l'option --quiet pour empêcher l'affichage des messages de journal dans la console lors d'une exécution d'instantané. Les journaux de la console sont alors enregistrés dans le fichier "bmctl_diagnose_snapshot.log" lors de la capture de l'instantané.

Exécutez la commande suivante pour empêcher l'affichage des messages de journal dans la console :

bmctl check cluster --snapshot --quiet \
    --cluster=CLUSTER_NAME \
    --kubeconfig=ADMIN_KUBECONFIG_PATH

Instantanés personnalisés

Vous pouvez créer un instantané personnalisé d'un cluster pour les raisons suivantes :

  • Pour inclure plus d'informations sur votre cluster que celles fournies dans l'instantané par défaut.
  • Pour exclure certaines informations figurant dans l'instantané par défaut.

Créer un instantané personnalisé

La création d'un instantané personnalisé nécessite l'utilisation d'un fichier de configuration d'instantané. Les étapes suivantes expliquent comment créer, modifier et utiliser le fichier de configuration pour créer un instantané personnalisé d'un cluster :

  1. Pour créer un fichier de configuration d'instantané, exécutez la commande suivante sur votre cluster et écrivez le résultat dans un fichier :

    bmctl check cluster \
        --snapshot --snapshot-dry-run --cluster CLUSTER_NAME \
        --kubeconfig KUBECONFIG_PATH
    
  2. Définissez le type d'informations que vous souhaitez afficher dans votre instantané personnalisé. Pour ce faire, modifiez le fichier de configuration d'instantané que vous avez créé à l'étape 1. Par exemple, si vous souhaitez que l'instantané contienne des informations supplémentaires, telles que la durée d'exécution d'un nœud particulier, ajoutez la commande Linux uptime à la section appropriée du fichier de configuration. L'extrait de fichier de configuration suivant montre comment faire en sorte que la commande d'instantané fournisse des informations d'uptime au sujet du nœud 10.200.0.3. Ces informations n'apparaissent pas dans un instantané standard.

    ...
    nodeCommands:
    - nodes:
      - 10.200.0.3
      commands:
      - uptime
    ...
    
  3. Une fois que vous avez modifié le fichier de configuration pour définir le type d'instantané souhaité, créez l'instantané personnalisé en exécutant la commande suivante :

    bmctl check cluster --snapshot --snapshot-config SNAPSHOT_CONFIG_FILE \
        --cluster CLUSTER_NAME--kubeconfig KUBECONFIG_PATH
    

    L'option --snapshot-config indique à la commande bmctl d'utiliser le contenu du fichier de configuration de l'instantané pour définir les informations qui apparaissent dans l'instantané.

Le fichier de configuration en détail

L'exemple de fichier de configuration d'instantané suivant affiche les commandes et fichiers standards utilisés pour créer un instantané, mais vous pouvez ajouter des commandes et des fichiers supplémentaires lorsque des informations de diagnostic supplémentaires sont nécessaires :

numOfParallelThreads: 10
excludeWords:
- password
nodeCommands:
- nodes:
  - 10.200.0.3
  - 10.200.0.4
  commands:
  - uptime
  - df --all --inodes
  - ip addr
  - ip neigh
  - iptables-save --counters
  - mount
  - ip route list table all
  - top -bn1 || true
  - docker info || true
  - docker ps -a || true
  - crictl ps -a || true
  - docker ps -a | grep anthos-baremetal-haproxy | cut -d ' ' -f1 | head -n 1 | xargs
    sudo docker logs || true
  - docker ps -a | grep anthos-baremetal-keepalived | cut -d ' ' -f1 | head -n 1 |
    xargs sudo docker logs || true
  - crictl ps -a | grep anthos-baremetal-haproxy | cut -d ' ' -f1 | head -n 1 | xargs
    sudo crictl logs || true
  - crictl ps -a | grep anthos-baremetal-keepalived | cut -d ' ' -f1 | head -n 1 |
    xargs sudo crictl logs || true
  - ps -edF
  - ps -eo pid,tid,ppid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm,args,cgroup
  - conntrack --count
  - dmesg
  - systemctl status -l docker || true
  - journalctl --utc -u docker
  - journalctl --utc -u docker-monitor.service
  - systemctl status -l kubelet
  - journalctl --utc -u kubelet
  - journalctl --utc -u kubelet-monitor.service
  - journalctl --utc --boot --dmesg
  - journalctl --utc -u node-problem-detector
  - systemctl status -l containerd || true
  - journalctl --utc -u containerd
  - systemctl status -l docker.haproxy || true
  - journalctl --utc -u docker.haproxy
  - systemctl status -l docker.keepalived || true
  - journalctl --utc -u docker.keepalived
  - systemctl status -l container.haproxy || true
  - journalctl --utc -u container.haproxy
  - systemctl status -l container.keepalived || true
  - journalctl --utc -u container.keepalived
nodeFiles:
- nodes:
  - 10.200.0.3
  - 10.200.0.4
  files:
  - /proc/sys/fs/file-nr
  - /proc/sys/net/netfilter/nf_conntrack_max
  - /proc/sys/net/ipv4/conf/all/rp_filter
  - /lib/systemd/system/kubelet.service
  - /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
  - /lib/systemd/system/docker.service || true
  - /etc/systemd/system/containerd.service || true
  - /etc/docker/daemon.json || true
  - /etc/containerd/config.toml || true
  - /etc/systemd/system/container.keepalived.service || true
  - /etc/systemd/system/container.haproxy.service || true
  - /etc/systemd/system/docker.keepalived.service || true
  - /etc/systemd/system/docker.haproxy.service || true
nodeSSHKey: ~/.ssh/id_rsa # path to your ssh key file

Les entrées suivantes de votre fichier de configuration sont probablement différentes de celles apparaissant dans l'exemple de fichier de configuration ci-dessus :

  • Les adresses IP des nœuds dans les sections nodeCommands et nodeFiles
  • Le chemin d'accès au nodeSSHKey de votre cluster

Champs du fichier de configuration

Un fichier de configuration d'instantané est au format YAML. Le fichier de configuration inclut les champs suivants :

  • numOfParallelThreads : la routine d'instantané exécute généralement de nombreuses commandes. Plusieurs threads parallèles permettent d'assurer une exécution plus rapide de la routine. Nous vous recommandons de définir numOfParallelThreads sur 10, comme indiqué dans l'exemple de fichier de configuration précédent. Si vos instantanés prennent trop de temps, augmentez cette valeur.

  • excludeWords : l'instantané contient une grande quantité de données pour vos nœuds de cluster. Utilisez excludeWords pour réduire les risques de sécurité lorsque vous partagez votre instantané. Par exemple, excluez password pour que les chaînes de mot de passe correspondantes ne puissent pas être identifiées.

  • nodeCommands : cette section spécifie les informations suivantes :

    • nodes : liste des adresses IP des nœuds de cluster à partir desquels vous souhaitez recueillir des informations. Pour créer un instantané lorsque le cluster d'administrateur n'est pas accessible, spécifiez au moins une adresse IP de nœud.

    • commands : liste des commandes (et des arguments) à exécuter sur chaque nœud. Le résultat de chaque commande est inclus dans l'instantané.

  • nodeFiles : cette section spécifie les informations suivantes :

    • nodes : liste des adresses IP des nœuds de cluster à partir desquels vous souhaitez collecter des fichiers. Pour créer un instantané lorsque le cluster d'administrateur n'est pas accessible, spécifiez au moins une adresse IP de nœud.

    • files : liste de fichiers à récupérer à partir de chaque nœud. Lorsque les fichiers spécifiés se trouvent sur un nœud, ils sont inclus dans l'instantané.

  • nodeSSHKey : chemin d'accès à votre fichier de clé SSH. Lorsque le cluster d'administrateur est inaccessible, ce champ est obligatoire.

Créer des instantanés en cas d'erreurs particulières

Créer un instantané par défaut lors d'installations ou de mises à niveau bloquées

Lors de l'installation ou de la mise à niveau de clusters d'administrateur, hybrides ou autonomes, bmctl peut parfois se bloquer à certains points où l'on peut voir les sorties suivantes :

  • En attente de la préparation du cluster kubeconfig.
  • En attente de la préparation du cluster.
  • En attente de la préparation des pools de nœuds.
  • En attente de la fin de la mise à niveau.

Si vous rencontrez un problème d'installation ou de mise à niveau bloquée, vous pouvez toutefois prendre un instantané d'un cluster, à l'aide du cluster d'amorçage, en exécutant la commande suivante :

bmctl check cluster --snapshot --cluster=CLUSTER_NAME \
    --kubeconfig=WORKSPACE_DIR/.kindkubeconfig

Créer un instantané personnalisé lors d'installations ou de mises à niveau bloquées

Les étapes suivantes montrent comment créer un instantané personnalisé d'un cluster lorsqu'une installation ou une mise à niveau est bloquée :

  1. Récupérez un fichier de configuration d'instantané du cluster à partir de vos archives.

  2. Modifiez le fichier de configuration de l'instantané de sorte que l'instantané contienne les informations souhaitées.

  3. Créez l'instantané personnalisé en exécutant la commande suivante :

    bmctl check cluster --snapshot
        --snapshot-config=SNAPSHOT_CONFIG_FILE \
        --cluster=CLUSTER_NAME
        --kubeconfig=WORKSPACE_DIR/.kindkubeconfig
    

Comment créer un instantané personnalisé lorsque le cluster d'administrateur est inaccessible

Lorsque le cluster d'administrateur est inaccessible, vous pouvez prendre un instantané personnalisé du cluster en exécutant la commande suivante :

bmctl check cluster --snapshot --cluster CLUSTER_NAME
    --node-ssh-key SSH_KEY_FILE
    --nodes NODE_1_IP_ADDRESS, NODE_2_IP_ADDRESS, ...

Dans la commande, remplacez les entrées suivantes par des informations spécifiques à votre environnement de cluster :

  • CLUSTER_NAME : nom du cluster pour lequel vous souhaitez prendre un instantané.
  • SSH_KEY_FILE : chemin d'accès au fichier de clé SSH du nœud.
  • NODE_x_IP_ADDRESS : adresse IP d'un nœud de cluster pour lequel vous souhaitez obtenir des informations.

Vous pouvez également lister les adresses IP des nœuds sur des lignes distinctes :

bmctl check cluster
    --snapshot --cluster CLUSTER_NAME \
    --node-ssh-key SSH_KEY_FILE \
    --nodes NODE_1_IP_ADDRESS \
    --nodes NODE_2_IP_ADDRESS
  ...

Informations sur les VM dans les instantanés

Si vous utilisez l'environnement d'exécution des VM sur Google Distributed Cloud pour créer et gérer des machines virtuelles (VM) sur GKE sur bare metal, vous pouvez collecter des informations de diagnostic pertinentes dans des instantanés. Les instantanés sont une ressource essentielle pour le diagnostic et le dépannage des problèmes liés à vos VM.

Éléments collectés par défaut

Lorsque vous créez un instantané par défaut, celui-ci contient les informations sur l'environnement d'exécution des VM sur Google Distributed Cloud et sur les ressources associées. L'environnement d'exécution des VM sur Google Distributed Cloud est fourni avec GKE sur Bare Metal, et la ressource personnalisée VMRuntime est disponible sur vos clusters qui exécutent des charges de travail. Même si vous n'avez pas activé l'environnement d'exécution des VM sur Google Distributed Cloud, l'instantané contient toujours la description YAML de la ressource personnalisée VMRuntime.

Si vous avez activé l'environnement d'exécution des VM sur Google Distributed Cloud, les instantanés contiennent des informations sur l'état et la configuration des ressources associées à la VM (lorsque les objets sont présents) dans votre cluster. Les ressources associées aux VM incluent des objets Kubernetes, tels que des pods, des déploiements, des DaemonSets et des ConfigMaps.

Objets dans l'espace de noms vm-system

Les informations d'état et de configuration des objets suivants se trouvent dans kubectlCommands/vm-system dans l'instantané généré :

  • KubeVirt
  • VirtualMachineType
  • VMHighAvailabilityPolicy

Objets dans d'autres espaces de noms

Lorsque vous créez une VM (VirtualMachine), vous pouvez spécifier l'espace de noms. Si vous n'en spécifiez pas, l'espace de noms default est attribué à la VM. Les autres objets de cette section, tels que VirtualMachineInstance, sont liés à l'espace de noms de la VM correspondante.

Les informations d'état et de configuration des objets suivants se trouvent dans kubectlCommands/VM_NAMESPACE dans l'instantané généré. Si vous n'avez pas défini d'espace de noms spécifique à votre VM, les informations se trouvent dans kubectlCommands/default :

  • VirtualMachine
  • VirtualMachineInstance
  • VirtualMachineDisk
  • GuestEnvironmentData
  • VirtualMachineAccessRequest
  • VirtualMachinePasswordResetRequest

Objets sans espace de noms

Les objets suivants ne sont pas liés à un espace de noms. Les informations correspondantes se trouvent donc directement dans kubectlCommands dans l'instantané généré :

  • VMRuntime
  • DataVolume
  • CDI
  • GPUAllocation

Utiliser un fichier de configuration d'instantané pour ne capturer que des informations sur les VM

Si vous diagnostiquez des problèmes spécifiques aux VM, vous pouvez utiliser un fichier de configuration d'instantané pour limiter les informations collectées à celles associées aux VM et les personnaliser.

Le fichier de configuration d'instantané suivant montre comment créer un instantané spécifique à une VM. Vous pouvez inclure des commandes supplémentaires pour collecter plus d'informations sur votre instantané.

---
kubectlCommands:
- commands:
    - kubectl get vm -o wide
    - kubectl get vmi -o wide
    - kubectl get gvm -o wide
    - kubectl get vm -o yaml
    - kubectl get vmi -o yaml
    - kubectl get gvm -o yaml
    - kubectl describe vm
    - kubectl describe vmi
    - kubectl describe gvm
  namespaces:
    - .*
- commands:
    - kubectl get virtualmachinetype -o wide
    - kubectl get virtualmachinedisk -o wide
    - kubectl get virtualmachinetype -o yaml
    - kubectl get virtualmachinedisk -o yaml
    - kubectl describe virtualmachinetype
    - kubectl describe virtualmachinedisk
  namespaces:
    - vm-system

Pour en savoir plus sur l'utilisation des fichiers de configuration d'instantané, consultez la section Instantanés personnalisés de ce document.