Crea instantáneas para diagnosticar problemas de clústeres

La herramienta de gkectl tiene dos comandos para solucionar problemas con clústeres: gkectl diagnose snapshot y gkectl diagnose cluster. Los comandos funcionan con clústeres de administrador y de usuario. En este documento, se muestra cómo usar el comando gkectl diagnose para crear instantáneas de diagnóstico y solucionar problemas en tus clústeres.

Si deseas obtener más información sobre cómo usar el comando gkectl diagnose cluster para diagnosticar problemas de clústeres, consulta Diagnostica problemas de clústeres.

Si necesitas asistencia adicional, comunícate con Atención al cliente de Cloud.

gkectl diagnose snapshot

Este comando comprime el estado, la configuración y los registros de un clúster en un archivo tar. Cuando ejecutas gkectl diagnose snapshot, el comando ejecuta automáticamente gkectl diagnose cluster como parte del proceso, y los archivos de salida se colocan en una carpeta nueva en la instantánea llamada /diagnose-report.

Instantánea predeterminada

La configuración predeterminada del comando gkectl diagnose snapshot captura la siguiente información sobre el clúster:

  • Versión de Kubernetes.

  • Estado de los recursos de Kubernetes en los espacios de nombres de kube-system y gke-system: clúster, máquina, nodos, Services, Endpoints, ConfigMaps, ReplicaSets, CronJobs, Pods y los propietarios de esos Pods, incluidos Deployments, DaemonSets y StatefulSets

  • Estado del plano de control.

  • Los detalles sobre la configuración de cada nodo, incluidas las direcciones IP, las reglas de iptables, los puntos de activación, el sistema de archivos, las conexiones de red y los procesos en ejecución.

  • Registros del contenedor del nodo del plano de control del clúster de administrador, cuando el servidor de la API de Kubernetes no está disponible.

  • Información de vSphere, incluidos los objetos de VM y sus eventos basados en el grupo de recursos También recopila información sobre los objetos del centro de datos, del clúster, de la red y de Datastore asociados con las VM.

  • Información del balanceador de cargas de BIG-IP de F5, incluidos el servidor virtual, la dirección virtual, el grupo, el nodo y la supervisión

  • Registros del comando gkectl diagnose snapshot

  • Registros de trabajos preliminares.

  • Registros de contenedores en espacios de nombres según las situaciones.

  • Información sobre el vencimiento del certificado de Kubernetes del clúster de administrador en el archivo de instantánea /nodes/<admin_master_node_name>/sudo_kubeadm_certs_check-expiration.

  • Un archivo de índice HTML para todos los archivos de la instantánea.

  • De manera opcional, el archivo de configuración del clúster de administrador que se usa para instalar y actualizar el clúster con la marca --config.

Las credenciales, incluidas las de vSphere y F5, se quitan antes de crear el archivo tar.

Instantánea básica

En la versión 1.29 y posteriores de Google Distributed Cloud, hay una versión ligera de gkectl diagnose snapshot disponible para los clústeres de administrador y de usuario. La instantánea liviana acelera el proceso, ya que captura menos información sobre el clúster. Cuando agregas --scenario=lite al comando, solo se incluye la siguiente información en la instantánea:

  • Estado de los recursos de Kubernetes en los espacios de nombres de kube-system y gke-system: clúster, máquina, nodos, Services, Endpoints, ConfigMaps, ReplicaSets, CronJobs, Pods y los propietarios de esos Pods, incluidos Deployments, DaemonSets y StatefulSets

  • Registros del comando gkectl diagnose snapshot

Captura el estado del clúster

Si los comandos de gkectl diagnose cluster encuentran errores, debes capturar el estado del clúster y proporcionar la información a Atención al cliente de Cloud. Puedes capturar esta información con el comando gkectl diagnose snapshot.

gkectl diagnose snapshot tiene una marca opcional para --config. Además de recopilar información sobre el clúster, esta marca recopila el archivo de configuración de GKE alojado en VMware que se usó para crear o actualizar el clúster.

Captura el estado del clúster de administrador

Para capturar el estado del clúster de administrador, ejecuta el siguiente comando:

gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG --config

El parámetro --config es opcional:

Si hay un problema con una dirección IP virtual (VIP) en el clúster de destino, usa la marca --config para proporcionar el archivo de configuración del clúster de administrador y, así, proporcionar más información de depuración.

En la versión 1.29 y posteriores, puedes incluir --scenario=lite si no necesitas toda la información de la instantánea predeterminada.

