问题描述
我正在构建一个将在 GKE 中运行的应用。这个应用程序将使用 shell 命令(现在)来构建 docker 镜像并尝试将它们推送到 GCR。我发现当我尝试从 GKE 中运行的 pod 执行此操作时,我遇到了身份验证问题。我无法弄清楚为什么会出现这些身份验证问题。
这是我迄今为止完成的所有调试的列表。在最高级别,我的 GKE 集群具有 https://www.googleapis.com/auth/devstorage.read_write
oauth 范围。当我检查底层 GCE 实例的权限时,我看到了这些权限 - 请注意 Read Write
的 Storage
值:
现在,当我使用控制台通过 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
角色):
将 Storage Object Creator
角色添加到该服务帐户没有帮助。
我的身份验证方法是否存在根本性缺陷?似乎我已经准备好从 GKE 的 GCR 拉/推所有正确的部分。也许我需要为 docker
客户端执行额外的步骤来进行身份验证?
解决方法
想通了。我不得不:
- 使用
roles/storage.objectAdmin
创建一个服务帐户
- 为该服务帐号生成密钥
- 将该密钥作为秘密存储在 GKE 中
- 将这个秘密安装到我的 Pod 中
- 运行
gcloud auth activate-service-account --key-file <path to key>
- 运行
gcloud auth configure-docker
一旦所有这些都完成,我的 Pod 就可以从 GCR 拉出和推送到 GCR。