使用 JSON 密钥文件的身份验证方法:未授权:GCR 登录失败
Authentication methods using a JSON key file: unauthorized: GCR login failed
主要寄往:google-cloud-platform
我要解决的总体问题是;从私有 Kubernetes 的 Google Container Registry 中拉取镜像。
更新 如果那边有人遇到这个问题,只需添加 heptio-contour - 因为 Heptio 的好人已经创建了问题中提到的脚本 - 谢谢。
第一步是使用带有 JSON 密钥的服务帐户 - 如 here 所述。
但是当我 运行:
cat gcr-sa-key.json | docker login -u _json_key --password-stdin https://gcr.io
我应该可以登录 docker,但失败了:
cat gcr-sa-key.json | docker login -u _json_key --password-stdin https://gcr.io
Error response from daemon: Get https://gcr.io/v2/: unauthorized: GCR login failed. You may have invalid credentials. To login successfully, follow the steps in: https://cloud.google.com/container-registry/docs/advanced-authentication
注意:我从 运行ning this 得到了 gcr-sa-key.json
文件 - 请记住,我总体上正在尝试使用它来自 Kubernetes。
我希望这是一个 Google 问题,but/and 如果我按照 Heptio 文档中的描述 运行 我得到:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 50s default-scheduler Successfully assigned default/<image-name>-deployment-v1-844568c768-5b2rt to my-cluster-digitalocean-1-7781
Normal Pulling 37s (x2 over 48s) kubelet, my-cluster-digitalocean-1-7781 pulling image "gcr.io/<project-name><image-name>:v1"
Warning Failed 37s (x2 over 48s) kubelet, my-cluster-digitalocean-1-7781 Failed to pull image "gcr.io/<project-name>/<image-name>:v1": rpc error: code = Unknown desc = Error response from daemon: pull access denied for gcr.io/<project-name>/<image-name>, repository does not exist or may require 'docker login'
Warning Failed 37s (x2 over 48s) kubelet, my-cluster-digitalocean-1-7781 Error: ErrImagePull
Normal SandboxChanged 31s (x7 over 47s) kubelet, my-cluster-digitalocean-1-7781 Pod sandbox changed, it will be killed and re-created.
Normal BackOff 29s (x6 over 45s) kubelet, my-cluster-digitalocean-1-7781 Back-off pulling image "gcr.io/<project-name>/<image-name>:v1"
Warning Failed 29s (x6 over 45s) kubelet, my-cluster-digitalocean-1-7781 Error: ImagePullBackOff
只是信息。这可能是相关的,我在 github.
上看到了 this 问题
您错过了最重要的一点,您需要以某种方式授予 Kubernetes 的默认服务帐户(最简单的方法)在拉取图像时访问您的私有容器注册表的权限。您分三步完成此操作:
- 在 AIM 中创建并授予您的 GCP 服务帐户适当的角色(至少是存储对象查看器),如官方文档here中的解释
- 使用为您的 GCP 服务帐户下载的 JSON 密钥创建 kubernetes 秘密('docker-registry' 类型)
kubectl create secret docker-registry my-private-gcr-readonly \
--docker-server=gcr.io \
--docker-username=_json_key \
--docker-password="$(cat /usr/local/home/demo/414141.json)" \
--docker-email=some@project-id.iam.gserviceaccount.com
- 授予您的默认 Kubernetes 服务帐户(默认情况下您的 PODs 在其安全上下文中 运行)从私有 GCR 存储库中提取图像的权利。这是间接完成的,通过为它分配 imagePull 操作的秘密:
kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "my-private-gcr-readonly"}]}'
就是这样!
PS.
您还可以查看 this 教程,该教程解释了从 Kubernetes 集群中访问 Google Container Registry 的两种方法(使用 JSON 密钥或访问令牌)
主要寄往:google-cloud-platform
我要解决的总体问题是;从私有 Kubernetes 的 Google Container Registry 中拉取镜像。
更新 如果那边有人遇到这个问题,只需添加 heptio-contour - 因为 Heptio 的好人已经创建了问题中提到的脚本 - 谢谢。
第一步是使用带有 JSON 密钥的服务帐户 - 如 here 所述。
但是当我 运行:
cat gcr-sa-key.json | docker login -u _json_key --password-stdin https://gcr.io
我应该可以登录 docker,但失败了:
cat gcr-sa-key.json | docker login -u _json_key --password-stdin https://gcr.io
Error response from daemon: Get https://gcr.io/v2/: unauthorized: GCR login failed. You may have invalid credentials. To login successfully, follow the steps in: https://cloud.google.com/container-registry/docs/advanced-authentication
注意:我从 运行ning this 得到了 gcr-sa-key.json
文件 - 请记住,我总体上正在尝试使用它来自 Kubernetes。
我希望这是一个 Google 问题,but/and 如果我按照 Heptio 文档中的描述 运行 我得到:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 50s default-scheduler Successfully assigned default/<image-name>-deployment-v1-844568c768-5b2rt to my-cluster-digitalocean-1-7781
Normal Pulling 37s (x2 over 48s) kubelet, my-cluster-digitalocean-1-7781 pulling image "gcr.io/<project-name><image-name>:v1"
Warning Failed 37s (x2 over 48s) kubelet, my-cluster-digitalocean-1-7781 Failed to pull image "gcr.io/<project-name>/<image-name>:v1": rpc error: code = Unknown desc = Error response from daemon: pull access denied for gcr.io/<project-name>/<image-name>, repository does not exist or may require 'docker login'
Warning Failed 37s (x2 over 48s) kubelet, my-cluster-digitalocean-1-7781 Error: ErrImagePull
Normal SandboxChanged 31s (x7 over 47s) kubelet, my-cluster-digitalocean-1-7781 Pod sandbox changed, it will be killed and re-created.
Normal BackOff 29s (x6 over 45s) kubelet, my-cluster-digitalocean-1-7781 Back-off pulling image "gcr.io/<project-name>/<image-name>:v1"
Warning Failed 29s (x6 over 45s) kubelet, my-cluster-digitalocean-1-7781 Error: ImagePullBackOff
只是信息。这可能是相关的,我在 github.
上看到了 this 问题您错过了最重要的一点,您需要以某种方式授予 Kubernetes 的默认服务帐户(最简单的方法)在拉取图像时访问您的私有容器注册表的权限。您分三步完成此操作:
- 在 AIM 中创建并授予您的 GCP 服务帐户适当的角色(至少是存储对象查看器),如官方文档here中的解释
- 使用为您的 GCP 服务帐户下载的 JSON 密钥创建 kubernetes 秘密('docker-registry' 类型)
kubectl create secret docker-registry my-private-gcr-readonly \
--docker-server=gcr.io \
--docker-username=_json_key \
--docker-password="$(cat /usr/local/home/demo/414141.json)" \
--docker-email=some@project-id.iam.gserviceaccount.com
- 授予您的默认 Kubernetes 服务帐户(默认情况下您的 PODs 在其安全上下文中 运行)从私有 GCR 存储库中提取图像的权利。这是间接完成的,通过为它分配 imagePull 操作的秘密:
kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "my-private-gcr-readonly"}]}'
就是这样!
PS.
您还可以查看 this 教程,该教程解释了从 Kubernetes 集群中访问 Google Container Registry 的两种方法(使用 JSON 密钥或访问令牌)