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

无法通过Pub/Sub读取Google Cloud Container Registry变更通知

排查GCR Pub/Sub通知接收失败的步骤

我之前在配置GCR镜像变更通知时也踩过类似的坑,咱们一步步来排查可能的问题点:

1. 确认订阅与GCR主题的关联正确性

先确保你的订阅foo确实绑定到了GCR的官方主题projects/[PROJECT-ID]/topics/gcr:

  • 执行命令验证:
    gcloud pubsub subscriptions describe foo
    
    查看输出中的topic字段,确认其值完全匹配GCR的主题路径。如果不匹配,说明订阅关联错了主题,需要重新创建订阅。

2. 核对权限配置的细节

权限配置很容易搞混对象,要分清楚两个关键账号的权限:

  • GCR发布通知的服务账号:service-[PROJECT-NUMBER]@gcp-sa-containerregistry.iam.gserviceaccount.com,必须拥有pubsub.publisher权限在gcr主题上。检查命令:
    gcloud pubsub topics get-iam-policy projects/[PROJECT-ID]/topics/gcr
    
    确保该服务账号出现在IAM绑定列表中,且角色为roles/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手动发送一条测试消息,看脚本能否接收:
    gcloud pubsub topics publish projects/[PROJECT-ID]/topics/gcr --message "test-gcr-notification"
    
    如果脚本能收到这条测试消息,说明订阅和脚本没问题,问题出在GCR未触发通知;如果收不到,继续排查订阅和脚本的配置。
  • 确认GCR确实启用了通知:执行gcloud container images list-notifications,查看输出中是否有绑定到gcr主题的通知配置。如果没有,需要重新配置GCR的通知规则(即使是默认主题,有时候也需要显式启用)。

5. 考虑延迟因素

GCR的通知推送可能有几秒到数十秒的延迟,推送镜像后不要立刻判定收不到消息,稍等几分钟再检查脚本的输出。

内容的提问来源于stack exchange,提问作者Borja Martín

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 06:17:54