Creare snapshot per contribuire a diagnosticare i problemi del cluster

In caso di problemi con uno dei tuoi cluster, puoi rivolgerti all'assistenza clienti Google Cloud. L'assistenza clienti potrebbe chiederti di acquisire uno "snapshot" del cluster, che potrà utilizzare per diagnosticare il problema. Uno snapshot acquisisce i file di configurazione del cluster e dei nodi e le informazioni vengono pacchettizzate in un unico file tar.

Questo documento descrive come creare snapshot predefiniti o più personalizzati di un cluster. Inoltre, spiega come creare snapshot quando un cluster presenta errori specifici.

Se hai bisogno di ulteriore assistenza, contatta l'assistenza clienti Google Cloud.

Istantanee predefinite

Le sezioni seguenti descrivono i contenuti di uno snapshot standard e come crearne uno. Per informazioni sugli snapshot personalizzati, consulta la sezione sugli snapshot personalizzati.

Quali informazioni contiene un'istantanea predefinita?

Lo snapshot di un cluster è un file tar di file di configurazione e log relativi al cluster. Nello specifico, la configurazione predefinita del comando acquisisce le seguenti informazioni sul cluster:

  • Versione di Kubernetes.

  • Stato delle risorse Kubernetes negli spazi dei nomi kube-system e gke-system: cluster, macchine, nodi, servizi, endpoint, ConfigMap, ReplicaSet, CronJob, pod e i relativi proprietari, inclusi deployment, DaemonSet e StatefulSet.

  • Dettagli sulla configurazione di ciascun nodo, inclusi indirizzi IP, regole iptables, punti di montaggio, file system, connessioni di rete e processi in esecuzione.

  • Informazioni sul runtime delle VM su GDC e su eventuali VM e risorse correlate alle VM in esecuzione nel cluster. Per ulteriori informazioni su cosa viene raccolto per impostazione predefinita e su come creare snapshot specifici per le VM, consulta Informazioni sulle VM negli snapshot in questo documento.

  • Log del comando bmctl check cluster --snapshot.

Le informazioni sulle credenziali di un cluster non sono incluse nello snapshot predefinito. Se il assistenza clienti Google Cloud richiede queste informazioni, consulta la sezione Recupero delle informazioni sui cluster.

Per un elenco completo delle informazioni raccolte quando esegui il comando di snapshot, consulta la sezione successiva relativa al file di configurazione in dettaglio. Questo file di configurazione mostra i comandi che vengono eseguiti quando viene acquisita una snapshot predefinita.

Crea uno snapshot predefinito

Il comando bmctl check cluster acquisisce uno snapshot di un cluster. Puoi utilizzare questo comando per eseguire una delle seguenti azioni:

  • Creare uno snapshot e caricarlo automaticamente in un bucket Cloud Storage.
  • Crea uno snapshot di un cluster e salva il file dello snapshot sulla macchina locale su cui stai eseguendo il comando.

Metodo 1: crea uno snapshot predefinito e caricalo automaticamente nel bucket Cloud Storage

Per creare e caricare uno snapshot in un bucket Cloud Storage:

  1. Configura l'API e l'account di servizio come descritto in Configurare un account di servizio in grado di accedere a un bucket Cloud Storage.

    Si tratta di un passaggio da eseguire una sola volta.

  2. Esegui il seguente comando bmctl per creare e caricare automaticamente uno snapshot in un bucket Cloud Storage:

    bmctl check cluster --snapshot --cluster=CLUSTER_NAME \
        --admin-kubeconfig=ADMIN_KUBECONFIG \
        --service-account-key-file SA_KEY_FILE
    

    Sostituisci le seguenti voci con informazioni specifiche per il tuo ambiente in cluster:

    • CLUSTER_NAME: il nome del cluster di cui vuoi eseguire lo snapshot.
    • ADMIN_KUBECONFIG: il percorso del file kubeconfig del cluster di amministrazione.
    • SA_KEY_FILE: il percorso del file della chiave JSON scaricato per l'account di servizio creato nel passaggio precedente. Se non utilizzi il flag --service-account-key-file, il comando utilizza le credenziali associate alla variabile di ambiente GOOGLE_APPLICATION_CREDENTIALS. La specifica esplicita delle credenziali dell'account di servizio con il flag ha la precedenza.

    Questo comando genera un file tar dello snapshot e lo salva localmente. Quando l'account di servizio è configurato correttamente, il comando carica anche il file tar dello snapshot in un bucket di Cloud Storage. Il comando cerca nel progetto un bucket di archiviazione con un nome che inizia con "anthos-snapshot-". Se esiste un bucket di questo tipo, il comando carica lo snapshot in quel bucket. Se il comando non trova un bucket con un nome corrispondente, crea un nuovo bucket con il nome anthos-snapshot-UUID, dove UUID è un identificatore univoco universale di 32 cifre.

  3. Condividi l'accesso con l'assistenza clienti Google Cloud come descritto in Consentire all'assistenza clienti Google Cloud di visualizzare lo snapshot del cluster caricato.

