Crea instantáneas para ayudar a diagnosticar problemas de clústeres

Cuando tienes un problema con uno de tus clústeres, puedes obtener ayuda en Atención al cliente de Cloud. Atención al cliente puede pedirte que tomes una “instantánea” del clúster, que puede usar para diagnosticar el problema. Una instantánea captura los archivos de configuración del clúster y del nodo, y empaqueta esa información en un solo archivo tar.

En este documento, se describe cómo crear instantáneas predeterminadas o instantáneas más personalizadas de un clúster. También se explica cómo crear instantáneas cuando un clúster experimenta errores particulares.

Instantáneas predeterminadas

En las siguientes secciones, se describe el contenido de una instantánea estándar y cómo crear una. Para obtener información sobre las instantáneas personalizadas, consulta la sección Instantáneas personalizadas.

¿Qué información contiene una instantánea predeterminada?

La instantánea de un clúster es un archivo tar de archivos de configuración y registros sobre el clúster. En específico, la configuración predeterminada del comando 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

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

  • Información sobre el entorno de ejecución de VM de Anthos y cualquier VM y recurso relacionado con las VMs que se ejecuten en tu clúster. Para obtener más información sobre lo que se recopila de forma predeterminada y cómo crear instantáneas específicas de VM, consulta Información de VM en instantáneas en este documento.

  • Registros del comando bmctl check cluster --snapshot

La información de credenciales de un clúster no se incluye en la instantánea predeterminada. Si Atención al cliente de Cloud solicita esa información, consulta Recupera información del clúster.

Para obtener una lista completa de la información recopilada cuando ejecutas el comando de instantáneas, consulta el archivo de configuración que se muestra en la sección El archivo de configuración en detalle. En este archivo de configuración, se muestran los comandos que se ejecutan cuando se toma una instantánea predeterminada.

Cómo crear una instantánea predeterminada

Con el comando bmctl check cluster, se toma una instantánea de un clúster. Puedes usar este comando para realizar cualquiera de las siguientes acciones:

  • Crear una instantánea y subirla de forma automática a un bucket de Cloud Storage.
  • Crear una instantánea de un clúster y guardar el archivo de la instantánea en la máquina local en la que ejecutas el comando.

Método 1: crea una instantánea predeterminada y súbela automáticamente al bucket de Cloud Storage

Para crear y subir una instantánea a un bucket de Cloud Storage, haz lo siguiente:

  1. Configura la API y la cuenta de servicio:

    1. Habilita la API de Cloud Storage dentro de tu proyecto de Google Cloud.
    2. Otorga una función storage.admin a la cuenta de servicio para que la cuenta de servicio pueda subir datos a Cloud Storage.
    3. Descarga la clave JSON para la cuenta de servicio.

    Consulta Habilita servicios de Google y cuentas de servicio para obtener más detalles.

  2. Ejecuta el siguiente comando de bmctl para crear y subir de forma automática una instantánea a un bucket de Cloud Storage:

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

    En el comando, reemplaza las siguientes entradas por información específica del entorno de tu clúster:

    • CLUSTER_NAME: el nombre del clúster del que deseas tomar una instantánea.
    • KUBECONFIG_PATH es la ruta al archivo kubeconfig del clúster de administrador. (La ruta de acceso al archivo kubeconfig es bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig de forma predeterminada. Sin embargo, si especificaste tu lugar de trabajo con la marca WORKSPACE_DIR, la ruta es WORKSPACE_DIR/CLUSTER_NAME/CLUSTER_NAME-kubeconfig).
    • BUCKET_NAME: el nombre de un bucket de Cloud Storage que te pertenece.
    • SERVICE_ACCOUNT_KEY_FILE: si no proporcionas la marca --service-account-key-file, bmctl intenta obtener la ruta al archivo de claves de la cuenta de servicio desde la variable de entorno GOOGLE_APPLICATION_CREDENTIALS.
  3. Crea una cuenta de servicio y comparte el acceso con la Atención al cliente de Cloud como se describe en Permite que la Asistencia de Google Cloud vea la instantánea de clúster que subiste.

Método no 2: Crea una instantánea predeterminada en una máquina local

Puedes capturar el estado de los clústeres creados con el siguiente comando .

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

