如何从 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
客户端执行额外的步骤来进行身份验证?
想通了。我必须:
- 使用
roles/storage.objectAdmin
创建服务帐户
- 为该服务帐户生成密钥
- 将该密钥作为秘密存储在 GKE 中
- 将那个秘密装入我的 pods
- 运行
gcloud auth activate-service-account --key-file <path to key>
- 运行
gcloud auth configure-docker
完成所有这些后,我的 pods 就可以从 GCR 拉取并推送到 GCR。
我正在构建一个我将在 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
客户端执行额外的步骤来进行身份验证?
想通了。我必须:
- 使用
roles/storage.objectAdmin
创建服务帐户
- 为该服务帐户生成密钥
- 将该密钥作为秘密存储在 GKE 中
- 将那个秘密装入我的 pods
- 运行
gcloud auth activate-service-account --key-file <path to key>
- 运行
gcloud auth configure-docker
完成所有这些后,我的 pods 就可以从 GCR 拉取并推送到 GCR。