You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GKE服务账户频繁调用compute.v1.BackendServicesService.Get返回404排查

2023-05-16 更新

奇怪的是,项目日志中完全没有这些方法调用的记录。我可能过度将日志输出到/dev/null,但日志中存在其他compute.googleapis.com/v1相关记录,唯独没有backendServices.get方法的记录。

PROJECT=".."
FILTER='
log_id("cloudaudit.googleapis.com/activity")
protoPayload.serviceName="compute.googleapis.com"
protoPayload.methodName=~"v1.compute"'

gcloud logging read "${FILTER}" \
--format="value(protoPayload.methodName)" \
--project=${PROJECT} \
| sort \
| uniq

输出结果:

v1.compute.addresses.insert
v1.compute.firewalls.insert
v1.compute.forwardingRules.insert
v1.compute.instanceGroups.addInstances
v1.compute.instanceGroups.insert
v1.compute.instances.insert
v1.compute.projects.setCommonInstanceMetadata
v1.compute.subnetworks.patch
v1.compute.subnetworks.setPrivateIpGoogleAccess

2023-05-15 更新

感谢@john-hanley提供的识别MYSTERY服务账户的方法。通过筛选审计日志,我发现了如下格式的条目:

logName: projects/ackal-230515/logs/cloudaudit.googleapis.com%2Factivity
protoPayload:
  ...
  request:
    '@type': type.googleapis.com/google.iam.v1.SetIamPolicyRequest
    policy:
      bindings:
      ...
      - members:
        - serviceAccountId:112852397007451968863
        role: roles/container.serviceAgent

项目的IAM策略绑定中,只有一个成员拥有该角色:

gcloud projects get-iam-policy ${PROJECT} \
--flatten="bindings[].members" \
--filter="bindings.role=\"roles/container.serviceAgent\""

执行结果:

bindings:
  members: serviceAccount:service-{number}@container-engine-robot.iam.gserviceaccount.com
  role: roles/container.serviceAgent

目前我已确定调用所用的服务账户,且了解其与Kubernetes Engine(GKE)相关,但无法理解该服务账户为何发起这些不必要的调用。

原始问题

我正在通过查看serviceruntime.googleapis.com/api/request_count中的consumed_api来审计项目的服务账户。

近期我将Kubernetes Engine(GKE)集群节点的服务账户从默认Compute Engine账户更换为拥有roles/container.nodeServiceAccount角色的用户托管账户,现需确保该服务账户无失败调用。

在非200响应结果中,发现每小时约有60次对compute.v1.BackendServicesService.Get的调用,且全部返回404。

问题:

  • 如何获取Google托管服务账户的唯一ID?
  • 是什么在使用该服务账户发起这些调用?
  • 为何Kubernetes Engine会使用该服务账户发起大量不必要的方法调用?

我使用了多种Google Cloud服务(Cloud Run、Kubernetes Engine等),但未使用负载均衡器,且项目中无任何后端服务:

gcloud compute backend-services list \
--project=${PROJECT}
Listed 0 items.

这些调用均由一个我无法识别的服务账户发起:100678112478450061433。

该ID不属于项目中的任何服务账户:

PROJECT="..." # Project ID
MYSTERY="100678112478450061433"

gcloud iam service-accounts list \
--project=${PROJECT} \
--format="value(uniqueId)" \
| grep ${MYSTERY}

同时,该ID也无法与项目IAM绑定中可查询的服务账户匹配:

PROJECT="..." # Project ID
MYSTERY="100678112478450061433"

EMAILS=$(
  gcloud projects get-iam-policy ${PROJECT} \
  --flatten="bindings[].members" \
  --filter="bindings.members~\"serviceAccount:*\"" \
  --format="value(bindings.members.split(sep=\":\").slice(1:))" \
  | uniq | sort)

for EMAIL in ${EMAILS}
do
  printf "%s: " ${EMAIL}
  ID=$(
    gcloud iam service-accounts describe ${EMAIL} \
    --format="value(uniqueId)" \
    2>/dev/null)
  if [ -z "${ID}" ]
  then
    echo "Inaccessible"
    continue
  fi
  if [ "${ID}" = "${MYSTERY}" ]
  then
    echo "Found!"
    break
  else
    echo "No match"
  fi
done

我猜测这是一个Google托管的服务账户,但不知道如何获取这些账户的唯一ID:

{NUMBER}@cloudbuild.gserviceaccount.com
{NUMBER}@cloudservices.gserviceaccount.com
service-{NUMBER}@compute-system.iam.gserviceaccount.com
service-{NUMBER}@container-engine-robot.iam.gserviceaccount.com
service-{NUMBER}@containerregistry.iam.gserviceaccount.com
service-{NUMBER}@firebase-rules.iam.gserviceaccount.com
service-{NUMBER}@gcf-admin-robot.iam.gserviceaccount.com
service-{NUMBER}@gcp-sa-artifactregistry.iam.gserviceaccount.com
service-{NUMBER}@gcp-sa-cloudbuild.iam.gserviceaccount.com
service-{NUMBER}@gcp-sa-cloudscheduler.iam.gserviceaccount.com
service-{NUMBER}@gcp-sa-firestore.iam.gserviceaccount.com
service-{NUMBER}@gcp-sa-pubsub.iam.gserviceaccount.com
service-{NUMBER}@serverless-robot-prod.iam.gserviceaccount.com

若能识别该服务账户,我就能更接近问题根源。


内容的提问来源于stack exchange,提问作者DazWilkin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 22:35:00