如何阻止gke-metadata-server持续生成重复认证访问日志
问题根因
你看到的gke-metadata-server返回HTTP/200的INFO级日志是组件的默认输出,每次业务操作都触发这类日志的核心原因有两个:
- 业务容器内的GCP服务客户端没有正确缓存访问令牌,每次调用Pub/Sub拉消息、BigQuery写数据的接口时,都会重新向metadata server发起令牌申请
- GKE集群默认部署的
gke-metadata-server日志级别设为INFO,所有成功的令牌请求都会被记录,哪怕是正常的周期性令牌刷新也会产生日志
解决方案
按照优先级从高到低选择以下方案处理:
方案1:优化应用侧令牌缓存(优先选,从根源减少无效请求)
每次业务操作都申请新令牌本身属于不必要的性能损耗,优先排查修复应用配置:
- 不要在每次处理单条Pub/Sub消息、执行BigQuery写入时重新初始化服务客户端,把Pub/Sub订阅客户端、BigQuery客户端初始化为全局单例,复用长连接和客户端自动缓存的令牌
- 升级业务依赖的GCP官方客户端库到最新稳定版,旧版本客户端存在令牌缓存逻辑失效、每次API调用都重新拉取令牌的已知bug
- 如果是自行封装HTTP请求调用GCP API,需要自行实现令牌缓存:GCP访问令牌默认有效期为1小时,只需要在令牌过期前5分钟左右刷新即可,不需要每次请求都申请新令牌
正常配置的Workload Identity工作负载,每小时只会发起1-2次令牌刷新请求,不会在每次业务操作时触发metadata server请求
方案2:调整gke-metadata-server日志级别,屏蔽冗余INFO日志
如果已经确认客户端配置无误,只是不需要这类正常请求的日志,可以调整组件日志级别,仅保留警告、错误级别的日志输出:
- 执行命令编辑DaemonSet配置:
kubectl edit daemonset gke-metadata-server -n kube-system
- 找到容器的启动参数段,新增
--v=0启动参数,注意保留原有其他参数不要删除:
containers: - args: - --v=0 # 下方原有其他启动参数保持不变 image: gke.gcr.io/gke-metadata-server:对应版本号
- 保存退出后,DaemonSet会自动滚动更新所有节点上的gke-metadata-server Pod,更新完成后就不会再打印这类令牌请求的INFO日志。
注意:该调整不会影响Workload Identity的正常鉴权逻辑,仅关闭了正常成功请求的日志输出,权限错误、组件故障类的异常日志仍然会正常打印。
方案3:配置云日志排除规则(无需修改集群配置)
如果不想改动集群组件配置,可以直接在云日志侧过滤掉这类冗余日志:
- 进入GCP云日志的「日志路由器」页面,找到项目默认的日志存储桶,新建排除规则
- 排除过滤器填入以下匹配规则,精准定位这类日志:
resource.type="k8s_container" resource.labels.container_name="gke-metadata-server" jsonPayload.message=~"/computeMetadata/v1/instance/service-accounts/.*/token" severity="INFO"
- 保存规则后,后续匹配到的这类日志不会再写入日志存储,也不会产生对应的日志存储费用。
内容的提问来源于stack exchange,提问作者wayne64001
相关产品推荐
相关产品推荐

