如何从 GKE 节点拉/推 GCR

问题描述

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

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

enter image description here

现在,当我使用控制台通过 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-compu[email protected],它是认的计算实例服务帐户。以下是它拥有的权限(我手动添加Storage Object Creator 角色):

enter image description here

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

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

解决方法

想通了。我不得不:

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

一旦所有这些都完成,我的 Pod 就可以从 GCR 拉出和推送到 GCR。