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

L'outil gkectl comporte deux commandes permettant de résoudre les problèmes liés aux clusters : gkectl diagnose snapshot et gkectl diagnose cluster. Ces commandes fonctionnent aussi bien avec les clusters d'administrateur que d'utilisateur. Ce document explique comment utiliser la commande gkectl diagnose pour créer des instantanés de diagnostic afin de résoudre les problèmes dans vos clusters.

Pour en savoir plus sur l'utilisation de la commande gkectl diagnose cluster pour diagnostiquer les problèmes de cluster, consultez la page Diagnostiquer les problèmes de cluster.

Si vous avez besoin d'aide supplémentaire, contactez l'assistance Cloud Customer Care.

gkectl diagnose snapshot

Cette commande compresse l'état, les configurations et les journaux d'un cluster dans un fichier tar. Lorsque vous exécutez gkectl diagnose snapshot, la commande exécute automatiquement gkectl diagnose cluster dans le cadre du processus, et les fichiers de sortie sont placés dans un nouveau dossier de l'instantané appelé /diagnose-report.

Instantané par défaut

La configuration par défaut de la commande gkectl diagnose snapshot 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.

  • État du plan de contrôle.

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

  • Journaux de conteneur issus du nœud du plan de contrôle du cluster d'administrateur, lorsque le serveur d'API Kubernetes n'est pas disponible

  • Informations sur vSphere, y compris les objets de VM et leurs événements basés sur un pool de ressources ; Il collecte également des informations sur les objets de centre de données, de cluster, de réseau et Datastore associés aux VM.

  • Informations sur l'équilibreur de charge F5 BIG-IP, y compris le serveur virtuel, l'adresse virtuelle, le pool, le nœud et la surveillance

  • Journaux de la commande gkectl diagnose snapshot

  • Journaux des jobs préliminaires

  • Journaux des conteneurs dans les espaces de noms en fonction des scénarios.

  • Des informations sur l'expiration du certificat Kubernetes du cluster d'administrateur sont disponibles dans le fichier d'instantané /nodes/<admin_master_node_name>/sudo_kubeadm_certs_check-expiration.

  • Fichier d'index HTML pour tous les fichiers de l'instantané.

  • Éventuellement, le fichier de configuration du cluster d'administrateur utilisé pour installer et mettre à jour le cluster avec l'option --config.

Les identifiants, y compris vSphere et F5, sont supprimés avant la création du fichier tar.

Instantané léger

Dans Google Distributed Cloud version 1.29 ou ultérieure, une version allégée de gkectl diagnose snapshot est disponible pour les clusters d'administrateur et d'utilisateur. Un instantané léger accélère le processus de création d'instantanés, car il capture moins d'informations sur le cluster. Lorsque vous ajoutez --scenario=lite à la commande, seules les informations suivantes sont incluses dans l'instantané:

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

  • Journaux de la commande gkectl diagnose snapshot

Capturer l'état du cluster

Si les commandes gkectl diagnose cluster détectent des erreurs, vous devez capturer l'état du cluster et fournir les informations à Cloud Customer Care. Vous pouvez capturer ces informations à l'aide de la commande gkectl diagnose snapshot.

gkectl diagnose snapshot comporte une option facultative pour --config. En plus de collecter des informations sur le cluster, cette option collecte le fichier de configuration GKE sur VMware utilisé pour créer ou mettre à niveau le cluster.

Capturer l'état du cluster d'administrateur

Pour capturer l'état d'un cluster d'administrateur, exécutez la commande suivante :

gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG --config

Le paramètre --config est facultatif:

En cas de problème avec une adresse IP virtuelle (VIP) dans le cluster cible, utilisez l'option --config pour fournir le fichier de configuration du cluster d'administrateur et fournir plus d'informations de débogage.

Dans les versions 1.29 et ultérieures, vous pouvez inclure --scenario=lite si vous n'avez pas besoin de toutes les informations de l'instantané par défaut.