Metodo 2: crea uno snapshot predefinito solo sulla macchina locale

Utilizza il flag --local per assicurarti che lo snapshot del cluster venga salvato solo localmente. Puoi acquisire lo stato dei cluster creati con il seguente comando:

bmctl check cluster --snapshot --cluster=CLUSTER_NAME \
    --admin-kubeconfig=ADMIN_KUBECONFIG --local

Sostituisci quanto segue:

  • CLUSTER_NAME: il nome del cluster di destinazione.

  • ADMIN_KUBECONFIG: il percorso del file kubeconfig del cluster di amministrazione.

Questo comando genera un file tar sulla tua macchina locale. Il nome di questo file tar è nel formatosnapshot-CLUSTER_NAME-TIMESTAMP.tar.gz, dove TIMESTAMP indica la data e l'ora di creazione del file. Questo file tar include informazioni di debug pertinenti sui componenti di sistema e sulle macchine di un cluster.

Quando esegui questo comando, vengono raccolte informazioni sui pod dai seguenti spazi dei nomi: gke-system, gke-connect, capi-system, capi-webhook-system, cert-manager e capi-kubeadm-bootstrap-system

Tuttavia, puoi ampliare l'ambito delle informazioni diagnostiche raccolte utilizzando il flag --snapshot-scenario all. Questo flag aumenta l'ambito dello snapshot diagnostico in modo da includere tutti i pod di un cluster:

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

Scenari di snapshot

Il comando bmctl check cluster --snapshot supporta due scenari. Per specificare un scenario, utilizza il flag --scenario. Di seguito è riportato l'elenco dei possibili valori:

  • system: raccogli uno snapshot dei componenti di sistema, inclusi i relativi log.

  • all: acquisisci uno snapshot di tutti i pod, inclusi i relativi log.

Puoi utilizzare ciascuno dei due scenari con un cluster di amministrazione o un cluster di utenti. Il seguente esempio crea uno snapshot del cluster di amministrazione utilizzando lo scenario system:

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

L'esempio seguente crea uno snapshot di un cluster utente utilizzando lo scenario all:

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

Eseguire una prova di uno snapshot

Quando utilizzi il flag --snapshot-dry-run, il comando non crea uno snapshot. Mostra invece le azioni che il comando snapshot eseguirà e genera un file di configurazione dello snapshot. Per informazioni sul file di configurazione dell'istantanea, consulta Come creare uno snapshot personalizzato.

Per eseguire uno snapshot di prova sul cluster di amministrazione, inserisci il seguente comando:

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

Per eseguire uno snapshot di prova su un cluster utente, inserisci il seguente comando:

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

Recuperare i log di un determinato periodo

Puoi utilizzare il flag --since per recuperare i log di un periodo di tempo che ti interessa particolarmente. In questo modo, puoi creare istantanee più piccole e mirate dei log che si sono verificati negli ultimi secondi, minuti o ore.

Ad esempio, il seguente comando bmctl crea uno snapshot dei log che si sono verificati nelle ultime tre ore:

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

Specifica una directory in cui lo snapshot viene salvato temporaneamente

Puoi utilizzare il flag --snapshot-temp-output-dir per specificare una directory in cui lo snapshot viene salvato temporaneamente:

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

Se non specifichi una directory, lo snapshot viene salvato temporaneamente nella directory /tmp. L'utilizzo dell'opzione --snapshot-temp-output-dir è consigliabile, ad esempio, quando lo spazio è limitato nella directory /tmp predefinita.

Eliminare il logging della console

Puoi utilizzare il flag --quiet per impedire la visualizzazione dei messaggi di log nella console durante l'esecuzione di uno snapshot. I log della console vengono invece salvati nel file "bmctl_diagnose_snapshot.log" nell'ambito dello snapshot.

Esegui questo comando per impedire la visualizzazione dei messaggi di log nella console:

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

Snapshot personalizzati

Potresti voler creare uno snapshot personalizzato di un cluster per i seguenti motivi:

  • Per includere più informazioni sul cluster rispetto a quelle fornite nell'istantanea predefinita.
  • Per escludere alcune informazioni presenti nello snapshot predefinito.