El resultado incluye una lista de archivos y el nombre de un archivo tar, como se muestra en el siguiente resultado de ejemplo:

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.

Para extraer el archivo tar en un directorio, ejecuta el siguiente comando:

tar -zxf TAR_FILE_NAME --directory EXTRACTION_DIRECTORY_NAME

Reemplaza lo siguiente:

  • TAR_FILE_NAME: Es el nombre del archivo tar.

  • EXTRACTION_DIRECTORY_NAME: Es el directorio en el que deseas extraer el archivo tar.

Para ver la lista de archivos que produjo la instantánea, ejecuta los siguientes comandos:

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

Reemplaza NODE_NAME por el nombre del nodo cuyos archivos deseas ver.

Para ver los detalles de una operación en particular, abre uno de los archivos.

Especifica la clave SSH para el clúster de administrador

Cuando obtienes una instantánea del clúster de administrador, gkectl busca la clave SSH privada para este clúster de forma automática. También puedes especificar la clave de forma explícita mediante el parámetro --admin-ssh-key-path.

Sigue las instrucciones sobre cómo usar SSH para conectarte a un nodo del clúster y descargar las claves SSH.

En el comando gkectl diagnose snapshot, configura --admin-ssh-key-path como la ruta de acceso de la clave decodificada:

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

Captura el estado del clúster de usuario

Para capturar el estado de un clúster de usuario, ejecuta el siguiente comando:

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

En el siguiente resultado de ejemplo, se incluye una lista de archivos y el nombre de un archivo 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.

Situaciones de instantáneas

Las situaciones de instantáneas te permiten controlar la información que se incluye en una instantánea. Para especificar una situación, usa la marca --scenario. En la siguiente lista, se muestran los valores posibles:

  • system (predeterminado): Recopila instantáneas con registros en espacios de nombres del sistema compatibles.

  • all: Recopila instantáneas con registros en todos los espacios de nombres, incluidos los que define el usuario.

  • lite (1.29 y versiones posteriores): Recopila instantáneas solo con recursos de Kubernetes y registros gkectl. Se excluyen todos los demás registros, como los registros de contenedores y los registros de kernel de nodo.

Las situaciones de instantáneas disponibles varían según la versión de Google Distributed Cloud.

  • Versiones anteriores a 1.13: system, system-with-logs, all y all-with-logs

  • Versiones 1.13 a 1.28: system y all La situación system es la misma que la situación system-with-logs anterior. La situación all es la misma que la situación all-with-logs anterior.

  • Versiones 1.29 y posteriores: system, all y lite

Para crear una instantánea del clúster de administrador, no es necesario especificar una situación:

gkectl diagnose snapshot \
    --kubeconfig=ADMIN_CLUSTER_KUBECONFIG

Para crear una instantánea de un clúster de usuario mediante la situación system, ejecuta lo siguiente:

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

Para crear una instantánea de un clúster de usuario mediante la situación all, ejecuta lo siguiente:

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

Para crear una instantánea de un clúster de usuario mediante la situación lite, ejecuta lo siguiente:

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

Usa --log-since para limitar una instantánea

Puedes usar la marca --log-since para limitar la recopilación de registros a un período reciente. Por ejemplo, podrías recopilar solo los registros de los últimos dos días o de las últimas tres horas. De forma predeterminada, diagnose snapshot recopila todos los registros.

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

Reemplaza <var>DURATION</var> por un valor de tiempo como 120m48h.

Se aplican las siguientes consideraciones:

  • La marca --log-since solo es compatible con los registros kubectl y journalctl.
  • No se permiten marcas de comando como --log-since en la configuración de instantánea personalizada.

Realiza una ejecución de prueba de una instantánea

Puedes usar la marca --dry-run para mostrar las acciones que se realizarán y la configuración de la instantánea.

Para realizar una ejecución de prueba en el clúster de administrador, ingresa el siguiente comando:

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

Para realizar una ejecución de prueba en un clúster de usuario, ingresa el siguiente comando:

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

Usa una configuración de instantánea

Si estas dos situaciones (--scenario system o all) no satisfacen tus necesidades, puedes crear una instantánea personalizada si pasas un archivo de configuración de instantáneas con la marca --snapshot-config:

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

Genera una configuración de una instantánea

Puedes generar una configuración de una instantánea para una situación determinada si pasas las marcas --scenario y --dry-run. Por ejemplo, a fin de ver la configuración de la instantánea para la situación predeterminada (system) de un clúster de usuario, ingresa el siguiente comando:

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