Le résultat inclut une liste de fichiers et le nom d'un fichier tar, comme illustré dans l'exemple de résultat suivant:

Taking snapshot of admin cluster "[ADMIN_CLUSTER_NAME]"...
   Using default snapshot configuration...
   Setting up "[ADMIN_CLUSTER_NAME]" ssh key file...DONE
   Taking snapshots...
       commands/kubectl_get_pods_-o_yaml_--kubeconfig_...env.default.kubeconfig_--namespace_kube-system
       commands/kubectl_get_deployments_-o_yaml_--kubeconfig_...env.default.kubeconfig_--namespace_kube-system
       commands/kubectl_get_daemonsets_-o_yaml_--kubeconfig_...env.default.kubeconfig_--namespace_kube-system
       ...
       nodes/[ADMIN_CLUSTER_NODE]/commands/journalctl_-u_kubelet
       nodes/[ADMIN_CLUSTER_NODE]/files/var/log/startup.log
       ...
   Snapshot succeeded. Output saved in [TAR_FILE_NAME].tar.gz.

Pour extraire le fichier tar dans un répertoire, exécutez la commande suivante:

tar -zxf TAR_FILE_NAME --directory EXTRACTION_DIRECTORY_NAME

Remplacez les éléments suivants :

  • TAR_FILE_NAME: nom du fichier tar.

  • EXTRACTION_DIRECTORY_NAME: répertoire dans lequel vous souhaitez extraire l'archive du fichier tar.

Pour afficher la liste des fichiers générés par l'instantané, exécutez les commandes suivantes :

cd EXTRACTION_DIRECTORY_NAME/EXTRACTED_SNAPSHOT_DIRECTORY
ls kubectlCommands
ls nodes/NODE_NAME/commands
ls nodes/NODE_NAME/files

Remplacez NODE_NAME par le nom du nœud pour lequel vous souhaitez afficher les fichiers.

Pour afficher les détails d'une opération spécifique, ouvrez l'un des fichiers.

Spécifiez la clé SSH du cluster d'administrateur

Lorsque vous obtenez un instantané du cluster d'administrateur, gkectl trouve automatiquement la clé SSH privée du cluster d'administrateur. Vous pouvez également spécifier la clé explicitement à l'aide du paramètre --admin-ssh-key-path.

Suivez les instructions pour vous connecter à un nœud de cluster via SSH afin de télécharger les clés SSH.

Dans la commande gkectl diagnose snapshot, définissez --admin-ssh-key-path sur le chemin d'accès de la clé décodée:

gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --admin-ssh-key-path=PATH_TO_DECODED_KEY

Capturer l'état du cluster d'utilisateur

Pour capturer l'état d'un cluster d'utilisateur, exécutez la commande suivante :

gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --cluster-name=USER_CLUSTER_NAME

L'exemple de résultat suivant inclut une liste de fichiers et le nom d'un fichier tar:

Taking snapshot of user cluster "[USER_CLUSTER_NAME]"...
Using default snapshot configuration...
Setting up "[USER_CLUSTER_NAME]" ssh key file...DONE
    commands/kubectl_get_pods_-o_yaml_--kubeconfig_...env.default.kubeconfig_--namespace_user
    commands/kubectl_get_deployments_-o_yaml_--kubeconfig_...env.default.kubeconfig_--namespace_user
    commands/kubectl_get_daemonsets_-o_yaml_--kubeconfig_...env.default.kubeconfig_--namespace_user
    ...
    commands/kubectl_get_pods_-o_yaml_--kubeconfig_.tmp.user-kubeconfig-851213064_--namespace_kube-system
    commands/kubectl_get_deployments_-o_yaml_--kubeconfig_.tmp.user-kubeconfig-851213064_--namespace_kube-system
    commands/kubectl_get_daemonsets_-o_yaml_--kubeconfig_.tmp.user-kubeconfig-851213064_--namespace_kube-system
    ...
    nodes/[USER_CLUSTER_NODE]/commands/journalctl_-u_kubelet
    nodes/[USER_CLUSTER_NODE]/files/var/log/startup.log
    ...
