创建快照以帮助诊断集群问题

如果某个集群存在问题,您可以从 Cloud Customer Care 获取帮助。Customer Care 可能会要求您截取集群的“快照”,可用于诊断问题。快照会捕获集群和节点配置文件,并将该信息打包为一个 tar 文件。

本文档介绍如何创建集群的默认快照或更多自定义快照,还介绍了在集群出现特定错误时如何创建快照。

默认快照

以下部分介绍了标准快照中的内容以及如何创建标准快照。如需了解自定义快照,请参阅自定义快照部分。

默认快照包含哪些信息?

集群的快照是一个有关该集群的配置文件和日志的 tar 文件。具体而言,该命令的默认配置会捕获有关集群的以下信息:

  • Kubernetes 版本。

  • kubenetes 资源在 kube-system 和 gke-system 命名空间中的状态:集群、机器、节点、服务、端点、ConfigMap、ReplicaSet、CronJob、Pod 以及这些 Pod 的所有者,包括 Deployment、DaemonSet 和 StatefulSet。

  • 有关每个节点配置的详细信息,包括 IP 地址、iptables 规则、装载点、文件系统、网络连接,以及正在运行的进程。

  • 来自 bmctl check cluster --snapshot 命令的日志。

集群的凭据信息不包含在默认快照中。如果 Cloud Customer Care 请求该信息,请参阅检索集群信息

如需查看运行快照命令时收集的信息的完整列表,请参阅详细的配置文件部分中显示的配置文件。此配置文件展示了截取默认快照时运行的命令。

如何创建默认快照

bmctl check cluster 命令用于截取集群的快照。您可以使用此命令执行以下任一操作:

  • 创建快照并将其自动上传到 Cloud Storage 存储桶。
  • 创建集群快照并将快照文件保存在运行该命令的本地机器上。

方法 #1:创建默认快照并自动上传到 Cloud Storage 存储桶

如需创建快照并将其上传到 Cloud Storage 存储桶,请执行以下操作:

  1. 设置 API 和服务帐号:

    1. 在 Google Cloud 项目中启用 Cloud Storage API。
    2. 为服务帐号授予 storage.admin 角色,以便服务帐号能够将数据上传到 Cloud Storage。
    3. 下载服务帐号的 JSON 密钥。

    如需了解详情,请参阅启用 Google 服务和服务帐号

  2. 运行以下 bmctl 命令以创建快照并将快照自动上传到 Cloud Storage 存储桶:

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

    在该命令中,将以下条目替换为特定于您的集群环境的信息:

    • CLUSTER_NAME:您要截取其快照的集群的名称。
    • KUBECONFIG_PATH:管理员集群 kubeconfig 文件的路径。默认情况下,kubeconfig 文件的路径为 bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig。但是,如果您使用 WORKSPACE_DIR 标志指定工作区,则路径为 WORKSPACE_DIR/CLUSTER_NAME/CLUSTER_NAME-kubeconfig
    • BUCKET_NAME:您拥有的 Cloud Storage 存储桶的名称。
    • SERVICE_ACCOUNT_KEY_FILE:如果您未提供 --service-account-key-file 标志,则 bmctl 会尝试从 GOOGLE_APPLICATION_CREDENTIALS 环境变量获取服务帐号密钥文件的路径。
  3. 按照允许 Google Cloud 支持团队查看您上传的集群快照中的说明,创建服务帐号并与 Cloud Customer Care 团队共享访问权限。

方法 #2:在本地机器上创建默认快照

您可以使用以下命令捕获已创建的集群的状态:

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

替换以下内容:

  • CLUSTER_NAME:目标集群的名称。

  • KUBECONFIG_PATH:管理员集群 kubeconfig 文件的路径。默认情况下,kubeconfig 文件的路径为 bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig。但是,如果您使用 WORKSPACE_DIR 标志指定工作区,则路径为 WORKSPACE_DIR/CLUSTER_NAME/CLUSTER_NAME-kubeconfig

此命令会将一个 tar 文件输出到本地机器。此 tar 文件的名称采用 snapshot-CLUSTER_NAME-TIMESTAMP.tar.gz 格式,其中 TIMESTAMP 表示该文件的创建日期和时间。此 tar 文件包含集群的系统组件和机器的相关调试信息。

执行此命令时,系统会从以下命名空间收集有关 Pod 的信息:gke-systemgke-connectcapi-systemcapi-webhook-systemcert-managercapi-kubeadm-bootstrap-system

但是,您可以使用 --snapshot-scenario all 标志扩大收集的诊断信息的范围。此标志会将诊断快照的范围扩大为包含集群中的所有 Pod:

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

快照场景

bmctl check cluster --snapshot 命令支持两种场景。要指定场景,请使用 --scenario 标志。以下列表显示了可能的值:

  • system:收集系统组件的快照,包括其日志。

  • all:收集所有 Pod 的快照,包括其日志。