Creare uno snapshot personalizzato

La creazione di uno snapshot personalizzato richiede l'utilizzo di un file di configurazione dello snapshot. I passaggi riportati di seguito spiegano come creare il file di configurazione, modificarlo e utilizzarlo per creare uno snapshot personalizzato di un cluster:

  1. Crea un file di configurazione dello snapshot eseguendo il seguente comando sul tuo cluster e scrivendo l'output in un file:

    bmctl check cluster \
        --snapshot --snapshot-dry-run --cluster CLUSTER_NAME \
        --kubeconfig KUBECONFIG_PATH
    
  2. Definisci il tipo di informazioni che vuoi visualizzare nell'istantanea personalizzata. A tale scopo, modifica il file di configurazione dell'istantanea creato nel passaggio 1. Ad esempio, se vuoi che lo snapshot contenga informazioni aggiuntive, ad esempio il tempo di esecuzione di un determinato nodo, aggiungi il comando uptime di Linux alla sezione pertinente del file di configurazione.

    Il seguente snippet di un file di configurazione mostra come fare in modo che il comando uptime fornisca informazioni sul nodo 10.200.0.3. Queste informazioni non vengono visualizzate in uno snapshot standard.

    ...
    nodeCommands:
    - nodes:
      - 10.200.0.3
      commands:
      - uptime
    ...
    
  3. Dopo aver modificato il file di configurazione per definire il tipo di snapshot che vuoi, crea lo snapshot personalizzato eseguendo il seguente comando:

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

    Il flag --snapshot-config indica al comando bmctl di utilizzare i contenuti del file di configurazione dello snapshot per definire le informazioni visualizzate nello snapshot.

Il file di configurazione in dettaglio

Il seguente file di configurazione di snapshot di esempio mostra i comandi e i file standard utilizzati per creare uno snapshot, ma puoi aggiungere altri comandi e file se sono necessarie ulteriori informazioni di diagnostica:

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

È probabile che le seguenti voci nel file di configurazione siano diverse da quelle visualizzate nel file di configurazione di esempio precedente:

  • Gli indirizzi IP dei nodi nelle sezioni nodeCommands e nodeFiles
  • Il percorso del file nodeSSHKey del cluster

Campi nel file di configurazione

Un file di configurazione dello snapshot è in formato YAML. Il file di configurazione include i seguenti campi:

  • numOfParallelThreads: in genere la routine di snapshot esegue numerosi comandi. Più thread paralleli consentono di eseguire la routine più velocemente. Ti consigliamo di impostare numOfParallelThreads su 10 come mostrato nel precedente file di configurazione di esempio. Se gli istantanei richiedono troppo tempo, aumenta questo valore.

  • excludeWords: lo snapshot contiene una grande quantità di dati per i nodi del cluster. Utilizza excludeWords per ridurre i rischi per la sicurezza quando condividi lo snapshot. Ad esempio, escludi password in modo che le stringhe di password corrispondenti non possano essere identificate.

  • nodeCommands: questa sezione specifica le seguenti informazioni:

    • nodes: un elenco di indirizzi IP dei nodi del cluster da cui vuoi raccogliere informazioni. Per creare uno snapshot quando il cluster di amministrazione non è raggiungibile, specifica almeno un indirizzo IP del nodo.

    • commands: un elenco di comandi (e argomenti) da eseguire su ogni nodo. L'output di ogni comando è incluso nello snapshot.

  • nodeFiles: questa sezione specifica le seguenti informazioni:

    • nodes: un elenco di indirizzi IP dei nodi del cluster da cui vuoi raccogliere i file. Per creare uno snapshot quando il cluster di amministrazione non è raggiungibile, specifica almeno un indirizzo IP del nodo.

    • files: un elenco di file da recuperare da ogni nodo. Quando i file specificati vengono trovati su un nodo, vengono inclusi nell'istantanea.

  • nodeSSHKey: percorso del file della chiave SSH. Quando il cluster di amministrazione è irraggiungibile, questo campo è obbligatorio.

Creare snapshot in caso di errori specifici

Per creare correttamente uno snapshot quando si verificano determinati eventi, ad esempio un upgrade in stallo, potrebbero essere necessari passaggi o parametri di comando aggiuntivi.

Creare uno snapshot predefinito durante installazioni o upgrade in stallo

Durante l'installazione o l'upgrade di cluster amministrativi, ibridi o autonomi, bmctl a volte può bloccarsi in punti in cui sono visibili i seguenti output:

  • In attesa che il file kubeconfig del cluster sia pronto.
  • In attesa che il cluster sia pronto.
  • In attesa che i pool di nodi siano pronti.
  • In attesa del completamento dell'upgrade.

