Snapshots zur Diagnose von Clusterproblemen erstellen

Wenn bei einem Ihrer Cluster ein Problem auftritt, können Sie Hilfe von Cloud Customer Care erhalten. Customer Care fordert Sie möglicherweise auf, einen Snapshot des Clusters zu erstellen, mit dem das Problem diagnostiziert werden kann. Ein Snapshot erfasst Cluster- und Knotenkonfigurationsdateien und verpackt diese Informationen in einer einzelnen TAR-Datei.

In diesem Dokument wird beschrieben, wie Sie Standard-Snapshots oder benutzerdefinierte Snapshots eines Clusters erstellen. Außerdem wird erläutert, wie Sie Snapshots erstellen, wenn bei einem Cluster bestimmte Fehler auftreten.

Standard-Snapshots

In den folgenden Abschnitten wird beschrieben, was ein Standard-Snapshot ist und wie Sie einen erstellen. Informationen zu benutzerdefinierten Snapshots finden Sie im Abschnitt Benutzerdefinierte Snapshots.

Welche Informationen enthält ein Standard-Snapshot?

Der Snapshot eines Clusters ist eine TAR-Datei mit Konfigurationsdateien und Logs zum Cluster. Die Standardkonfiguration des Befehls erfasst insbesondere die folgenden Informationen zu Ihrem Cluster:

  • Kubernetes-Version

  • Status von Kubernetes-Ressourcen in den Namespaces "kube-system" und "gke-system": Cluster, Maschine, Knoten, Services, Endpunkte, ConfigMaps, ReplicaSets, CronJobs, Pods und die Inhaber dieser Pods, einschließlich Deployments, DaemonSets und StatefulSets

  • Details zu jeder Knotenkonfiguration, einschließlich IP-Adressen, iptables-Regeln, Bereitstellungspunkten, Dateisystem, Netzwerkverbindungen und ausgeführten Prozessen

  • Logs aus dem Befehl bmctl check cluster --snapshot

Die Anmeldedaten eines Clusters sind nicht im Standard-Snapshot enthalten. Wenn Cloud Customer Care diese Informationen anfordert, finden Sie entsprechende Informationen unter Clusterinformationen abrufen.

Eine umfassende Liste der Informationen, die Sie beim Ausführen des Snapshot-Befehls erfassen, finden Sie im Snapshot unter Konfigurationsdatei im Detail. Diese Konfigurationsdatei zeigt, welche Befehle ausgeführt werden, wenn ein Standard-Snapshot erstellt wird.

Standard-Snapshot erstellen

Mit dem Befehl bmctl check cluster wird ein Snapshot eines Clusters erstellt. Mit diesem Befehl können Sie eine der folgenden Aktionen ausführen:

  • Snapshot erstellen und diesen Snapshot automatisch in einen Cloud Storage-Bucket hochladen
  • Snapshot eines Clusters erstellen und die Snapshot-Datei auf dem lokalen Rechner speichern, auf dem Sie den Befehl ausführen

Methode 1: Standard-Snapshot erstellen und automatisch in den Cloud Storage-Bucket hochladen

