诊断 Google Kubernetes Engine (GKE) 问题的根本原因通常需要详细检查 Kubernetes 资源的实时状态、配置和事件。若要深入了解表面症状,您需要使用可直接查询和与集群控制平面互动的工具。
您可以通过本页了解用于调查集群实时状态的基本 kubectl
命令。通过学习这些命令,您可以直接从 Kubernetes 控制平面收集详细信息,从而了解问题发生的原因。
对于需要执行深入的集群健康检查、管理资源以及精细地排查基础架构问题的平台管理员和操作员,此信息非常重要。对于应用开发者来说,它对于调试应用行为、检查 Pod 日志和事件以及验证其部署在 Kubernetes 环境中的确切状态也至关重要。如需详细了解我们在 Google Cloud 内容中提及的常见角色和示例任务,请参阅常见的 GKE 用户角色和任务。
准备工作
在开始之前,请先执行以下任务:
- 安装 kubectl。
配置
kubectl
命令行工具以与您的集群通信:gcloud container clusters get-credentials CLUSTER_NAME \ --location=LOCATION
替换以下内容:
CLUSTER_NAME
:您的集群的名称。LOCATION
:集群控制平面的 Compute Engine 位置。为区域级集群提供区域,或为可用区级集群提供可用区。
查看您的权限。如需查看您是否拥有运行
kubectl
命令所需的权限,请使用kubectl auth can-i
命令。例如,如需查看您是否有权运行kubectl get nodes
,请运行kubectl auth can-i get nodes
命令。如果您拥有所需权限,该命令会返回
yes
;否则,该命令会返回no
。如果您没有运行
kubectl
命令的权限,则可能会看到类似于以下内容的错误消息:Error from server (Forbidden): pods "POD_NAME" is forbidden: User "USERNAME@DOMAIN.com" cannot list resource "pods" in API group "" in the namespace "default"
如果您没有所需权限,请让集群管理员为您分配必要的角色。
获取正在运行的内容的概况
kubectl get
命令可帮助您从整体上了解集群中正在发生的概况。使用以下命令可查看两个最重要的集群组件(节点和 Pod)的状态:
如需检查节点健康状况是否良好,请查看所有节点及其状态的详细信息:
kubectl get nodes
输出类似于以下内容:
NAME STATUS ROLES AGE VERSION gke-cs-cluster-default-pool-8b8a777f-224a Ready <none> 4d23h v1.32.3-gke.1785003 gke-cs-cluster-default-pool-8b8a777f-egb2 Ready <none> 4d22h v1.32.3-gke.1785003 gke-cs-cluster-default-pool-8b8a777f-p5bn Ready <none> 4d22h v1.32.3-gke.1785003
除
Ready
之外的任何状态都需要进一步调查。如需检查 Pod 健康状况是否良好,请查看所有 Pod 及其状态的详细信息:
kubectl get pods --all-namespaces
输出类似于以下内容:
NAMESPACE NAME READY STATUS RESTARTS AGE kube-system netd-6nbsq 3/3 Running 0 4d23h kube-system netd-g7tpl 3/3 Running 0 4d23h
除
Running
之外的任何状态都需要进一步调查。以下是您可能会看到的一些常见状态:Running
:健康的正常运行状态。Pending
:Pod 正在等待被调度到节点上。CrashLoopBackOff
:Pod 中的容器反复崩溃陷入循环,在该过程中,应用反复启动后因出错而退出,之后又被 Kubernetes 重启。ImagePullBackOff
:Pod 无法拉取容器映像。
上述命令只是两个展示如何使用 kubectl
get
命令的示例。您还可以使用该命令详细了解多种类型的 Kubernetes 资源。如需查看您可以探索的资源的完整列表,请参阅 Kubernetes 文档中的 kubectl get。
详细了解特定资源
发现问题后,您需要了解更多详情。例如,状态不是 Running
的 Pod 可能存在问题。如需了解更多详情,请使用 kubectl describe
命令。
例如,如需描述特定 Pod,请运行以下命令:
kubectl describe pod POD_NAME -n NAMESPACE_NAME
替换以下内容:
POD_NAME
:出现问题的 Pod 的名称。NAMESPACE_NAME
:Pod 所在的命名空间。如果您不确定是哪个命名空间,可查看kubectl get pods
命令输出中的Namespace
列。
kubectl describe
命令的输出包含有关资源的详细信息。在排查 Pod 问题时,您可以重点查看以下几个部分:
Status
:Pod 的当前状态。Conditions
:Pod 的总体健康状况和就绪状态。Restart Count
:Pod 中的容器已重启的次数。如果该数值过高,则可能需要引起注意。Events
:此 Pod 发生的重要事件的日志,例如被调度到节点、拉取其容器映像,以及是否发生任何错误。在Events
部分,您通常可以找到有关 Pod 故障原因的直接线索。
与 kubectl get
命令类似,您可以使用 kubectl describe
命令详细了解多种类型的资源。如需查看您可以探索的资源的完整列表,请参阅 Kubernetes 文档中的 kubectl describe。
后续步骤
请参阅使用 Cloud Logging 进行历史分析(本系列的下一页)。
如需了解这些概念的实际应用,请参阅问题排查示例场景。
如需有关解决特定问题的建议,请查看 GKE 的问题排查指南。
如果您在文档中找不到问题的解决方案,请参阅获取支持以获取进一步的帮助,包括以下主题的建议:
- 请与 Cloud Customer Care 联系,以提交支持请求。
- 通过在 StackOverflow 上提问并使用
google-kubernetes-engine
标记搜索类似问题,从社区获得支持。您还可以加入#kubernetes-engine
Slack 频道,以获得更多社区支持。 - 使用公开问题跟踪器提交 bug 或功能请求。