本文档介绍了如何使用 gkectl diagnose
命令创建诊断快照,以便在启用高级集群时排查使用 Google Distributed Cloud for VMware(纯软件)创建的集群中的问题。在管理员集群配置文件和用户集群配置文件中将 enableAdvancedClusters
设置为 true
时,系统会启用高级集群。如果未启用高级集群,请参阅在未启用高级集群时创建诊断快照。
gkectl diagnose snapshot
此命令会将集群的状态、配置和日志压缩到一个 tar 文件中。gkectl diagnose snapshot 命令的默认配置会捕获有关集群的以下信息:
Kubernetes 版本。
kubenetes 资源在 kube-system 和 gke-system 命名空间中的状态:集群、机器、节点、服务、端点、ConfigMap、ReplicaSet、CronJob、Pod 以及这些 Pod 的所有者,包括 Deployment、DaemonSet 和 StatefulSet。
控制平面的状态。
有关每个节点配置的详细信息,包括 IP 地址、iptables 规则、装载点、文件系统、网络连接,以及正在运行的进程。
来自管理员集群的控制平面节点的容器日志(当 Kubernetes API 服务器不可用时)。
来自
gkectl diagnose snapshot
命令的日志。预检作业的日志。
命名空间中根据场景的容器日志。
在创建 tar 文件之前,系统会移除凭据(包括适用于 vSphere 和 F5 的凭据)。
捕获管理员集群状态
要捕获管理员集群的状态,请运行以下命令:
gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG
将 ADMIN_CLUSTER_KUBECONFIG
替换为管理员集群 kubeconfig 文件的路径。
输出包括文件列表和 tar 文件的名称,如以下示例输出所示:
Using "system" snapshot configuration...
Creating ssh signer for "[ADMIN_CLUSTER_NAME]"...
Taking snapshots in 10 thread(s)...
gkectlLogs/gkectl-xxx.log
...
kubectlCommands/[NAMESPACE]/kubectl_get_pods
kubectlCommands/[NAMESPACE]/kubectl_get_deployments
kubectlCommands/[NAMESPACE]/kubectl_get_daemonsets
...
nodes/[ADMIN_CLUSTER_NODE]/commands/journalctl_-u_kubelet
nodes/[ADMIN_CLUSTER_NODE]/files/var/log/startup.log
...
Snapshot succeeded. Output saved in [FILENAME].tar.gz.
如需将 tar 文件解压缩到目录中,请运行以下命令:
tar -zxf TAR_FILE_NAME --directory EXTRACTION_DIRECTORY_NAME
替换以下内容:
TAR_FILE_NAME
:tar 文件的名称。EXTRACTION_DIRECTORY_NAME
:您要将 tar 文件归档解压缩到的目录。
要查看快照生成的文件列表,请运行以下命令:
cd EXTRACTION_DIRECTORY_NAME/EXTRACTED_SNAPSHOT_DIRECTORY ls kubectlCommands ls nodes/NODE_NAME/commands ls nodes/NODE_NAME/files
将 NODE_NAME
替换为您要查看文件的节点的名称。
要查看特定操作的详细信息,请打开其中一个文件。
指定管理员集群的 SSH 密钥
获取管理员集群的快照时,gkectl
会自动查找管理员集群的私有 SSH 密钥。您还可以使用 --admin-ssh-key-path
参数显式指定密钥。
按照使用 SSH 连接到集群节点中的说明下载 SSH 密钥。
在 gkectl diagnose snapshot
命令中,将 --admin-ssh-key-path
设置为已解码的密钥路径:
gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \ --admin-ssh-key-path=PATH_TO_DECODED_KEY
捕获用户集群状态
要捕获用户集群的状态,请运行以下命令:
gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \ --cluster-name=USER_CLUSTER_NAME
以下示例输出包括文件列表和 tar 文件的名称:
Using "system" snapshot configuration...
Creating ssh signer for "[USER_CLUSTER_NAME]"...
Taking snapshots in 10 thread(s)...
gkectlLogs/gkectl-xxx.log
...
kubectlCommands/[NAMESPACE]/kubectl_get_pods
kubectlCommands/[NAMESPACE]/kubectl_get_deployments
kubectlCommands/[NAMESPACE]/kubectl_get_daemonsets
...
nodes/[USER_CLUSTER_NODE_IP_ADDRESS]/commands/journalctl_-u_kubelet
nodes/[USER_CLUSTER_NODE_IP_ADDRESS]/files/var/log/startup.logn
...
Snapshot succeeded. Output saved in [FILENAME].tar.gz.
快照场景
借助快照场景,您可以控制快照中包含的信息。如需指定场景,请使用 --scenario
标志。以下列表显示了可能的值:
system
(默认值):收集受支持系统命名空间中包含日志的快照。all
:收集所有命名空间(包括用户定义的命名空间)中包含日志的快照。
如需创建管理员集群的快照,您无需指定场景:
gkectl diagnose snapshot \ --kubeconfig=ADMIN_CLUSTER_KUBECONFIG
要使用 system
场景创建用户集群的快照,请执行以下操作:
gkectl diagnose snapshot \ --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \ --cluster-name=USER_CLUSTER_NAME \ --scenario=system
要使用 all
场景创建用户集群的快照,请执行以下操作:
gkectl diagnose snapshot \ --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \ --cluster-name=USER_CLUSTER_NAME \ --scenario=all
使用 --log-since
限制快照
您可以使用 --log-since
标志将日志收集限制为最近的时间段。例如,您可以仅收集过去两天或过去三小时的日志。默认情况下,diagnose snapshot
会收集所有日志。
gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \ --cluster-name=CLUSTER_NAME \ --scenario=system \ --log-since=DURATION
将 <var>DURATION</var>
替换为时间值,如 120m
或 48h
。
需要注意以下几点:
- 仅
kubectl
和journalctl
日志支持--log-since
标志。 - 自定义快照配置中不允许使用
--log-since
等命令标志。
对快照执行试运行
您可以使用 --dry-run
标志来显示要执行的操作和快照配置。
要在管理员集群上执行试运行,请输入以下命令:
gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \ --cluster-name=ADMIN_CLUSTER_NAME \ --dry-run
要在用户集群上执行试运行,请输入以下命令:
gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \ --cluster-name=USER_CLUSTER_NAME \ --dry-run
使用快照配置
如果这两种场景(--scenario system
或 all
)都不能满足您的需求,您可以使用 --snapshot-config
标志传入快照配置文件来创建自定义快照:
gkectl diagnose snapshot --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \ --cluster-name=USER_CLUSTER_NAME \ --snapshot-config=SNAPSHOT_CONFIG_FILE
生成快照配置
您可以通过传入 --scenario
和 --dry-run
标志为给定场景生成快照配置。例如,要查看用户集群的默认场景 (system
) 的快照配置,请输入以下命令:
gkectl diagnose snapshot \ --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \ --cluster-name=USER_CLUSTER_NAME \ --scenario=system --dry-run
输出类似于以下示例:
The snapshot configuration is:
numOfParallelThreads: 10
excludeWords:
- password
kubectlCommands:
- commands:
- kubectl version
- kubectl cluster-info
- kubectl top node
- kubectl top pod -A --containers
namespaces: []
- commands:
- kubectl get -o wide --ignore-not-found
- kubectl get -o yaml --ignore-not-found
- kubectl describe
namespaces:
- kube-system
...
expandResources: true
- commands:
- kubectl logs
namespaces:
- kube-system
...
kindNodeCommands: []
nodeCommands:
- nodes: []
commands:
- uptime
- df --all --inodes
- ip addr
- ip neigh
- iptables-save --counters
- mount
- ip route list table all
- top -bn1 || true
- docker info || true
...
- nodes: []
commands:
- dmesg
- systemctl status -l kubelet
- journalctl --utc -u kubelet
- journalctl --utc -u kubelet-monitor.service
...
nodeFiles:
- nodes: []
files:
- /proc/sys/fs/file-nr
- /proc/sys/net/netfilter/nf_conntrack_max
...
- nodes: []
files:
- /var/log/apiserver/audit-proxy-buffer/* || true
输出中会显示以下信息:
numOfParallelThreads
:用于截取快照的并行线程数。excludeWords
:要从快照中排除的字词列表(不区分大小写)。系统会从快照结果中移除包含这些字词的行。无论您是否指定“password”,都始终会将其排除。kubectlCommands
:要运行的 kubectl 命令列表。系统会保存结果。这些命令将针对相应的命名空间运行。对于kubectl logs
命令,系统会自动添加相应命名空间中的所有 Pod 和容器。支持使用正则表达式指定命名空间。如果未指定命名空间,则假定为default
命名空间。nodeCommands
:要在相应节点上运行的命令列表。系统会保存结果。未指定节点时,将考虑目标集群中的所有节点。nodeFiles
:要从相应节点收集的文件列表。系统会保存这些文件。未指定节点时,将考虑目标集群中的所有节点。