Snapshot succeeded. Output saved in [FILENAME].tar.gz.

Scénarios d'instantanés

Les scénarios d'instantané vous permettent de contrôler les informations incluses dans un instantané. Pour spécifier un scénario, utilisez l'option --scenario. La liste suivante indique les valeurs possibles:

  • system (par défaut): collectez un instantané avec les journaux dans les espaces de noms système compatibles.

  • all: collectez un instantané avec les journaux de tous les espaces de noms, y compris les espaces de noms définis par l'utilisateur.

  • lite (1.29 ou version ultérieure): collectez un instantané uniquement avec les ressources Kubernetes et les journaux gkectl. Tous les autres journaux, tels que les journaux de conteneur et les journaux du noyau de nœud, sont exclus.

Les scénarios d'instantanés disponibles varient en fonction de la version de Google Distributed Cloud.

  • Versions antérieures à 1.13: system, system-with-logs, all et all-with-logs.

  • Versions 1.13 à 1.28: system et all. Le scénario system est identique à l'ancien scénario system-with-logs. Le scénario all est identique à l'ancien scénario all-with-logs.

  • Versions 1.29 et ultérieures: system, all et lite.

Pour créer un instantané du cluster d'administrateur, vous n'avez pas besoin de spécifier un scénario:

gkectl diagnose snapshot \
    --kubeconfig=ADMIN_CLUSTER_KUBECONFIG

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

gkectl diagnose snapshot \
    --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --cluster-name=USER_CLUSTER_NAME \
    --scenario=system

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

gkectl diagnose snapshot \
    --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --cluster-name=USER_CLUSTER_NAME \
    --scenario=all

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

gkectl diagnose snapshot \
    --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --cluster-name=USER_CLUSTER_NAME \
    --scenario=lite

Utiliser --log-since pour limiter un instantané

Vous pouvez utiliser l'option --log-since pour limiter la collecte de journaux à une période récente. Par exemple, vous pouvez collecter uniquement les journaux des deux derniers jours ou des trois dernières heures. Par défaut, diagnose snapshot collecte tous les journaux.

gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --cluster-name=CLUSTER_NAME \
    --scenario=system \
    --log-since=DURATION

Remplacez <var>DURATION</var> par une valeur temporelle telle que 120m ou 48h.

Les considérations suivantes s'appliquent :

  • L'option --log-since n'est compatible qu'avec les journaux kubectl et journalctl.
  • Les options de commande telles que --log-since ne sont pas autorisées dans la configuration de l'instantané personnalisée.

Effectuer une simulation pour un instantané

Vous pouvez utiliser l'option --dry-run pour afficher les actions à effectuer et la configuration de l'instantané.

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

gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --cluster-name=ADMIN_CLUSTER_NAME \
    --dry-run

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

gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --cluster-name=USER_CLUSTER_NAME \
    --dry-run

Utiliser une configuration d'instantané

Si ces deux scénarios (--scenario system ou all) ne répondent pas à vos besoins, vous pouvez créer un instantané personnalisé en transmettant un fichier de configuration d'instantané à l'aide de l'option --snapshot-config:

gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --cluster-name=USER_CLUSTER_NAME \
    --snapshot-config=SNAPSHOT_CONFIG_FILE

Générer une configuration d'instantané

Vous pouvez générer une configuration d'instantané pour un scénario donné en transmettant les options --scenario et --dry-run. Par exemple, pour afficher la configuration de l'instantané du scénario par défaut (system) d'un cluster d'utilisateur, saisissez la commande suivante :

gkectl diagnose snapshot \
    --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --cluster-name=USER_CLUSTER_NAME \
    --scenario=system
    --dry-run

Le résultat ressemble à celui de l'exemple ci-dessous.