Reemplaza lo siguiente:

  • CLUSTER_NAME: Es el nombre del clúster de destino.

  • KUBECONFIG_PATH es la ruta al archivo kubeconfig del clúster de administrador. (La ruta de acceso al archivo kubeconfig es bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig de forma predeterminada. Sin embargo, si especificaste tu lugar de trabajo con la marca WORKSPACE_DIR, la ruta es WORKSPACE_DIR/CLUSTER_NAME/CLUSTER_NAME-kubeconfig).

Este comando genera un archivo tar en tu máquina local. El nombre de este archivo tar tiene el formato snapshot-CLUSTER_NAME-TIMESTAMP.tar.gz, en el que TIMESTAMP indica la fecha y hora en que se creó el archivo. Este archivo tar incluye información de depuración relevante sobre los componentes y las máquinas del sistema de un clúster.

Cuando ejecutas este comando, se recopila información sobre los Pods de los siguientes espacios de nombres: gke-system, gke-connect, capi-system, capi-webhook-system, cert-manager y capi-kubeadm-bootstrap-system

Sin embargo, puedes ampliar el alcance de la información de diagnóstico recopilada mediante la marca --snapshot-scenario all. Esta marca aumenta el alcance de la instantánea de diagnóstico para incluir todos los Pods en un clúster:

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

Situaciones de instantáneas

El comando bmctl check cluster --snapshot admite dos situaciones. Para especificar una situación, usa la marca --scenario. En la siguiente lista, se muestran los valores posibles:

  • system: Recopila una instantánea de los componentes del sistema, incluidos sus registros.

  • all: Recopila una instantánea de todos los pods, incluidos sus registros.

Puedes usar cada una de las dos situaciones con un clúster de administrador o un clúster de usuario. Por ejemplo, para crear una instantánea del clúster de administrador mediante la situación system, ejecuta lo siguiente:

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

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

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

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

Cuando usas la marca --snapshot-dry-run, el comando no crea la instantánea. En cambio, muestra las acciones que realizará el comando de la instantánea y da como resultado un archivo de configuración de la instantánea. Para obtener información sobre el archivo de configuración de instantáneas, consulta Cómo crear una instantánea personalizada.

Para realizar una instantánea de prueba de validación en el clúster de administrador, ingresa el siguiente comando:

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

Para realizar una instantánea de prueba de validación en un clúster de usuario, ingresa el siguiente comando:

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

Obtener registros de un período en particular

Puedes usar la marca --since para recuperar registros de un período que te interese. De esta manera, puede crear instantáneas de registro más pequeñas y enfocadas que hayan ocurrido en los últimos segundos, horas o minutos.

Por ejemplo, con el siguiente comando de bmctl, se crea una instantánea del registro de las últimas tres horas:

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

Especifica un directorio en el que se guardará la instantánea de forma temporal

Puedes usar la marca --snapshot-temp-output-dir para especificar un directorio en el que se guarde la instantánea de forma temporal:

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

Si no especificas un directorio, la instantánea se guarda en el directorio /tmp de forma temporal. Se recomienda usar la opción --snapshot-temp-output-dir cuando, por ejemplo, se limita el espacio en el directorio /tmp predeterminado.

Suprime el registro de la consola

Puedes usar la marca --quiet para evitar que aparezcan mensajes de registro en la consola durante la ejecución de una instantánea. En su lugar, los registros de la consola se guardan en el archivo "bmctl_diagnose_snapshot.log" como parte de la instantánea.

Ejecuta el siguiente comando para evitar que los mensajes de registro aparezcan en la consola:

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

Instantáneas personalizadas

Te recomendamos crear una instantánea personalizada de un clúster por los siguientes motivos:

  • Para incluir más información sobre tu clúster de lo que se proporciona en la instantánea predeterminada.
  • Para excluir parte de la información que está en la instantánea predeterminada.

Cómo crear una instantánea personalizada

