Crea snapshot per diagnosticare i problemi del cluster

Se riscontri un problema con uno dei tuoi cluster, puoi ricevere assistenza dall'assistenza clienti Google Cloud. L'assistenza clienti potrebbe chiederti di effettuare un'"istantanea" del cluster, che potrebbe utilizzare per diagnosticare il problema. Uno snapshot acquisisce i file di configurazione di cluster e nodi e pacchettizza queste informazioni in un unico file tar.

Questo documento descrive come creare snapshot predefiniti o snapshot più personalizzati di un cluster. Spiega inoltre come creare snapshot quando si verificano errori particolari in un cluster.

Snapshot predefiniti

Le seguenti sezioni descrivono come funziona uno snapshot standard e come crearne uno. Per informazioni sugli snapshot personalizzati, consulta la sezione Snapshot personalizzati.

Quali informazioni contiene uno snapshot predefinito?

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

  • Versione di Kubernetes.

  • Stato delle risorse Kubernetes negli spazi dei nomi kube-system e gke-system: cluster, macchina, nodi, servizi, endpoint, ConfigMap, ReplicaSet, CronJobs, pod e proprietari di tali pod, tra cui Deployment, DaemonSet e StatefulSet.

  • Dettagli su ogni configurazione dei nodi, tra cui indirizzi IP, regole iptables, punti di montaggio, file system, connessioni di rete ed processi in esecuzione.

  • Log del comando bmctl check cluster --snapshot.

Le informazioni sulle credenziali di un cluster non sono incluse nello snapshot predefinito. Se l'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 il file di configurazione mostrato nella sezione Il file di configurazione, in dettaglio. Questo file di configurazione mostra i comandi che vengono eseguiti durante l'esecuzione di uno snapshot predefinito.

Come creare 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 di snapshot sulla macchina locale su cui stai eseguendo il comando.

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

