如何从 GKE 节点 pull/push from/to GCR

How to pull/push from/to GCR from GKE node

我正在构建一个我将在 GKE 中 运行 的应用程序。此应用程序将使用 shell 命令(目前)构建 docker 图像并尝试将它们推送到 GCR。我发现当我尝试从 GKE 中的 pod 运行ning 执行此操作时,我遇到了身份验证问题。我无法弄清楚为什么会出现这些身份验证问题。

这是我到目前为止所做的所有调试的列表。在最高级别,我的 GKE 集群具有 https://www.googleapis.com/auth/devstorage.read_write oauth 范围。当我检查底层 GCE 实例的权限时,我看到了这些权限 - 请注意 Storage:

Read Write

现在,当我使用控制台 SSH 进入该实例并列出 docker 图像时,我看到 GKE 在启动我的 pod 时使用的图像:

paymahn@gke-prod-478557c-default-pool-e9314f46-d9mn ~ $ docker image ls
REPOSITORY                                                              TAG                 IMAGE ID            CREATED             SIZE
gcr.io/gadic-310112/server                                              latest              8f8a22237c31        2 days ago          1.85GB
...

但是,如果我尝试在通过 SSH 连接到 GCP 实例时手动拉取该映像,我会遇到身份验证问题:

paymahn@gke-prod-478557c-default-pool-e9314f46-d9mn ~ $ docker pull gcr.io/gadic-310112/server:latest
Error response from daemon: unauthorized: You don't have the needed permissions to perform this operation, and you may have invalid credentials. To authenticate your request, follow the steps in: https://cloud.google.com/container-registry/docs/advanced-authentication

我还查看了服务帐户 65106360748-compute@developer.gserviceaccount.com,它是默认的计算实例服务帐户。这是它拥有的权限(我手动添加了 Storage Object Creator 角色):

向该服务帐户添加 Storage Object Creator 角色没有帮助。

我的身份验证方法是否存在根本性缺陷?似乎我已经准备好从 GKE 到 GCR 的 pull/push 的所有正确部分。也许我需要为 docker 客户端执行额外的步骤来进行身份验证?

想通了。我必须:

  1. 使用 roles/storage.objectAdmin
  2. 创建服务帐户
  3. 为该服务帐户生成密钥
  4. 将该密钥作为秘密存储在 GKE 中
  5. 将那个秘密装入我的 pods
  6. 运行 gcloud auth activate-service-account --key-file <path to key>
  7. 运行 gcloud auth configure-docker

完成所有这些后,我的 pods 就可以从 GCR 拉取并推送到 GCR。