您可以为管理员集群或用户集群使用每一种场景。例如,要使用 system 场景创建管理员集群的快照,请使用以下命令:

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

要使用 all 场景创建用户集群的快照,请执行以下操作:

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

对快照执行试运行

使用 --snapshot-dry-run 标志时,该命令不会创建快照,而是会显示快照命令将执行的操作,并输出快照配置文件。如需了解快照配置文件,请参阅如何创建自定义快照

要在管理员集群上执行试运行快照,请输入以下命令:

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

要在用户集群上执行试运行快照,请输入以下命令:

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

自定义快照

出于以下原因,您可能需要创建集群的自定义快照:

  • 包含的集群相关信息超过默认快照中提供的信息。
  • 排除默认快照中的某些信息。

如何创建自定义快照

创建自定义快照需要使用快照配置文件。以下步骤介绍了如何创建和修改配置文件,并使用配置文件创建集群的自定义快照:

  1. 通过在集群上运行以下命令并将输出写入文件来创建快照配置文件:

    bmctl check cluster \
        --snapshot --snapshot-dry-run --cluster CLUSTER_NAME \
        --kubeconfig KUBECONFIG_PATH
    
  2. 定义您要在自定义快照中显示的信息类型。为此,请修改您在第 1 步中创建的快照配置文件。例如,如果您希望快照包含其他信息(例如特定节点的运行时长),请将 Linux 命令 uptime 添加到配置文件的相关部分。配置文件的以下代码段展示了如何让快照命令提供关于节点 10.200.0.3uptime 信息。此信息不会出现在标准快照中。

    ...
    nodeCommands:
    - nodes:
      - 10.200.0.3
      commands:
      - uptime
    ...
    
  3. 修改配置文件以定义所需的快照类型后,通过运行以下命令创建自定义快照:

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

    --snapshot-config 标志指示 bmctl 命令使用快照配置文件的内容来定义快照中显示的信息。

详细的配置文件

以下示例快照配置文件展示了用于创建快照的标准命令和文件,但当需要其他诊断信息时,您可以添加更多命令和文件:

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

配置文件中的以下条目可能与上述示例配置文件中显示的条目不同:

  • nodeCommandsnodeFiles 部分中节点的 IP 地址
  • 集群的 nodeSSHKey 的路径

配置文件中的字段

快照配置文件采用 YAML 格式。配置文件包含以下字段:

  • numOfParallelThreads:快照例程通常运行大量命令。多个并行线程可帮助例程更快地执行。按照前面的示例配置文件所示,我们建议您将 numOfParallelThreads 设置为 10。如果快照截取时间过长,请提高此值。

  • excludeWords:快照包含大量用于集群节点的数据。使用 excludeWords 时,您可以在共享快照时降低安全风险。例如,排除 password 以便无法识别相应的密码字符串。

  • nodeCommands:本部分指定了以下信息:

    • nodes:您要从中收集信息的集群节点的 IP 地址列表。如需在管理员集群无法访问时创建快照,请指定至少一个节点 IP 地址。

    • commands:要在每个节点上运行的命令(和参数)的列表。每个命令的输出都包含在快照中。

  • nodeFiles:本部分指定了以下信息:

    • nodes:要从中收集文件的集群节点的 IP 地址列表。要在管理员集群无法访问时创建快照,请至少指定一个节点 IP 地址。

    • files:要从每个节点检索的文件列表。在节点上发现指定文件时,文件将包含在快照中。

  • nodeSSHKey:您的 SSH 密钥文件的路径。如果管理员集群无法访问,则此字段为必填字段。

在遇到特定错误时创建快照

如何在安装或升级停滞期间创建默认快照

安装或升级管理员集群、混合集群或独立集群时,bmctl 有时可能会停滞,此时可以看到以下输出:

  • 等待集群 kubeconfig 准备就绪。
  • 等待集群准备就绪。
  • 等待节点池准备就绪。
  • 等待升级完成。

尽管如此,如果您遇到安装或升级停滞的情况,可以通过运行以下命令使用引导集群截取集群的快照:

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

如何在安装或升级停滞期间创建自定义快照

以下步骤展示了如何在安装或升级停滞时创建集群的自定义快照:

  1. 从归档中检索集群的快照配置文件。

  2. 修改快照配置文件,使快照包含您需要的信息。

  3. 通过运行以下命令创建自定义快照:

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

如何在管理员集群无法访问时创建自定义快照

如果管理员集群无法访问,您可以运行以下命令来截取集群的自定义快照:

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

在该命令中,将以下条目替换为特定于您的集群环境的信息:

  • CLUSTER_NAME:您要截取其快照的集群的名称。
  • SSH_KEY_FILE:节点 SSH 密钥文件的路径。
  • NODE_x_IP_ADDRESS:您想要了解的集群节点的 IP 地址。

或者,您可以在单独的行中列出节点 IP 地址:

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