Se si verifica un'installazione o un upgrade in stallo, puoi acquisire uno snapshot di un cluster utilizzando il cluster di bootstrap, come mostrato nell'esempio seguente:

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

Creare uno snapshot personalizzato durante installazioni o upgrade in stallo

I passaggi riportati di seguito mostrano come creare uno snapshot personalizzato di un cluster quando un'installazione o un upgrade è in stallo:

  1. Recupera un file di configurazione dell'istantanea del cluster dai tuoi archivi.

  2. Modifica il file di configurazione dello snapshot in modo che contenga le informazioni che ti interessano.

  3. Crea lo snapshot personalizzato eseguendo il seguente comando:

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

Creare uno snapshot personalizzato quando il cluster di amministrazione non è raggiungibile

Quando il cluster di amministrazione non è raggiungibile, puoi acquisire uno snapshot personalizzato del cluster eseguendo il seguente comando:

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

Nel comando, sostituisci le seguenti voci con informazioni specifiche per il tuo ambiente cluster:

  • CLUSTER_NAME: il nome del cluster di cui vuoi eseguire lo snapshot.
  • SSH_KEY_FILE: il percorso del file della chiave SSH del nodo.
  • NODE_x_IP_ADDRESS: l'indirizzo IP di un nodo del cluster su cui vuoi informazioni.

In alternativa, puoi elencare gli indirizzi IP dei nodi su righe separate:

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

Informazioni sulle VM negli snapshot

Se utilizzi il runtime VM su GDC per creare e gestire macchine virtuali (VM) su Google Distributed Cloud, puoi raccogliere informazioni di diagnostica pertinenti negli snapshot. Gli snapshot sono una risorsa fondamentale per diagnosticare e risolvere i problemi relativi alle VM.

Che cosa viene raccolto per impostazione predefinita

Quando crei uno snapshot predefinito, questo contiene le informazioni sul runtime delle VM su GDC e sulle risorse correlate. Il runtime VM su GDC è incluso in Google Distributed Cloud e la risorsa personalizzata VMRuntime è disponibile sui cluster che eseguono i workload. Anche se non hai attivato il runtime delle VM su GDC, lo snapshot contiene comunque la descrizione YAML della risorsa personalizzata VMRuntime.

Se hai attivato il runtime delle VM su GDC, gli snapshot contengono informazioni sullo stato e sulla configurazione delle risorse correlate alle VM (se gli oggetti sono presenti) nel cluster. Le risorse correlate alle VM includono oggetti Kubernetes, come pod, deployment, DaemonSet e ConfigMap.

Oggetti nello spazio dei nomi vm-system

Le informazioni sullo stato e sulla configurazione dei seguenti oggetti si trovano in kubectlCommands/vm-system nello snapshot generato:

  • KubeVirt
  • VirtualMachineType
  • VMHighAvailabilityPolicy

Oggetti in altri spazi dei nomi

Quando crei una VM (VirtualMachine), puoi specificare lo spazio dei nomi. Se non specifichi uno spazio dei nomi, la VM ottiene lo spazio dei nomi default. Gli altri oggetti in questa sezione, come VirtualMachineInstance, sono tutti associati allo spazio dei nomi della VM corrispondente.

Le informazioni sullo stato e sulla configurazione dei seguenti oggetti si trovano in kubectlCommands/VM_NAMESPACE nello snapshot generato. Se non hai impostato uno spazio dei nomi specifico per la VM, le informazioni si trovano in kubectlCommands/default:

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

Oggetti senza spazio dei nomi

I seguenti oggetti non sono nel namespace, pertanto le informazioni corrispondenti si trovano direttamente in kubectlCommands nell'istantanea generata:

  • VMRuntime
  • DataVolume
  • CDI
  • GPUAllocation

Utilizzare un file di configurazione dello snapshot per acquisire solo i dettagli della VM

Se stai diagnosticando problemi specifici per le VM, puoi utilizzare un file di configurazione dello snapshot per limitare le informazioni raccolte solo ai dettagli relativi alle VM e personalizzare le informazioni raccolte sulle VM.

Il seguente file di configurazione dello snapshot illustra come creare uno snapshot specifico per la VM. Puoi includere comandi aggiuntivi per raccogliere più informazioni per lo snapshot.

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

Per ulteriori informazioni sull'utilizzo dei file di configurazione degli snapshot, consulta la sezione Snapshot personalizzati di questo documento.

Passaggi successivi

Se hai bisogno di ulteriore assistenza, contatta l'assistenza clienti Google Cloud.