问题排查:诊断和重置集群

您可以诊断或检查集群以调试问题并捕获集群状态的快照。此外,如果安装部分成功,但集群返回错误或者没有正确运行,您可以尝试重置集群。

使用 bmctl check cluster 诊断集群

您可以使用 bmctl check cluster 命令捕获已创建集群的状态。您可以通过命令标志选择命令的诊断范围,从而获得目标明确的信息。

诊断信息可帮助您更高效地发现问题和调试部署。该命令会捕获您定义的范围的所有相关集群和节点配置文件,然后将信息打包到一个 tar 归档文件中。

bmctl check cluster --snapshot --cluster CLUSTER_NAME --admin-kubeconfig ADMIN_KUBECONFIG_PATH

请替换以下内容:

  • CLUSTER_NAME:目标集群的名称。

  • ADMIN_KUBECONFIG_PATH:管理员集群 kubeconfig 文件的路径。

该命令会输出 tar 归档文件,其中包含您指定的集群中的所有系统组件和机器的相关调试信息。

您可以使用以下命令标志更改收集的诊断信息的范围:

  • --snapshot-scenario all 标志将诊断快照的范围扩大为包含指定集群中的所有 pod:
bmctl check cluster --snapshot --snapshot-scenario all --cluster CLUSTER_NAME --admin-kubeconfig ADMIN_KUBECONFIG_PATH
  • --snapshot-dry-run 标志与 --snapshot-config string 标志搭配使用。使用 --snapshot-dry-run 标志可输出一个配置文件,您可以通过修改该文件来定义自定义诊断范围。范围可以包括特定的 pod、命名空间或节点命令。

修改使用 --snapshot-dry-run 标志创建的输出文件后,您可以将其作为输入来通过 --snapshot-config string 标志诊断特定范围,如下所述。如果您省略此标志,系统会应用默认配置。

bmctl check cluster --snapshot --snapshot-dry-run --cluster CLUSTER_NAME --admin-kubeconfig ADMIN_KUBECONFIG_PATH
  • --snapshot-config 标志告知 bmctl 命令使用快照配置文件中指定的范围选项。通常使用 --snapshot-dry-run 标志创建快照配置文件。
bmctl check cluster --snapshot --snapshot-config SNAPSHOT_CONFIG_FILE --cluster CLUSTER_NAME --admin-kubeconfig ADMIN_KUBECONFIG_PATH

在管理员集群无法访问时诊断集群

当管理员集群关闭或无法访问时,请使用快照配置文件截取集群快照。快照配置文件采用 YAML 格式。配置文件包括以下字段,用于指定集群的捕获方式:

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

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

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

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

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

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

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

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

  • nodeSSHKey:节点的 SSH 密钥文件的路径。如果管理员集群无法访问,则需要创建此字段才能创建快照。

通过以下命令使用快照配置文件创建快照:

bmctl check cluster --snapshot --snapshot-config SNAPSHOT_CONFIG

SNAPSHOT_CONFIG 替换为快照配置文件的路径。

以下示例快照配置文件显示了用于创建快照的标准命令和文件。如果需要更多诊断信息,您可以添加更多命令和文件。

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 to each nodes

创建管理员集群固定安装/升级的快照

安装管理员/混合/独立集群时,如果 bmctl 卡在以下输出

  • 等待集群 kubeconfig 准备就绪
  • 等待集群准备就绪
  • 等待节点池准备就绪

或者在升级管理员/混合/独立集群时

  • 等待升级完成

您可以运行以下命令以使用引导集群截取快照。

bmctl check cluster --snapshot --kubeconfig <var>WORKSPACE_DIR</var>/.kindkubeconfig --cluster <var>CLUSTER_NAME</var>

使用 bmctl reset cluster 重置集群

如果集群未正确安装,您可以尝试重置节点,以将节点恢复为默认状态。然后,您可以在更改配置后重新安装集群。

重置自行管理的集群

如需重置自行管理的集群(例如管理员集群),请发出以下命令:

bmctl reset --cluster CLUSTER_NAME

CLUSTER_NAME 替换为您要重置的集群的名称。

重置用户集群

如需重置集群,请发出以下命令:

bmctl reset --cluster CLUSTER_NAME --admin-kubeconfig ADMIN_KUBECONFIG_PATH

CLUSTER_NAME 替换为您要重置的用户集群的名称,并将 ADMIN_KUBECONFIG_PATH 替换为关联的管理员集群 kubeconfig 文件的路径。bmctl 支持使用 --kubeconfig 作为 --admin-kubeconfig 标志的别名。

重置集群详情

无论集群类型为何,重置命令都适用于整个集群。您无法仅对集群中的某些节点应用该命令。

bmctl cluster reset 命令的输出类似于以下示例:

bmctl reset --cluster cluster1
Creating bootstrap cluster... OK
Deleting GKE Hub member admin in project my-gcp-project...
Successfully deleted GKE Hub member admin in project my-gcp-project
Loading images... OK
Starting reset jobs...
Resetting: 1    Completed: 0    Failed: 0
...
Resetting: 0    Completed: 1    Failed: 0
Flushing logs... OK

在重置操作期间,bmctl 首先尝试删除 GKE Hub 成员资格注册,然后清理受影响的节点。 重置期间,anthos-system StorageClass 中的存储装载和数据也会被删除。

对于所有节点,bmctl 运行 kubeadm reset,移除用于集群网络的隧道接口,并删除以下目录:

  • /etc/kubernetes
  • /etc/cni/net.d
  • /root/.kube
  • /var/lib/kubelet

对于负载均衡器节点,bmctl 还会执行以下操作:

  • 停用 keepalivedhaproxy 服务
  • 删除 keepalivedhaproxy 的配置文件

重置工具需要集群配置文件位于当前工作目录下的以下位置:

bmctl-workspace/cluster name/cluster name.yaml