So erstellen Sie einen Snapshot und laden ihn in einen Cloud Storage-Bucket hoch:

  1. Richten Sie die API und das Dienstkonto ein:

    1. Aktivieren Sie die Cloud Storage API in Ihrem Google Cloud-Projekt.
    2. Erstellen Sie ein Dienstkonto, mit dem der Befehl bmctl check cluster --snapshot automatisch einen Cluster-Snapshot in einen Cloud Storage-Bucket hochlädt.
    3. Weisen Sie dem Dienstkonto die Rolle storage.admin zu, damit es Daten in Cloud Storage hochladen kann.
    4. Laden Sie den JSON-Schlüssel für das Dienstkonto herunter.

    Weitere Informationen finden Sie unter Google-Dienste und -Dienstkonten aktivieren.

  2. Führen Sie den folgenden bmctl-Befehl aus, um einen Snapshot zu erstellen und automatisch in einen Cloud Storage-Bucket hochzuladen:

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

    Ersetzen Sie im Befehl die folgenden Einträge durch Informationen, die für Ihre Clusterumgebung spezifisch sind:

    • CLUSTER_NAME: den Namen des Clusters, von dem Sie einen Snapshot erstellen möchten.
    • KUBECONFIG_PATH gibt den Pfad zur Datei kubeconfig des Administratorclusters an. (Der Pfad zur kubeconfig-Datei lautet normalerweise bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig. Wenn Sie jedoch Ihren Arbeitsbereich mit dem Flag WORKSPACE_DIR angegeben haben, lautet der Pfad WORKSPACE_DIR/CLUSTER_NAME/CLUSTER_NAME-kubeconfig).
    • BUCKET_NAME: den Namen eines Cloud Storage-Buckets, der Ihnen gehört.
    • SERVICE_ACCOUNT_KEY_FILE_PATH: Wenn Sie das Flag --service-account-key-file nicht angeben, versucht bmctl, den Pfad zur Schlüsseldatei des Dienstkontos aus der Umgebungsvariablen GOOGLE_APPLICATION_CREDENTIALS abzurufen.
  3. Gewähren Sie Cloud Customer Care Lesezugriff auf den Bucket, der den Snapshot enthält:

    gsutil iam ch \
    serviceAccount:service-PROJECT_ID@anthos-support.iam.gserviceaccount.com:roles/storage.objectViewer \
    gs://BUCKET_NAME
    

Methode 2: Standard-Snapshot auf dem lokalen Rechner erstellen

Sie können den Status der erstellten Cluster mit dem folgenden Befehl erfassen.

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

Dabei gilt:

  • CLUSTER_NAME gibt den Namen des Zielclusters an.

  • KUBECONFIG_PATH gibt den Pfad zur Datei kubeconfig des Administratorclusters an. (Der Pfad zur kubeconfig-Datei lautet normalerweise bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig. Wenn Sie jedoch Ihren Arbeitsbereich mit dem Flag WORKSPACE_DIR angegeben haben, lautet der Pfad WORKSPACE_DIR/CLUSTER_NAME/CLUSTER_NAME-kubeconfig).

Dieser Befehl gibt eine TAR-Datei auf Ihren lokalen Rechner aus. Der Name dieser TAR-Datei hat das Format snapshot-CLUSTER_NAME-TIMESTAMP.tar.gz, wobei TIMESTAMP das Datum und die Uhrzeit der Dateierstellung angibt. Diese TAR-Datei enthält relevante Debugging-Informationen zu den Systemkomponenten und Maschinen eines Clusters.

Wenn Sie diesen Befehl ausführen, werden Informationen zu Pods aus den folgenden Namespaces erfasst: gke-system ,gke-connect ,capi-system ,capi-webhook-system ,cert-manager und capi-kubeadm-bootstrap-system

Sie können den Umfang der Diagnoseinformationen jedoch mit dem Flag --snapshot-scenario all erweitern. Dieses Flag erweitert den Bereich des Diagnose-Snapshots, sodass alle Pods in einem Cluster enthalten sind:

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

Snapshot-Szenarien

Der Befehl bmctl check cluster --snapshot unterstützt zwei Szenarien. Verwenden Sie das Flag --scenario, um ein Szenario anzugeben. In der folgenden Liste sind die möglichen Werte aufgeführt:

  • system: Snapshot von Systemkomponenten erstellen, einschließlich ihrer Logs

  • all: Snapshot aller Pods erstellen, einschließlich ihrer Logs

Sie können jedes der beiden Szenarien mit einem Administrator- oder Nutzercluster verwenden. So erstellen Sie beispielsweise einen Snapshot des Administratorclusters mit dem system-Szenario:

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

So erstellen Sie einen Snapshot eines Nutzerclusters mit dem all-Szenario:

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

Probelauf für einen Snapshot durchführen

Wenn Sie das Flag --snapshot-dry-run verwenden, erstellt der Befehl keinen Snapshot. Stattdessen wird angezeigt, welche Aktionen der Snapshot-Befehl ausführen würde, und es wird eine Snapshot-Konfigurationsdatei ausgegeben. Informationen zur Snapshot-Konfigurationsdatei finden Sie unter Benutzerdefinierten Snapshot erstellen.