Crear una instantánea personalizada requiere el uso de un archivo de configuración de instantáneas. En los siguientes pasos, se explica cómo crear el archivo de configuración, modificarlo y usarlo para crear una instantánea personalizada de un clúster:

  1. Crea un archivo de configuración de instantánea mediante la ejecución del siguiente comando en tu clúster y escribe el resultado en un archivo:

    bmctl check cluster \
        --snapshot --snapshot-dry-run --cluster CLUSTER_NAME \
        --kubeconfig KUBECONFIG_PATH
    
  2. Define el tipo de información que deseas que aparezca en tu instantánea personalizada. Para ello, modifica el archivo de configuración de instantáneas que creaste en el paso 1. Por ejemplo, si deseas que la instantánea contenga información adicional, como por cuánto tiempo se ejecutó un nodo en particular, agrega el comando uptime de Linux a la sección relevante del archivo de configuración. En el siguiente fragmento de un archivo de configuración, se muestra cómo hacer que el comando de la instantánea proporcione información de uptime sobre el nodo 10.200.0.3. Esta información no aparece en una instantánea estándar.

    ...
    nodeCommands:
    - nodes:
      - 10.200.0.3
      commands:
      - uptime
    ...
    
  3. Una vez que hayas modificado el archivo de configuración para definir qué tipo de instantánea deseas, crea la instantánea personalizada mediante la ejecución del siguiente comando:

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

    La marca --snapshot-config dirige al comando bmctl para que use el contenido del archivo de configuración de instantáneas a fin de definir qué información aparece en la instantánea.

El archivo de configuración en detalle

En el siguiente archivo de configuración de instantáneas de muestra, se muestran los comandos y archivos estándar que se usan para crear una instantánea, pero puedes agregar más comandos y archivos cuando se necesita información de diagnóstico adicional:

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

Es probable que las siguientes entradas en tu archivo de configuración difieran de las que aparecen en el archivo de configuración de muestra anterior:

  • Las direcciones IP de los nodos en las secciones nodeCommands y nodeFiles
  • La ruta de acceso al nodeSSHKey del clúster

Campos en el archivo de configuración

Un archivo de configuración de instantáneas tiene el formato YAML. El archivo de configuración incluye los siguientes campos:

  • numOfParallelThreads: La rutina de instantánea suele ejecutar varios comandos. Contar con varios subprocesos paralelos ayuda a que la rutina se ejecute más rápido. Te recomendamos que establezcas numOfParallelThreads en 10, como se muestra en el archivo de configuración de muestra anterior. Si las instantáneas tardan demasiado, aumenta este valor.

  • excludeWords: La instantánea contiene una gran cantidad de datos para los nodos del clúster. Usa excludeWords para reducir los riesgos de seguridad cuando compartas la instantánea. Por ejemplo, excluye password para que no se puedan identificar las strings de contraseña correspondientes.

  • nodeCommands: En esta sección, se especifica la siguiente información:

    • nodes: Una lista de direcciones IP para los nodos del clúster del que deseas recopilar información. Para crear una instantánea cuando no se puede acceder al clúster de administrador, especifica al menos una dirección IP de nodo.

    • commands: Una lista de comandos (y argumentos) que se ejecutarán en cada nodo. El resultado de cada comando se incluye en la instantánea.

  • nodeFiles: En esta sección, se especifica la siguiente información:

    • nodes: Es una lista de direcciones IP de los nodos del clúster del que deseas recopilar archivos. Para crear una instantánea cuando no se puede acceder al clúster de administrador, especifica al menos una dirección IP de nodo.

    • files: Una lista de los archivos que se recuperarán de cada nodo. Cuando se encuentran los archivos especificados en un nodo, se incluyen en la instantánea.

  • nodeSSHKey: Es la ruta de acceso a tu archivo de claves SSH. Cuando no se puede acceder al clúster de administrador, este campo es obligatorio.

Crea instantáneas cuando experimentas errores específicos

Cómo crear una instantánea predeterminada durante las instalaciones o actualizaciones detenidas

Cuando se instalan o actualizan clústeres de administrador, híbridos o independientes, a veces, bmctl puede detenerse en puntos en los que se pueden ver los siguientes resultados:

  • Espera a que el clúster kubeconfig esté listo
  • Espera a que el clúster esté listo
  • Espera a que los grupos de nodos estén listos
  • Espera a que se complete la actualización