numOfParallelThreads: 10
excludeWords:
- password
kubectlCommands:
- commands:
  - kubectl get clusters -o wide
  - kubectl get machines -o wide
  - kubectl get clusters -o yaml
  - kubectl get machines -o yaml
  - kubectl describe clusters
  - kubectl describe machines
  namespaces:
  - default
- commands:
  - kubectl version
  - kubectl cluster-info
  - kubectl get nodes -o wide
  - kubectl get nodes -o yaml
  - kubectl describe nodes
  namespaces: []
- commands:
  - kubectl get pods -o wide
  - kubectl get deployments -o wide
  - kubectl get daemonsets -o wide
  - kubectl get statefulsets -o wide
  - kubectl get replicasets -o wide
  - kubectl get services -o wide
  - kubectl get jobs -o wide
  - kubectl get cronjobs -o wide
  - kubectl get endpoints -o wide
  - kubectl get configmaps -o wide
  - kubectl get pods -o yaml
  - kubectl get deployments -o yaml
  - kubectl get daemonsets -o yaml
  - kubectl get statefulsets -o yaml
  - kubectl get replicasets -o yaml
  - kubectl get services -o yaml
  - kubectl get jobs -o yaml
  - kubectl get cronjobs -o yaml
  - kubectl get endpoints -o yaml
  - kubectl get configmaps -o yaml
  - kubectl describe pods
  - kubectl describe deployments
  - kubectl describe daemonsets
  - kubectl describe statefulsets
  - kubectl describe replicasets
  - kubectl describe services
  - kubectl describe jobs
  - kubectl describe cronjobs
  - kubectl describe endpoints
  - kubectl describe configmaps
  namespaces:
  - kube-system
  - gke-system
  - gke-connect.*
prometheusRequests: []
nodeCommands:
- nodes: []
  commands:
  - uptime
  - df --all --inodes
  - ip addr
  - sudo iptables-save --counters
  - mount
  - ip route list table all
  - top -bn1
  - sudo docker ps -a
  - ps -edF
  - ps -eo pid,tid,ppid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm,args,cgroup
  - sudo conntrack --count
nodeFiles:
- nodes: []
  files:
  - /proc/sys/fs/file-nr
  - /proc/sys/net/nf_conntrack_max
seesawCommands: []
seesawFiles: []
nodeCollectors:
- nodes: []
f5:
  enabled: true
vCenter:
  enabled: true

Les informations suivantes s'affichent dans le résultat:

  • numOfParallelThreads : nombre de threads parallèles utilisés pour prendre des instantanés.

  • excludeWords : liste des mots à exclure de l'instantané (non sensible à la casse). Les lignes contenant ces mots sont supprimées des résultats de l'instantané. "mot de passe" est toujours exclu, que vous le spécifiiez ou non.

  • kubectlCommands : liste des commandes kubectl à exécuter. Les résultats sont enregistrés. Les commandes s'exécutent sur les espaces de noms correspondants. Pour les commandes kubectl logs, tous les pods et conteneurs des espaces de noms correspondants sont automatiquement ajoutés. Les expressions régulières sont compatibles avec la spécification des espaces de noms. Si vous ne spécifiez pas d'espace de noms, l'espace de noms default est utilisé par défaut.

  • nodeCommands : liste des commandes à exécuter sur les nœuds correspondants. Les résultats sont enregistrés. Lorsqu'aucun nœud n'est spécifié, tous les nœuds du cluster cible sont pris en compte.

  • nodeFiles : liste des fichiers à collecter à partir des nœuds correspondants. Les fichiers sont enregistrés. Lorsqu'aucun nœud n'est spécifié, tous les nœuds du cluster cible sont pris en compte.

  • seesawCommands : liste des commandes à exécuter pour collecter des informations sur l'équilibreur de charge Seesaw. Les résultats sont enregistrés si le cluster utilise l'équilibreur de charge Seesaw.

  • seesawFiles : liste des fichiers à collecter pour l'équilibreur de charge Seesaw.

  • nodeCollectors : collecteur qui exécute les nœuds Cilium pour collecter des informations eBPF.

  • f5 : option permettant de collecter des informations liées à l'équilibreur de charge F5 BIG-IP.

  • vCenter : option permettant de collecter des informations liées à vCenter.

  • prometheusRequests : liste des requêtes Prometheus. Les résultats sont enregistrés.