Geben Sie den folgenden Befehl ein, um einen Snapshot-Probelauf für Ihren Administratorcluster durchzuführen:

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

Geben Sie den folgenden Befehl ein, um einen Snapshot-Probelauf für einen Nutzercluster durchzuführen:

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

Benutzerdefinierte Snapshots

Sie möchten vielleicht aus folgenden Gründen einen benutzerdefinierten Snapshot eines Clusters erstellen:

  • Um mehr Informationen zu Ihrem Cluster einzuschließen als die, die im Standard-Snapshot enthalten sind
  • Um einige Informationen auszuschließen, die im Standard-Snapshot enthalten sind

Benutzerdefinierten Snapshot erstellen

Für das Erstellen eines benutzerdefinierten Snapshots ist eine Snapshot-Konfigurationsdatei erforderlich. In den folgenden Schritten wird erläutert, wie Sie die Konfigurationsdatei erstellen, ändern und verwenden, um einen benutzerdefinierten Snapshot eines Clusters zu erstellen:

  1. Erstellen Sie eine Snapshot-Konfigurationsdatei, indem Sie den folgenden Befehl in Ihrem Cluster ausführen und die Ausgabe in eine Datei schreiben:

     bmctl check cluster
    --snapshot --snapshot-dry-run --cluster CLUSTER_NAME
    --kubeconfig KUBECONFIG_PATH
    
  2. Legen Sie fest, welche Informationen in Ihrem benutzerdefinierten Snapshot enthalten sein sollen. Ändern Sie dazu die Snapshot-Konfigurationsdatei, die Sie in Schritt 1 erstellt haben. Wenn Sie beispielsweise möchten, dass der Snapshot zusätzliche Informationen enthält, beispielsweise wie lange ein bestimmter Knoten bereits ausgeführt wird, fügen Sie den Linux-Befehl uptime zum entsprechenden Bereich der Konfigurationsdatei hinzu. Das folgende Snippet einer Konfigurationsdatei zeigt, wie der Snapshot-Befehl uptime-Informationen zum Knoten 10.200.0.3 bereitstellen kann. Diese Informationen sind nicht in einem Standard-Snapshot enthalten.

    ...
    nodeCommands:
    - nodes:
      - 10.200.0.3
      commands:
      - uptime
    ...
    
  3. Nachdem Sie die Konfigurationsdatei geändert haben, um festzulegen, welche Art von Snapshot Sie wünschen, erstellen Sie den benutzerdefinierten Snapshot, indem Sie den folgenden Befehl ausführen:

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

    Das Flag --snapshot-config weist den Befehl bmctl an, den Inhalt der Snapshot-Konfigurationsdatei zu verwenden, um zu festzulegen, welche Informationen im Snapshot angezeigt werden.

Konfigurationsdatei im Detail

Die folgende Beispiel-Konfigurationsdatei für einen Snapshot zeigt die Standardbefehle und -dateien, die zum Erstellen eines Snapshots verwendet werden. Sie können jedoch weitere Befehle und Dateien hinzufügen, wenn zusätzliche Diagnoseinformationen erforderlich sind:

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

Die folgenden Einträge in Ihrer Konfigurationsdatei unterscheiden sich wahrscheinlich von denen in der obigen Beispielkonfigurationsdatei:

  • Die IP-Adressen der Knoten in den Abschnitten nodeCommands und nodeFiles
  • Der Pfad zum nodeSSHKey Ihres Clusters

Felder in der Konfigurationsdatei

