本页面介绍如何解决 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 或功能请求。