Importer des instantanés dans un bucket Cloud Storage

Pour faciliter la conservation des enregistrements, l'analyse et le stockage, vous pouvez importer tous les instantanés d'un cluster spécifique dans un bucket Cloud Storage. Cela est particulièrement utile si vous avez besoin de l'aide de Cloud Customer Care.

Avant d'importer des instantanés dans un bucket Cloud Storage, vérifiez et répondez aux exigences initiales suivantes:

  • Activez storage.googleapis.com dans le projet hôte du parc. Bien que vous puissiez utiliser un autre projet, le projet hôte de parc est recommandé.

    gcloud services enable --project=FLEET_HOST_PROJECT_ID storage.googleapis.com
    
  • Accordez le rôle roles/storage.admin au compte de service sur son projet parent et transmettez le fichier de clé JSON du compte de service à l'aide du paramètre --service-account-key-file. Vous pouvez utiliser n'importe quel compte de service. Toutefois, nous vous recommandons d'utiliser l'option Connect Register Service Account. Pour en savoir plus, consultez la section Comptes de service.

    gcloud projects add-iam-policy-binding FLEET_HOST_PROJECT_ID \
      --member "serviceAccount:CONNECT_REGISTER_SERVICE_ACCOUNT" \
      --role "roles/storage.admin"
    

    Remplacez CONNECT_REGISTER_SERVICE_ACCOUNT par le compte de service Connect register.

Maintenant que ces conditions sont remplies, vous pouvez importer l'instantané dans le bucket Cloud Storage:

gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
    --cluster-name CLUSTER_NAME \
    --upload \
    --share-with GOOGLE_SUPPORT_SERVICE_ACCOUNT

L'option --share-with peut accepter une liste de noms de comptes de service. Remplacez GOOGLE_SUPPORT_SERVICE_ACCOUNT par le compte de service Cloud Customer Care fourni par Cloud Customer Care, ainsi que par tous les autres comptes de service fournis par Cloud Customer Care.

Lorsque vous utilisez l'option --upload, la commande recherche dans votre projet un bucket de stockage dont le nom commence par "anthos-snapshot-". Si un tel bucket existe, la commande importe l'instantané dans celui-ci. Si la commande ne trouve aucun bucket avec un nom correspondant, elle crée un bucket nommé anthos-snapshot-UUID, où UUID est un identifiant unique universel à 32 chiffres.

Lorsque vous utilisez l'option --share-with, vous n'avez pas besoin de partager manuellement l'accès au bucket avec Cloud Customer Care.

L'exemple de résultat suivant s'affiche lorsque vous importez un instantané dans un bucket Cloud Storage:

Using "system" snapshot configuration...
Taking snapshot of user cluster <var>CLUSTER_NAME</var>...
Setting up <var>CLUSTER_NAME</var> ssh key...DONE
Using the gke-connect register service account key...
Setting up Google Cloud Storage bucket for uploading the snapshot...DONE
Taking snapshots in 10 thread(s)...
   ...
Snapshot succeeded.
Snapshots saved in "<var>SNAPSHOT_FILE_PATH</var>".
Uploading snapshot to Google Cloud Storage......  DONE
Uploaded the snapshot successfully to gs://anthos-snapshot-a4b17874-7979-4b6a-a76d-e49446290282/<var>xSNAPSHOT_FILE_NAME</var>.
Shared successfully with service accounts:
<var>GOOGLE_SUPPORT_SERVICE_ACCOUNT</var>

Étapes suivantes

Si vous avez besoin d'une aide supplémentaire, contactez Cloud Customer Care.