本页面介绍如何使用 gkectl
命令行界面 (CLI) 工具诊断 GKE On-Prem 集群中的问题。
概览
gkectl
工具有两个用于排查集群问题的命令:gkectl diagnose cluster
和 gkectl diagnose snapshot
。这两个命令适用于管理员集群和用户集群。
gkectl diagnose cluster
对 GKE On-Prem 集群执行健康检查并报告错误。对以下组件运行健康检查:
- 集群对象
- 机器对象和相应的集群节点
- kube-system 和 gke-system 命名空间中的 Pod
- 用户控制层面(如果目标集群是用户集群)
gkectl diagnose snapshot
将集群的状态、配置和日志压缩成 tarball 文件。具体而言,该命令的默认配置会捕获有关集群的以下信息:
- Kubernetes 版本
- kubenetes 资源在 kube-system 和 gke-system 命名空间中的状态:集群、机器、节点、服务、端点、ConfigMap、ReplicaSet、CronJob、Pod 以及这些 Pod 的所有者,包括 Deployment、DaemonSet 和 StatefulSet
- 如果目标集群是用户集群(用户集群的控制层面在管理员集群中运行),则为用户控制层面的状态
- 有关每个节点配置的详细信息,包括 IP 地址、iptables 规则、装载点、文件系统、网络连接,以及正在运行的进程
在创建 tarball 之前,将移除凭据(包括 vSphere 和 F5 凭据)。
诊断集群
您可以运行 gke diagnose cluster
来查找集群的常见问题。
诊断管理员集群
您可以通过传递名称或仅传递 kubeconfig 来诊断管理员集群。
使用管理员集群 kubeconfig
传入管理员集群的 kubeconfig 会导致 gkectl
自动选择管理员集群:
gkectl diagnose cluster --kubeconfig=[ADMIN_CLUSTER_KUBECONFIG]
使用管理员集群名称
要获取管理员集群的名称,请运行以下命令:
kubectl get cluster --kubeconfig=[ADMIN_CLUSTER_KUBECONFIG]
然后,将管理员集群名称传入到 gkectl diagnose cluster
:
gkectl diagnose cluster --kubeconfig=[ADMIN_CLUSTER_KUBECONFIG] \ --cluster-name=[ADMIN_CLUSTER_NAME]
如果您的管理员集群正常运行,gkectl diagnose cluster
将返回以下输出:
Diagnosing admin cluster "[ADMIN_CLUSTER_NAME]"... Checking cluster object...PASS Checking machine objects...PASS Checking kube-system pods...PASS Cluster is healthy.
诊断用户集群
要诊断集群,请先获取用户集群名称:
kubectl get cluster --kubeconfig=[USER_CLUSTER_KUBECONFIG]
接着传入管理员集信的 Kubeconfig 和用户集群的名称:
gkectl diagnose cluster --kubeconfig=[ADMIN_CLUSTER_KUBECONFIG] \ --cluster-name=[USER_CLUSTER_NAME]
如果您的用户集群运行正常,gkectl diagnose cluster
将返回以下输出:
Diagnosing user cluster "[USER_CLUSTER_NAME]"... Checking cluster object...PASS Checking control plane pods...PASS Checking machine objects...PASS Checking other kube-system pods...PASS Cluster is healthy.
捕获集群状态
如果 gkectl diagnose cluster
发现错误,您应该捕获集群的状态并将信息提供给 Google。您可以使用 gkectl diagnose snapshot
命令执行此操作。
捕获管理员集群状态
要捕获管理员集群的状态,请运行以下命令:
gkectl diagnose snapshot --kubeconfig=[ADMIN_CLUSTER_KUBECONFIG]
输出包括文件列表和 tarball 文件的名称:
Taking snapshot of admin cluster "[ADMIN_CLUSTER_NAME]"... Using default snapshot configuration... Setting up "[ADMIN_CLUSTER_NAME]" ssh key file...DONE Taking snapshots... commands/kubectl_get_pods_-o_yaml_--kubeconfig_...env.default.kubeconfig_--namespace_kube-system commands/kubectl_get_deployments_-o_yaml_--kubeconfig_...env.default.kubeconfig_--namespace_kube-system commands/kubectl_get_daemonsets_-o_yaml_--kubeconfig_...env.default.kubeconfig_--namespace_kube-system ... nodes/[ADMIN_CLUSTER_NODE]/commands/journalctl_-u_kubelet nodes/[ADMIN_CLUSTER_NODE]/files/var/log/startup.log ... Snapshot succeeded. Output saved in [TARBALL_FILE_NAME].tar.gz.
要将 tarball 文件解压到目录中,请运行以下命令:
tar -zxf [TARBALL_FILE_NAME] --directory [EXTRACTION_DIRECTORY_NAME]
要查看快照生成的文件列表,请运行以下命令:
cd [EXTRACTION_DIRECTORY_NAME]/[EXTRACTED_SNAPSHOT_DIRECTORY] ls kubectlCommands ls nodes/[NODE_NAME]/commands ls nodes/[NODE_NAME]/files
要查看特定操作的详细信息,请打开其中一个文件。
指定管理员集群的 ssh 密钥
获取管理员集群的快照时,gkectl
会自动查找管理员集群的私有 ssh 密钥。您还可以使用 --admin-ssh-key-path
参数显式指定密钥。
base64 编码的 ssh 私钥位于 GKE On-Prem 配置文件中,作为 admincluster.spec.ssh.privatekey
的值。要提取密钥并使用 base64 进行解码,并将其保存在新文件中,请运行以下命令:
grep privatekey /path/to/config.yaml | awk '{print $2}' | base64 -d > [PATH_TO_DECODED_KEY]
然后在 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]
输出包括文件列表和 tarball 文件的名称:
Taking snapshot of user cluster "[USER_CLUSTER_NAME]"... Using default snapshot configuration... Setting up "[USER_CLUSTER_NAME]" ssh key file...DONE commands/kubectl_get_pods_-o_yaml_--kubeconfig_...env.default.kubeconfig_--namespace_user commands/kubectl_get_deployments_-o_yaml_--kubeconfig_...env.default.kubeconfig_--namespace_user commands/kubectl_get_daemonsets_-o_yaml_--kubeconfig_...env.default.kubeconfig_--namespace_user ... commands/kubectl_get_pods_-o_yaml_--kubeconfig_.tmp.user-kubeconfig-851213064_--namespace_kube-system commands/kubectl_get_deployments_-o_yaml_--kubeconfig_.tmp.user-kubeconfig-851213064_--namespace_kube-system commands/kubectl_get_daemonsets_-o_yaml_--kubeconfig_.tmp.user-kubeconfig-851213064_--namespace_kube-system ... nodes/[USER_CLUSTER_NODE]/commands/journalctl_-u_kubelet nodes/[USER_CLUSTER_NODE]/files/var/log/startup.log ... Snapshot succeeded. Output saved in [FILENAME].tar.gz.
快照场景
gkectl diagnose snapshot
命令支持四种场景。要指定场景,请使用 --scenario
标志。以下列表显示了可能的值:
system
:(默认)收集系统命名空间kube-system
和gke-system
的快照。system-with-logs
:收集包含日志的system
快照。all
:收集所有命名空间的快照。all-with-logs
:收集包含日志的all
快照。
管理员集群或用户集群可以使用四种场景中的每一个,因此有八种可能的排列。以下示例展示了一些可能性。
要使用 system
场景创建管理员集群的快照,请执行以下操作:
gkectl diagnose snapshot \ --kubeconfig=[ADMIN_CLUSTER_KUBECONFIG] \ --admin-ssh-key-path=/path/to/decoded_key \ --scenario=system
要使用 system-with-logs
场景创建用户集群的快照,请执行以下操作:
gkectl diagnose snapshot \ --kubeconfig=[ADMIN_CLUSTER_KUBECONFIG] \ --user-cluster=[USER_CLUSTER_NAME] \ --scenario=system-with-logs
要使用 all
场景创建用户集群的快照,请执行以下操作:
gkectl diagnose snapshot \ --kubeconfig=[ADMIN_CLUSTER_KUBECONFIG] \ --cluster-name=[USER_CLUSTER_NAME] \ --scenario=all
要使用 all-with-logs
场景创建管理员集群的快照,请执行以下操作:
gkectl diagnose snapshot \ --kubeconfig=[ADMIN_CLUSTER_KUBECONFIG] \ --admin-ssh-key-path=/path/to/decoded_key \ --scenario=all-with-logs
对快照执行试运行
您可以使用 --dry-run
标志来显示要执行的操作和快照配置。
要在管理员集群上执行试运行,请输入以下命令:
gkectl diagnose snapshot --kubeconfig=[ADMIN_CLUSTER_KUBECONFIG] \ --cluster-name=[ADMIN_CLUSTER_NAME] \ --admin-ssh-key-path=[PATH_TO_DECODED_KEY] \ --dry-run
要在用户集群上执行试运行,请输入以下命令:
gkectl diagnose snapshot --kubeconfig=[ADMIN_CLUSTER_KUBECONFIG] \ --cluster-name=[USER_CLUSTER_NAME] \ --dry-run
使用快照配置
如果这四种场景都不能满足您的需求,您可以使用 --config
标志传入配置文件来创建自定义快照:
gkectl diagnose snapshot --kubeconfig=[ADMIN_CLUSTER_KUBECONFIG] \ --cluster-name=[USER_CLUSTER_NAME] \ --config=[SNAPSHOT_CONFIG_FILE]
要查看其中一个场景的快照配置,请使用 --dry-run
标志。例如,要查看用户集群的默认场景 (system
) 的快照配置,请输入以下命令:
gkectl diagnose snapshot \ --kubeconfig=[ADMIN_CLUSTER_KUBECONFIG] \ --cluster-name=[USER_CLUSTER_NAME] \ --scenario=system --dry-run
输出类似于以下内容:
numOfParallelThreads: 10 excludeWords: - password kubectlCommands: - commands: - kubectl get clusters -o wide - kubectl get machines -o wide - kubectl get clusters -o yaml - kubectl get machines -o yaml - kubectl describe clusters - kubectl describe machines namespaces: - default - commands: - kubectl version - kubectl cluster-info - kubectl get nodes -o wide - kubectl get nodes -o yaml - kubectl describe nodes namespaces: [] - commands: - kubectl get pods -o wide - kubectl get deployments -o wide - kubectl get daemonsets -o wide - kubectl get statefulsets -o wide - kubectl get replicasets -o wide - kubectl get services -o wide - kubectl get jobs -o wide - kubectl get cronjobs -o wide - kubectl get endpoints -o wide - kubectl get configmaps -o wide - kubectl get pods -o yaml - kubectl get deployments -o yaml - kubectl get daemonsets -o yaml - kubectl get statefulsets -o yaml - kubectl get replicasets -o yaml - kubectl get services -o yaml - kubectl get jobs -o yaml - kubectl get cronjobs -o yaml - kubectl get endpoints -o yaml - kubectl get configmaps -o yaml - kubectl describe pods - kubectl describe deployments - kubectl describe daemonsets - kubectl describe statefulsets - kubectl describe replicasets - kubectl describe services - kubectl describe jobs - kubectl describe cronjobs - kubectl describe endpoints - kubectl describe configmaps namespaces: - kube-system - gke-system - gke-connect.* prometheusRequests: [] nodeCommands: - nodes: [] commands: - uptime - df --all --inodes - ip addr - sudo iptables-save --counters - mount - ip route list table all - top -bn1 - sudo docker ps -a - ps -edF - ps -eo pid,tid,ppid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm,args,cgroup - sudo conntrack --count nodeFiles: - nodes: [] files: - /proc/sys/fs/file-nr - /proc/sys/net/nf_conntrack_max
numOfParallelThreads
:用于截取快照的并行线程数。excludeWords
:要从快照中排除的字词列表(不区分大小写)。系统会从快照结果中移除包含这些字词的行。无论您是否指定“password”,都始终会将其排除。kubectlCommands
:要运行的 kubectl 命令列表。系统会保存结果。这些命令将针对相应的命名空间运行。对于kubectl logs
命令,系统会自动添加相应命名空间中的所有 Pod 和容器。支持使用正则表达式指定命名空间。如果未指定命名空间,则假定为default
命名空间。nodeCommands
:要在相应节点上运行的命令列表。系统会保存结果。未指定节点时,将考虑目标集群中的所有节点。nodeFiles
:要从相应节点收集的文件列表。系统会保存这些文件。未指定节点时,将考虑目标集群中的所有节点。prometheusRequests
:Prometheus 请求列表。系统会保存结果。