使用 kubectl 调查集群状态


诊断 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)的状态:

  1. 如需检查节点健康状况是否良好,请查看所有节点及其状态的详细信息:

    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 之外的任何状态都需要进一步调查。

  2. 如需检查 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

后续步骤