Per creare e caricare uno snapshot in un bucket Cloud Storage, segui questi passaggi:

  1. Per configurare l'API e l'account di servizio:

    1. Abilitare l'API Cloud Storage all'interno del tuo progetto Google Cloud.
    2. Concedi un ruolo storage.admin all'account di servizio in modo che possa caricare i dati in Cloud Storage.
    3. Scarica la chiave JSON dell'account di servizio.

    Per maggiori dettagli, consulta Attivare gli account di servizi e servizi Google.

  2. Esegui il comando bmctl seguente per creare e caricare automaticamente uno snapshot in 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]
    

    Nel comando sostituisci le seguenti voci con informazioni specifiche per l'ambiente del cluster:

    • CLUSTER_NAME: il nome del cluster di cui vuoi acquisire uno snapshot.
    • KUBECONFIG_PATH: il percorso del file kubeconfig del cluster di amministrazione. (Il percorso del file kubeconfig è bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig per impostazione predefinita. Tuttavia, se hai specificato l'area di lavoro con il flag WORKSPACE_DIR, il percorso è WORKSPACE_DIR/CLUSTER_NAME/CLUSTER_NAME-kubeconfig.
    • BUCKET_NAME: il nome di un bucket Cloud Storage di tua proprietà.
    • SERVICE_ACCOUNT_KEY_FILE: se non fornisci il flag --service-account-key-file, bmctl cerca di ottenere il percorso del file della chiave dell'account di servizio dalla variabile di ambiente GOOGLE_APPLICATION_CREDENTIALS.
  3. Crea un account di servizio e condividi l'accesso con l'assistenza clienti Google Cloud come descritto in Consentire all'assistenza di Google Cloud di visualizzare lo snapshot del cluster caricato.

Metodo 2: crea uno snapshot predefinito sulla macchina locale

Puoi acquisire lo stato dei cluster che hai creato con questo comando:

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

Sostituisci quanto segue:

  • CLUSTER_NAME: il nome del cluster di destinazione.

  • KUBECONFIG_PATH: il percorso del file kubeconfig del cluster di amministrazione. (Il percorso del file kubeconfig è bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig per impostazione predefinita. Tuttavia, se hai specificato l'area di lavoro con il flag WORKSPACE_DIR, il percorso è WORKSPACE_DIR/CLUSTER_NAME/CLUSTER_NAME-kubeconfig.

Questo comando restituisce un file tar alla tua macchina locale. Il nome di questo file tar è nel formato snapshot-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 sulle componenti e sulle macchine del sistema del 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 di diagnostica raccolte utilizzando il flag --snapshot-scenario all. Questo flag aumenta l'ambito dello snapshot diagnostico in modo da includere tutti i pod in un cluster:

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

Scenari relativi allo snapshot

Il comando bmctl check cluster --snapshot supporta due scenari. Per specificare uno scenario, utilizza il flag --scenario. Il seguente elenco mostra i possibili valori:

  • system: raccogli un'istantanea dei componenti di sistema, inclusi i log.

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

Puoi utilizzare ognuno dei due scenari con un cluster di amministrazione o un cluster utente. Ad esempio, per creare 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

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

Esecuzione di una prova per uno snapshot

Quando utilizzi il flag --snapshot-dry-run, il comando non crea uno snapshot. Mostra invece le azioni eseguite dal comando snapshot e genera un file di configurazione snapshot. Per informazioni sul file di configurazione degli snapshot, consulta la pagina Come creare uno snapshot personalizzato.

Per eseguire uno snapshot di prova nel cluster di amministrazione, inserisci questo 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 questo comando:

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

Snapshot personalizzati

Ti consigliamo di creare uno snapshot personalizzato di un cluster per i seguenti motivi:

  • Per includere più informazioni sul cluster rispetto a quelle fornite nello snapshot predefinito.
  • Per escludere alcune informazioni contenute nello snapshot predefinito.

Come creare uno snapshot personalizzato

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

  1. Crea un file di configurazione di uno snapshot eseguendo il comando seguente sul 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 da visualizzare nella tua istantanea personalizzata. Per farlo, modifica il file di configurazione snapshot creato nel passaggio 1. Ad esempio, se vuoi che lo snapshot contenga informazioni aggiuntive, come a quanto tempo è in esecuzione un determinato nodo, aggiungi il comando Linux uptime alla sezione pertinente del file di configurazione. Il seguente snippet di un file di configurazione mostra come fornire al comando snapshot l'elemento uptime contenente 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 lo snapshot desiderato, crea lo snapshot personalizzato eseguendo il comando seguente:

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

    Il flag --snapshot-config indica al comando bmctl di usare 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 mostra i comandi e i file standard utilizzati per la creazione di uno snapshot, ma puoi aggiungerne altri quando 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

Le seguenti voci nel file di configurazione probabilmente sono diverse da quelle visualizzate nel file di configurazione di esempio riportato sopra:

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

Campi nel file di configurazione

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

  • numOfParallelThreads: la routine snapshot in genere esegue molti comandi. Più thread paralleli aiutano la routine a essere più veloce. Ti consigliamo di impostare numOfParallelThreads su 10 come mostrato nel file di configurazione di esempio precedente. Se gli snapshot richiedono troppo tempo, aumenta questo valore.

  • excludeWords: lo snapshot contiene una grande quantità di dati per i nodi del cluster. Usa excludeWords per ridurre i rischi per la sicurezza quando condividi l'istantanea. Ad esempio, escludi password in modo che non sia possibile identificare le stringhe di password corrispondenti.

  • nodeCommands: in questa sezione sono specificate le seguenti informazioni:

    • nodes: un elenco di indirizzi IP per i 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 ciascun nodo. L'output di ogni comando è incluso nello snapshot.

  • nodeFiles: in questa sezione sono specificate le seguenti informazioni:

    • nodes: un elenco di indirizzi IP di nodi 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 rilevati su un nodo, vengono inclusi nello snapshot.

  • nodeSSHKey: percorso al file della chiave SSH. Quando il cluster di amministrazione non è raggiungibile, questo campo è obbligatorio.

Creazione di snapshot in caso di errori specifici

Come creare uno snapshot predefinito durante installazioni o upgrade bloccati

Quando installi o esegui l'upgrade dei cluster di amministrazione, ibridi o autonomi, a volte bmctl può bloccarsi in punti in cui possono essere visualizzati i seguenti output:

  • In attesa che il cluster kubeconfig 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 riscontri un'installazione o un upgrade bloccati, puoi comunque eseguire uno snapshot di un cluster, utilizzando il cluster Bootstrap, eseguendo il comando seguente:

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

Come creare uno snapshot personalizzato durante installazioni o upgrade bloccati

I seguenti passaggi mostrano come creare uno snapshot personalizzato di un cluster quando un'installazione o un upgrade è bloccato:

  1. Recupera dagli archivi un file di configurazione di snapshot del cluster.

  2. Modifica il file di configurazione degli snapshot in modo che contenga le informazioni desiderate.

  3. Crea lo snapshot personalizzato eseguendo il comando seguente:

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

Come creare uno snapshot personalizzato quando il cluster di amministrazione non è raggiungibile

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

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 l'ambiente del cluster:

  • CLUSTER_NAME: il nome del cluster di cui vuoi acquisire uno 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 di 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
  ...