本页面介绍了如何调查和解决 GKE 日志记录相关问题。
如果您需要其他帮助,请与 Cloud Customer Care 联系。Cloud Logging 中缺少集群日志
验证项目中是否已启用日志记录
列出已启用的服务:
gcloud services list --enabled --filter="NAME=logging.googleapis.com"
以下输出表明已为项目启用日志记录:
NAME TITLE logging.googleapis.com Cloud Logging API
可选:查看日志查看器中的日志,以确定谁停用了 API 以及何时停用 API:
protoPayload.methodName="google.api.serviceusage.v1.ServiceUsage.DisableService" protoPayload.response.services="logging.googleapis.com"
如果日志记录已停用,请启用日志记录:
gcloud services enable logging.googleapis.com
验证集群上是否已启用日志记录
列出集群:
gcloud container clusters list \ --project=PROJECT_ID \ '--format=value(name,loggingConfig.componentConfig.enableComponents)' \ --sort-by=name | column -t
替换以下内容:
PROJECT_ID
:您的 Google Cloud 项目 ID。
输出内容类似如下:
cluster-1 SYSTEM_COMPONENTS cluster-2 SYSTEM_COMPONENTS;WORKLOADS cluster-3
如果集群的值为空,则停用日志记录。例如,此输出中的
cluster-3
已停用日志记录。如果设置为
NONE
,则启用集群日志记录:gcloud container clusters update CLUSTER_NAME \ --logging=SYSTEM,WORKLOAD \ --location=COMPUTE_LOCATION
替换以下内容:
CLUSTER_NAME
:您的集群的名称。COMPUTE_LOCATION
:集群的 Compute Engine 位置。
验证节点池中的节点是否具有 Cloud Logging 访问权限范围
节点需要以下范围之一才能将日志写入 Cloud Logging:
https://www.googleapis.com/auth/logging.write
https://www.googleapis.com/auth/cloud-platform
https://www.googleapis.com/auth/logging.admin
检查为集群中的每个节点池配置的范围:
gcloud container node-pools list --cluster=CLUSTER_NAME \ --format="table(name,config.oauthScopes)" \ --location COMPUTE_LOCATION
替换以下内容:
CLUSTER_NAME
:您的集群的名称。COMPUTE_LOCATION
:集群的 Compute Engine 位置。
将工作负载从旧节点池迁移到新创建的节点池,并监控进度。
创建具有正确日志记录范围的新节点池:
gcloud container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location=COMPUTE_LOCATION \ --scopes="gke-default"
替换以下内容:
CLUSTER_NAME
:您的集群的名称。COMPUTE_LOCATION
:集群的 Compute Engine 位置。
验证节点池的服务账号是否具有拥有正确 IAM 权限的角色
该服务账号必须具有可提供用于创建日志的 logging.logEntries.create
权限的角色。
找到每个节点池的服务账号:
gcloud container node-pools list \ --cluster=CLUSTER_NAME \ --format="table(name,config.serviceAccount)" \ --location=COMPUTE_LOCATION
替换以下内容:
CLUSTER_NAME
:您的集群的名称。COMPUTE_LOCATION
:集群的 Compute Engine 位置。
输出类似于以下内容:
NAME SERVICE_ACCOUNT default-pool gke-cluster-sa@developer.gserviceaccount.com
如果节点池使用默认的 Compute Engine 服务账号,您可以使用以下命令进行描述。最佳做法是为节点池使用具有最低权限的自定义服务账号。 默认的 Compute Engine 服务账号包含运行集群所需的最低权限。
gcloud compute project-info describe --format="table(defaultServiceAccount)"
验证 IAM 角色是否具有足够的权限。
查看授予特定服务账号的角色中包含的权限:
gcloud projects get-iam-policy PROJECT_ID \ --flatten="bindings[]" \ --filter="bindings.members=serviceAccount:SERVICE_ACCOUNT" \ --format="table[box](bindings.role)"
将可提供
logging.logEntries.create
权限的角色授予服务账号。您可以使用预定义角色或创建自定义角色。
验证是否未达到 Cloud Logging Write API 配额
确认未达到 Cloud Logging 的 API 写入配额。
转到 Google Cloud 控制台中的配额页面。
按“Cloud Logging API”过滤表。
确认未达到任何配额。
使用 gcpdiag 调试 GKE 日志记录问题
如果您的 GKE 集群缺少日志或是获取的日志不完整,可使用gcpdiag
工具进行问题排查。gcpdiag
是一种开源工具,不是由官方提供支持的 Google Cloud 产品。您可以使用 gcpdiag
工具来帮助识别和修复 Google Cloud 项目问题。如需了解详情,请参阅 GitHub 上的 gcpdiag 项目。
- 项目级日志记录:确保托管 GKE 集群的 Google Cloud 项目已启用 Cloud Logging API。
- 集群级日志记录:确认是否在 GKE 集群的配置中明确启用了日志记录。
- 节点池权限:确认集群节点池中的节点已启用“Cloud Logging 写入”范围,从而允许它们发送日志数据。
- 服务账号权限:确认节点池使用的服务账号是否具有与 Cloud Logging 交互所需的 IAM 权限。具体而言,“roles/logging.logWriter”角色通常是必需的。
- Cloud Logging API 写入配额:确认是否未超出指定时间范围内的 Cloud Logging API 写入配额。
Google Cloud 控制台
- 完成然后复制以下命令。
- 打开 Google Cloud 控制台并激活 Cloud Shell。 打开 Cloud 控制台
- 粘贴复制的命令。
- 运行
gcpdiag
命令以下载gcpdiag
Docker 映像,然后执行诊断检查。如果适用,请按照输出说明修复失败的检查。
gcpdiag runbook gke/logs --project=PROJECT_ID \
--parameter name=GKE_NAME \
--parameter location=LOCATION
Docker
您可以使用封装容器运行 gcpdiag
,以在 Docker 容器中启动 gcpdiag
。必须安装 Docker 或 Podman。
- 在本地工作站上复制并运行以下命令。
curl https://gcpdiag.dev/gcpdiag.sh >gcpdiag && chmod +x gcpdiag
- 执行
gcpdiag
命令:./gcpdiag runbook gke/logs --project=PROJECT_ID \ --parameter name=GKE_NAME \ --parameter location=LOCATION
查看此 Runbook 的可用参数。
替换以下内容:
- PROJECT_ID:资源所在项目的 ID
- GKE_NAME:GKE 集群的名称。
- LOCATION:GKE 集群所在的可用区或区域。
实用标志:
--project
:PROJECT_ID--universe-domain
:如果适用,则为托管资源的可信合作伙伴主权云网域--parameter
或-p
:Runbook 参数
如需查看所有 gcpdiag
工具标志的列表和说明,请参阅 gcpdiag
使用说明。