Sin embargo, si tienes una instalación o actualización detenida, puedes tomar una instantánea de un clúster si usas el clúster de arranque, mediante la ejecución del siguiente comando:

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

Cómo crear una instantánea personalizada durante las instalaciones o actualizaciones detenidas

En los siguientes pasos, se muestra cómo crear una instantánea personalizada de un clúster cuando se detiene una instalación o actualización:

  1. Recupera un archivo de configuración de instantáneas del clúster de tus archivos.

  2. Modifica el archivo de configuración de instantáneas para que la instantánea contenga la información que deseas.

  3. Ejecuta el siguiente comando para crear la instantánea personalizada:

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

Cómo crear una instantánea personalizada cuando no se pueda acceder al clúster de administrador

Cuando no se pueda acceder al clúster de administrador, puedes tomar una instantánea personalizada del clúster mediante la ejecución del siguiente comando:

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

En el comando, reemplaza las siguientes entradas por información específica del entorno de tu clúster:

  • CLUSTER_NAME: el nombre del clúster del que deseas tomar una instantánea.
  • SSH_KEY_FILE: Es la ruta de acceso al archivo de llave SSH del nodo.
  • NODE_x_IP_ADDRESS: la dirección IP del nodo del clúster sobre el que deseas obtener información.

Como alternativa, puedes enumerar las direcciones IP del nodo en líneas separadas:

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

Información de VM en instantáneas

Si usas el entorno de ejecución de VM de Anthos para crear y administrar máquinas virtuales (VMs) en clústeres de Anthos en equipos físicos, puedes recopilar información de diagnóstico relevante en las instantáneas. Las instantáneas son un recurso fundamental para diagnosticar y solucionar problemas con tus VMs.

Qué se recopila de forma predeterminada

Cuando creas una instantánea predeterminada, contiene la información sobre el entorno de ejecución de VM de Anthos y los recursos relacionados. El entorno de ejecución de VM de Anthos se incluye en clústeres de Anthos en equipos físicos y el recurso personalizado VMRuntime está disponible en los clústeres que ejecutan cargas de trabajo. Incluso si no habilitaste el entorno de ejecución de VM de Anthos, la instantánea contiene la descripción YAML del recurso personalizado VMRuntime.

Si habilitaste el entorno de ejecución de VM de Anthos, las instantáneas contienen información de estado y configuración de los recursos relacionados con las VMs (cuando los objetos están presentes) en tu clúster. Los recursos relacionados con las VMs incluyen objetos de Kubernetes, como Pods, Deployments, DaemonSets y ConfigMaps.

Objetos en el espacio de nombres vm-system

La información de estado y configuración de los siguientes objetos se encuentra en kubectlCommands/vm-system en la instantánea generada:

  • KubeVirt
  • VirtualMachineType
  • VMHighAvailabilityPolicy

Objetos en otros espacios de nombres

Cuando creas una VM (VirtualMachine), puedes especificar el espacio de nombres. Si no especificas un espacio de nombres, la VM obtiene el espacio de nombres default. Los otros objetos de esta sección, como VirtualMachineInstance, están vinculados al espacio de nombres de la VM correspondiente.

La información de estado y configuración de los siguientes objetos se encuentra en kubectlCommands/VM_NAMESPACE en la instantánea generada. Si no configuraste un espacio de nombres específico para tu VM, la información se encuentra en kubectlCommands/default:

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

Objetos sin espacios de nombres

A los siguientes objetos no se les asigna un espacio de nombres, por lo que su información correspondiente se encuentra directamente en kubectlCommands en la instantánea generada:

  • VMRuntime
  • DataVolume
  • CDI
  • GPUAllocation

Usa un archivo de configuración de instantánea para capturar solo los detalles de la VM

Si diagnosticas problemas específicos de las VMs, puedes usar un archivo de configuración de instantánea para restringir la información recopilada solo a los detalles relacionados con las VMs y adaptar la información de VM recopilada.

En el siguiente archivo de configuración de instantánea, se ilustra cómo puedes construir una instantánea específica de la VM. Puedes incluir comandos adicionales a fin de recopilar más información para la instantánea.

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

Para obtener más información sobre el uso de archivos de configuración de instantánea, consulta Instantáneas personalizadas en este documento.