无法通过Pub/Sub读取Google Cloud Container Registry变更通知
排查GCR Pub/Sub通知接收失败的步骤
我之前在配置GCR镜像变更通知时也踩过类似的坑,咱们一步步来排查可能的问题点:
1. 确认订阅与GCR主题的关联正确性
先确保你的订阅foo确实绑定到了GCR的官方主题projects/[PROJECT-ID]/topics/gcr:
- 执行命令验证:
查看输出中的gcloud pubsub subscriptions describe footopic字段,确认其值完全匹配GCR的主题路径。如果不匹配,说明订阅关联错了主题,需要重新创建订阅。
2. 核对权限配置的细节
权限配置很容易搞混对象,要分清楚两个关键账号的权限:
- GCR发布通知的服务账号:
service-[PROJECT-NUMBER]@gcp-sa-containerregistry.iam.gserviceaccount.com,必须拥有pubsub.publisher权限在gcr主题上。检查命令:
确保该服务账号出现在IAM绑定列表中,且角色为gcloud pubsub topics get-iam-policy projects/[PROJECT-ID]/topics/gcrroles/pubsub.publisher。 - 脚本使用的服务账号:需要拥有
pubsub.subscriber权限在订阅foo上。同样用get-iam-policy命令检查订阅的权限配置,确认你的账号有对应的订阅权限。
3. 检查Ruby脚本的实现细节
脚本的逻辑或配置错误也会导致收不到消息:
- 确认脚本中使用的项目ID、订阅名称完全正确,比如参考官方风格的拉取代码:
require "google/cloud/pubsub" # 初始化Pub/Sub客户端 pubsub = Google::Cloud::Pubsub.new(project_id: "你的项目ID") # 获取目标订阅 subscription = pubsub.subscription "foo" # 监听消息 subscription.listen do |message| puts "收到镜像变更通知:#{message.data}" # 必须确认消息,否则会重复推送 message.acknowledge! end.wait! - 确保脚本运行环境已正确配置认证:要么设置环境变量
GOOGLE_APPLICATION_CREDENTIALS指向你的服务账号密钥文件,要么运行在GCP内部环境(如GCE、GKE)并使用默认服务账号(需确保默认账号有订阅权限)。
4. 验证消息流是否正常
- 先给主题
gcr手动发送一条测试消息,看脚本能否接收:
如果脚本能收到这条测试消息,说明订阅和脚本没问题,问题出在GCR未触发通知;如果收不到,继续排查订阅和脚本的配置。gcloud pubsub topics publish projects/[PROJECT-ID]/topics/gcr --message "test-gcr-notification" - 确认GCR确实启用了通知:执行
gcloud container images list-notifications,查看输出中是否有绑定到gcr主题的通知配置。如果没有,需要重新配置GCR的通知规则(即使是默认主题,有时候也需要显式启用)。
5. 考虑延迟因素
GCR的通知推送可能有几秒到数十秒的延迟,推送镜像后不要立刻判定收不到消息,稍等几分钟再检查脚本的输出。
内容的提问来源于stack exchange,提问作者Borja Martín
相关产品推荐
相关产品推荐