Eine Snapshot-Konfigurationsdatei im YAML-Format. Die Konfigurationsdatei enthält die folgenden Felder:

  • numOfParallelThreads: Die Snapshot-Routine führt in der Regel zahlreiche Befehle aus. Mehrere parallele Threads führen dazu, dass die Routine schneller ausgeführt wird. Wir empfehlen, numOfParallelThreads auf 10 zu setzen, wie in der vorherigen Beispielkonfigurationsdatei gezeigt. Wenn die Snapshots zu lange dauern, erhöhen Sie diesen Wert.

  • excludeWords: Der Snapshot enthält eine große Datenmenge für Ihre Clusterknoten. Verwenden Sie excludeWords, um Sicherheitsrisiken zu reduzieren, wenn Sie Ihren Snapshot teilen. Schließen Sie beispielsweise password aus, damit die entsprechenden Passwortstrings nicht identifiziert werden können.

  • nodeCommands: In diesem Abschnitt werden die folgenden Informationen angegeben:

    • nodes: Eine Liste von IP-Adressen für die Clusterknoten, von denen Sie Informationen erfassen möchten. Wenn Sie einen Snapshot erstellen möchten, wenn der Administratorcluster nicht erreichbar ist, geben Sie mindestens eine Knoten-IP-Adresse an.

    • commands: eine Liste der Befehle (und Argumente), die auf jedem Knoten ausgeführt werden sollen. Die Ausgabe der einzelnen Befehle ist im Snapshot enthalten.

  • nodeFiles: In diesem Abschnitt werden die folgenden Informationen angegeben:

    • nodes: eine Liste von IP-Adressen von Clusterknoten, von denen Sie Dateien erfassen möchten. Geben Sie mindestens eine IP-Adresse des Knotens an, um einen Snapshot zu erstellen, wenn der Administratorcluster nicht erreichbar ist.

    • files: Eine Liste der Dateien, die von jedem Knoten abgerufen werden sollen. Wenn die angegebenen Dateien auf einem Knoten gefunden werden, werden sie in den Snapshot aufgenommen.

  • nodeSSHKey: der Pfad zu Ihrer SSH-Schlüsseldatei. Wenn der Administratorcluster nicht erreichbar ist, ist dieses Feld erforderlich.

Snapshots bei bestimmten Fehlern erstellen

Standard-Snapshot bei hängen gebliebenen Installationen oder Upgrades erstellen

Wenn Sie Administrator-, Hybrid- oder eigenständige Cluster installieren oder upgraden, kann bmctl manchmal an Punkten hängen bleiben, an denen die folgenden Ausgaben angezeigt werden:

  • Warten, bis Cluster-kubeconfig bereit ist
  • Warten, bis Cluster bereit ist
  • Warten, bis Knotenpools bereit sind
  • Warten auf Abschluss des Upgrades

Wenn die Installation oder das Upgrade hängen bleibt, können Sie mit dem Bootstrap-Cluster trotzdem einen Snapshot des Clusters erstellen. Führen Sie dazu den folgenden Befehl aus:

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

Benutzerdefinierten Snapshot bei hängen gebliebenen Installationen oder Upgrades erstellen

In den folgenden Schritten wird gezeigt, wie Sie einen benutzerdefinierten Snapshot eines Clusters erstellen, wenn die Installation oder das Upgrade angehalten wurde:

  1. Rufen Sie eine Snapshot-Konfigurationsdatei des Clusters aus Ihrem Archiv ab.

  2. Ändern Sie die Snapshot-Konfigurationsdatei so, dass der Snapshot die gewünschten Informationen enthält.

  3. Erstellen Sie den benutzerdefinierten Snapshot mit folgendem Befehl:

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

Benutzerdefinierten Snapshot erstellen, wenn der Administratorcluster nicht erreichbar ist

Wenn der Administratorcluster nicht erreichbar ist, können Sie einen benutzerdefinierten Snapshot des Clusters erstellen. In den folgenden Schritten wird gezeigt, wie Sie einen benutzerdefinierten Snapshot eines Clusters erstellen, wenn der Administratorcluster nicht erreichbar ist:

  1. Rufen Sie eine Snapshot-Konfigurationsdatei des Clusters aus dem Archiv ab.

  2. Listen Sie unter „Knoten“ die IP-Adressen der Knoten auf, für die Sie Informationen benötigen. Schließen Sie jedoch die IP-Adresse des Knotens des Administratorclusters aus.

  3. Erstellen Sie den benutzerdefinierten Snapshot mit folgendem Befehl:

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

Logs für eingehenden Traffic oder Anthos Service Mesh-Probleme erfassen

Die bmctl-Snapshots enthalten keine Informationen zur Fehlerbehebung bei Problemen mit eingehendem Traffic oder Anthos Service Mesh. Eine Anleitung zum Erfassen der relevanten Diagnoselogs finden Sie in der Anthos Service Mesh-Dokumentation unter Anthos Service Mesh-Logs erfassen.