本页面介绍如何解决 Google Kubernetes Engine (GKE) 集群上与系统指标相关的问题。
集群中的指标未显示在 Cloud Monitoring 中
确保您已在项目中启用 Monitoring API 和 Logging API。您还应确认自己能够在Google Cloud 控制台的 Cloud Monitoring 概览部分中查看项目。
如果问题仍然存在,请检查是否有以下现象:
- 您是否已在集群上启用监控? - 对于通过 Google Cloud 控制台和 Google Cloud CLI 创建的集群,Monitoring 默认处于启用状态,不过您可以通过运行以下命令,点击 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 中。 
- heapster或- gke-metrics-agent(OpenTelemetry 收集器)是否正在- kube-system命名空间中的集群中运行?- 此 Pod 可能无法调度工作负载,因为您的集群没有足够资源。通过运行 - kubectl get pods --namespace=kube-system并检查名称中带有- heapster或- gke-metrics-agent的 Pod,检查 Heapster 或 OpenTelemetry 是否正在运行。
- 集群的控制层面是否能够与节点通信? - Cloud Monitoring 依赖于这种通信。您可以通过运行以下命令来检查控制平面是否正在与节点通信: - kubectl logs POD_NAME- 如果此命令返回错误,则问题可能是 SSH 隧道导致的。如需查看问题排查步骤,请参阅排查 SSH 问题。 
识别并解决写入指标的权限问题
  GKE 使用关联到节点的 IAM 服务账号来运行日志记录和监控等系统任务。这些节点服务账号必须至少拥有项目的 Kubernetes Engine Default Node Service Account (roles/container.defaultNodeServiceAccount) 角色。默认情况下,GKE 会将 Compute Engine 默认服务账号(在您的项目中自动创建)用作节点服务账号。
如果您的组织强制执行 iam.automaticIamGrantsForDefaultServiceAccounts 组织政策限制,则项目中的默认 Compute Engine 服务账号可能无法自动获得 GKE 所需的权限。
- 如需找出问题,请检查集群的系统监控工作负载中的 - 401错误:- [[ $(kubectl logs -l k8s-app=gke-metrics-agent -n kube-system -c gke-metrics-agent | grep -cw "Received 401") -gt 0 ]] && echo "true" || echo "false"- 如果输出为 - true,则表示系统工作负载发生 401 错误,这表明缺少权限。如果输出为- false,请跳过其余步骤,并尝试其他问题排查步骤。
如需向 Compute Engine 默认服务账号授予 roles/container.defaultNodeServiceAccount 角色,请完成以下步骤:
控制台
gcloud
- 找到您的 Google Cloud 项目编号:
gcloud projects describe PROJECT_ID \ --format="value(projectNumber)" 将 PROJECT_ID替换为您的项目 ID。输出内容类似如下: 12345678901 
- 将 roles/container.defaultNodeServiceAccount角色授予 Compute Engine 默认服务账号:gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \ --role="roles/container.defaultNodeServiceAccount" 将 PROJECT_NUMBER替换为上一步中的项目编号。
确认指标代理具有足够的内存
如果您已尝试上述问题排查步骤,但指标仍未显示,则表示指标代理的内存不足。
在大多数情况下,默认向 GKE 指标代理分配的资源是足够的。但是,如果 DaemonSet 反复崩溃,您可以按照以下说明检查终止原因:
- 获取 GKE 指标代理 Pod 的名称: - kubectl get pods -n kube-system -l component=gke-metrics-agent
- 查找状态为 - CrashLoopBackOff的 Pod。- 输出类似于以下内容: - NAME READY STATUS RESTARTS AGE gke-metrics-agent-5857x 0/1 CrashLoopBackOff 6 12m
- 描述状态为 - 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"
- 向具有失败指标代理的节点添加节点标签。您可以使用永久性节点标签,也可以使用临时节点标签。 我们建议您尝试再增加 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
 
- 添加 10 MB:
- COMPUTE_LOCATION:集群的 Compute Engine 位置。
 - 或者,您也可以使用以下命令添加升级后不会保留的临时节点标签: - kubectl label node/NODE_NAME \ ADDITIONAL_MEMORY_NODE_LABEL --overwrite- 替换以下内容: - NODE_NAME:受影响的指标代理的节点名称。
- ADDITIONAL_MEMORY_NODE_LABEL:其中一个额外内存节点标签;请使用上述示例中的一个值。
 
后续步骤
- 如果您遇到与 Cloud Logging 代理相关的问题,请参阅其问题排查文档。 
- 如果您在文档中找不到问题的解决方案,请参阅获取支持以获取进一步的帮助,包括以下主题的建议: - 请与 Cloud Customer Care 联系,以提交支持请求。
- 通过在 StackOverflow 上提问并使用 google-kubernetes-engine标记搜索类似问题,从社区获得支持。您还可以加入#kubernetes-engineSlack 频道,以获得更多社区支持。
- 使用公开问题跟踪器提交 bug 或功能请求。