跨项目使用GCP Pub/Sub指标配置HPA遇权限问题求助
跨项目GKE HPA访问Pub/Sub指标的403权限问题解决
问题场景
我需要为ProjectA中的GKE工作负载配置HPA,使用ProjectB的Pub/Sub未投递消息数指标,但遇到如下权限拒绝错误:
Warning FailedGetExternalMetric 9s (x12 over 2m56s) horizontal-pod-autoscaler unable to get external metric default/pubsub.googleapis.com|subscription|num_undelivered_messages/&LabelSelector{MatchLabels:map[string]string{resource.labels.project_id: ProjectB,resource.labels.subscription_id: ProjectB.Subscription,},MatchExpressions:[]LabelSelectorRequirement{},}: unable to fetch metrics from external metrics API: the server could not find the descriptor for metric pubsub.googleapis.com/subscription/num_undelivered_messages: googleapi: Error 403: Permission monitoring.metricDescriptors.get denied (or the resource may not exist)., forbidden
已确认前置条件:
- 两个项目都分配了Monitoring.admin角色
- 已启用Pub/Sub API
- ProjectA内部的Pub/Sub指标可正常用于HPA配置
核心问题
错误提示的monitoring.metricDescriptors.get权限缺失,本质是GKE集群的Metrics Server/External Metrics Adapter使用的服务账号,没有跨项目访问ProjectB监控指标的权限——这和你手动操作的账号权限无关。
修复步骤
1. 找到GKE节点池的服务账号
查看ProjectA中GKE集群节点池使用的服务账号:
gcloud container node-pools describe YOUR_NODE_POOL_NAME --cluster=YOUR_CLUSTER_NAME --project=ProjectA
输出中找到serviceAccount字段,格式通常为[PROJECT_NUMBER]-compute@developer.gserviceaccount.com(默认计算引擎服务账号)。
2. 给该服务账号授予ProjectB的监控权限
在ProjectB中,为上述服务账号添加细粒度的监控读取权限(比Monitoring.admin更安全):
gcloud projects add-iam-policy-binding ProjectB \ --member="serviceAccount:[YOUR_SERVICE_ACCOUNT_FROM_STEP1]" \ --role="roles/monitoring.metricReader"
这个角色包含访问监控指标描述和时间序列数据的必要权限,足够满足HPA需求。
3. 配置Pub/Sub订阅的访问权限
确保服务账号能读取ProjectB的Pub/Sub订阅信息:
gcloud pubsub subscriptions add-iam-policy-binding ProjectB.Subscription \ --project=ProjectB \ --member="serviceAccount:[YOUR_SERVICE_ACCOUNT_FROM_STEP1]" \ --role="roles/pubsub.viewer"
4. 验证权限是否生效
用服务账号模拟访问ProjectB的监控指标:
# 仅测试用,生产环境请勿下载密钥 gcloud iam service-accounts keys create key.json --iam-account=[YOUR_SERVICE_ACCOUNT_FROM_STEP1] --project=ProjectA export GOOGLE_APPLICATION_CREDENTIALS=./key.json # 查询指标描述 gcloud monitoring metrics descriptors describe pubsub.googleapis.com/subscription/num_undelivered_messages --project=ProjectB
如果能成功返回指标详情,说明权限配置没问题。
5. 刷新HPA配置
删除并重新创建HPA资源,让它读取新的权限配置:
kubectl delete hpa YOUR_HPA_NAME kubectl apply -f your-hpa-config.yaml
注意事项
- 遵循最小权限原则:优先用
Monitoring Metric Reader而非Monitoring.admin,避免过度授权 - 跨项目IAM权限生效可能有1-2分钟延迟,不用反复操作
- 若使用自定义服务账号而非默认计算引擎账号,要确保该账号已正确关联到GKE节点池
内容的提问来源于stack exchange,提问作者Sachin Sahare
相关产品推荐
相关产品推荐

