排查系统指标问题


本页面介绍了如何解决 Google Kubernetes Engine (GKE) 集群上的系统指标相关问题。

如果您需要其他帮助,请与 Cloud Customer Care 联系。

集群中的指标未显示在 Cloud Monitoring 中

确保您已在项目中启用 Monitoring APILogging API。您还应确认自己能够在 Google Cloud 控制台中的 Cloud Monitoring 概览中查看项目。

如果问题仍然存在,请检查是否有以下现象:

  • 您是否已在集群上启用监控?

    对于从 Google Cloud 控制台以及从 Google Cloud CLI 创建的集群,默认启用监控,但您可以运行以下命令或点击 Google Cloud 控制台中的集群详细信息进行验证:

    gcloud container clusters describe CLUSTER_NAME
    

    此命令的输出应包含 monitoringConfig 部分的 enableComponents 列表中的 SYSTEM_COMPONENTS,类似于以下示例:

    monitoringConfig:
      componentConfig:
        enableComponents:
        - SYSTEM_COMPONENTS
    

    如果未启用监控,请运行以下命令启用:

    gcloud container clusters update CLUSTER_NAME --monitoring=SYSTEM
    
  • 自创建集群或启用其监控功能以来已经有多长时间了?

    新集群的指标最多可能需要一个小时才能开始显示在 Cloud Monitoring 中。

  • heapstergke-metrics-agent(OpenTelemetry 收集器)是否正在 kube-system 命名空间中的集群中运行?

    此 Pod 可能无法调度工作负载,因为您的集群没有足够资源。通过运行 kubectl get pods --namespace=kube-system 并检查名称中带有 heapstergke-metrics-agent 的 Pod,检查 Heapster 或 OpenTelemetry 是否正在运行。

  • 集群的控制层面是否能够与节点通信?

    Cloud Monitoring 依赖于这种通信。您可以通过运行以下命令来检查控制平面是否正在与节点通信:

    kubectl logs POD_NAME
    

    如果此命令返回错误,则问题可能是 SSH 隧道导致的。如需查看问题排查步骤,请参阅排查 SSH 问题

确认指标代理具有足够的内存

如果您已尝试上述问题排查步骤,但指标仍未显示,则表示指标代理的内存不足。

在大多数情况下,默认向 GKE 指标代理分配的资源是足够的。但是,如果 DaemonSet 反复崩溃,您可以按照以下说明检查终止原因:

  1. 获取 GKE 指标代理 Pod 的名称:

    kubectl get pods -n kube-system -l component=gke-metrics-agent
    
  2. 查找状态为 CrashLoopBackOff 的 Pod。

    输出类似于以下内容:

    NAME                    READY STATUS           RESTARTS AGE
    gke-metrics-agent-5857x 0/1   CrashLoopBackOff 6        12m
    
  3. 描述状态为 CrashLoopBackOff 的 Pod:

    kubectl describe pod POD_NAME -n kube-system
    

    POD_NAME 替换为上一步中 Pod 的名称。

    如果 Pod 的终止原因为 OOMKilled,则代理需要额外的内存。

    输出类似于以下内容:

      containerStatuses:
      ...
      lastState:
        terminated:
          ...
          exitCode: 1
          finishedAt: "2021-11-22T23:36:32Z"
          reason: OOMKilled
          startedAt: "2021-11-22T23:35:54Z"
    
  4. 向具有失败指标代理的节点添加节点标签。您可以使用永久性节点标签,也可以使用临时节点标签。 我们建议您尝试再增加 20 MB。如果代理不断崩溃,您可以再次运行此命令,注意将节点标签替换为请求更多内存的标签。

    如需使用永久性标签更新节点池,请运行以下命令:

    gcloud container node-pools update NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --node-labels=ADDITIONAL_MEMORY_NODE_LABEL \
        --location=COMPUTE_LOCATION
    

    请替换以下内容:

    • NODEPOOL_NAME:节点池的名称。
    • CLUSTER_NAME:现有集群的名称。
    • ADDITIONAL_MEMORY_NODE_LABEL:其中一个额外内存节点标签;请使用以下任一项:
      • 添加 10 MB:cloud.google.com/gke-metrics-agent-scaling-level=10
      • 添加 20 MB:cloud.google.com/gke-metrics-agent-scaling-level=20
      • 添加 50 MB:cloud.google.com/gke-metrics-agent-scaling-level=50
      • 添加 100 MB:cloud.google.com/gke-metrics-agent-scaling-level=100
      • 添加 200 MB:cloud.google.com/gke-metrics-agent-scaling-level=200
      • 添加 500 MB:cloud.google.com/gke-metrics-agent-scaling-level=500
    • COMPUTE_LOCATION:集群的 Compute Engine 位置

    或者,您也可以使用以下命令添加升级后不会保留的临时节点标签:

    kubectl label node/NODE_NAME \
    ADDITIONAL_MEMORY_NODE_LABEL --overwrite
    

    替换以下内容:

    • NODE_NAME:受影响的指标代理的节点名称。
    • ADDITIONAL_MEMORY_NODE_LABEL:其中一个额外内存节点标签;请使用上述示例中的一个值。

后续步骤