从 gcr.io 拉取时权限失败

Permission failure when pulling from gcr.io

我在 Google Compute Engine 上有 2 个虚拟机 运行。它们完全相同,只是它们 运行 在不同的服务帐户下。
这两个服务帐户(据我所知)对 gcr.io 使用的存储桶具有相同的权限

VM 启动时运行的 init 脚本从 gcr.io 中提取一个 docker 容器,在 VM 运行 上作为 data-dev-dp@project-id.iam.gserviceaccount.com拉取成功:

Unable to find image 'gcr.io/project-id/gdp/jupyterlab-py2-spark-notebook:1.9' locally
1.9: Pulling from project-id/gdp/jupyterlab-py2-spark-notebook
bc51dd8edc1b: Pulling fs layer
b56e3f6802e3: Pulling fs layer

在 VM 运行 上作为 data-dev-cmp@project-id.iam.gserviceaccount.com 拉取失败:

Unable to find image 'gcr.io/project-id/gdp/jupyterlab-py2-spark-notebook:1.9' locally
/usr/bin/docker: Error response from daemon: pull access denied for gcr.io/project-id/gdp/jupyterlab-py2-spark-notebook, repository does not exist or may require 'docker login': denied: Permission denied for "1.9" from request "/v2/project-id/gdp/jupyterlab-py2-spark-notebook/manifests/1.9"

我的印象是,对存储桶具有相同的权限就足够了,因此我想知道还需要哪些其他权限才能完成这项工作。谁能提出建议?


更新。我使用工具箱 (https://cloud.google.com/container-optimized-os/docs/how-to/toolbox) 来验证这两个帐户对存储桶的权限是否相同:

# gsutil ls gs://artifacts.project-id.appspot.com
gs://artifacts.project-id.appspot.com/containers/
# gsutil ls gs://artifacts.project-id.appspot.com
AccessDeniedException: 403 data-dev-cmp@project-id.iam.gserviceaccount.com does not have storage.objects.list access to artifacts.project-id.appspot.com.

很明显,这就是问题的原因,但我发现很奇怪,我上面从 GCP 控制台截取的屏幕截图显示出不同的结果。我正在继续调查。

事实证明,这是一个我们再熟悉不过的问题,因为我们不断地创建基础设施,将其拆除,然后重新竖立起来。这样做时,特别是当这些操作没有完全发生时(就像今天的情况一样),我们会发现自己处于将角色分配给服务帐户的旧实例的位置。控制台会告诉您该帐户已分配有角色,但实际上并非如此。我们经常遇到这个问题。

这次的解决方案是彻底拆除所有基础设施,然后重新创建,包括出现问题的服务帐户。