El resultado es similar al siguiente ejemplo.

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

En el resultado, se muestra la siguiente información:

  • numOfParallelThreads: Cantidad de subprocesos paralelos que se usan para tomar instantáneas.

  • excludeWords: Lista de palabras que se excluirán de la instantánea (no distingue entre mayúsculas y minúsculas). Las líneas que contienen estas palabras se quitan de los resultados de la instantánea. “Password” siempre se excluye, ya sea que lo especifiques o no.

  • kubectlCommands: Lista de comandos de kubectl que se ejecutarán. Los resultados se guardan. Los comandos se ejecutan en los espacios de nombres correspondientes. En los comandos kubectl logs, todos los Pods y los contenedores de los espacios de nombres correspondientes se agregan de forma automática. Las expresiones regulares son compatibles con la especificación de espacios de nombres. Si no especificas un espacio de nombres, se supone que es el espacio de nombres default.

  • nodeCommands: Lista de comandos que se ejecutarán en los nodos correspondientes. Los resultados se guardan. Cuando no se especifica ningún nodo, se consideran todos los nodos del clúster de destino.

  • nodeFiles: Lista de archivos que se recopilarán de los nodos correspondientes. Se guardan los archivos. Cuando no se especifica ningún nodo, se consideran todos los nodos del clúster de destino.

  • seesawCommands: lista de comandos que se deben ejecutar para recopilar información del balanceador de cargas de Seesaw Los resultados se guardan si el clúster usa el balanceador de cargas de Seesaw.

  • seesawFiles: lista de archivos que se recopilarán para el balanceador de cargas de Seesaw.

  • nodeCollectors: un colector que se ejecuta para que los nodos de Cilium recopilen información de eBPF.

  • f5: una marca para habilitar la recopilación de información relacionada con el balanceador de cargas BIG-IP de F5.

  • vCenter: una marca para habilitar la recopilación de información relacionada con vCenter

  • prometheusRequests: Lista de solicitudes de Prometheus. Los resultados se guardan.

Sube instantáneas a un bucket de Cloud Storage

Para facilitar el mantenimiento de registros, el análisis y el almacenamiento, puedes subir todas las instantáneas de un clúster específico a un bucket de Cloud Storage. Esto es muy útil si necesitas asistencia del equipo de Atención al cliente de Cloud.

Antes de subir instantáneas a un bucket de Cloud Storage, revisa y completa los siguientes requisitos iniciales:

  • Habilita storage.googleapis.com en el proyecto host de flota. Aunque puedes usar un proyecto diferente, se recomienda el proyecto host de la flota.

    gcloud services enable --project=FLEET_HOST_PROJECT_ID storage.googleapis.com
    
  • Otorga la roles/storage.admin a la cuenta de servicio en su proyecto superior y pasa el archivo de claves JSON de la cuenta de servicio con el parámetro --service-account-key-file. Puedes usar cualquier cuenta de servicio, pero se recomienda usar la cuenta de servicio del registro de conexión. Consulta Cuentas de servicio para obtener más información.

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

    Reemplaza CONNECT_REGISTER_SERVICE_ACCOUNT por la cuenta de servicio del registro de conexión.

Una vez cumplidos estos requisitos, puedes subir la instantánea al bucket de Cloud Storage:

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

La marca --share-with puede aceptar una lista de nombres de cuentas de servicio. Reemplaza GOOGLE_SUPPORT_SERVICE_ACCOUNT por la cuenta de servicio de Atención al cliente de Cloud que proporciona este servicio, junto con cualquier otra cuenta de servicio que proporcione el equipo de Atención al cliente de Cloud.

Cuando usas la marca --upload, el comando busca en tu proyecto un bucket de almacenamiento que tenga un nombre que comience con “anthos-snapshot-”. Si existe ese bucket, el comando sube la instantánea a ese bucket. Si el comando no encuentra un bucket con un nombre que coincida, se crea un bucket nuevo con el nombre anthos-snapshot-UUID, en el que UUID es un identificador único universal de 32 dígitos.

Cuando usas la marca --share-with, no necesitas compartir el acceso al bucket de forma manual con la Atención al cliente de Cloud.

El siguiente resultado de ejemplo se muestra cuando subes una instantánea a un bucket de 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>

¿Qué sigue?

Si necesitas asistencia adicional, comunícate con Atención al cliente de Cloud.