2

主要针对:google-cloud-platform

我要解决的总体问题是;从私有 Kubernetes 的 Google Container Registry 中提取图像。

更新刚刚添加了 heptio-contour 如果有人遇到这个问题 - 因为 Heptio 的好人已经创建了问题中提到的脚本 - 谢谢。

第一步是使用带有 JSON 密钥的服务帐户 - 如此所述。
但是当我运行时:

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

注意:我gcr-sa-key.json从运行这个文件中得到了这个文件——请记住,我总体上是在尝试从 Kubernetes 中使用它。

我希望这是一个谷歌问题,但是/如果我按照 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 上看到了这个问题。

4

1 回答 1

2

您错过了最重要的一点,您需要以某种方式授予 Kubernetes 的默认服务帐户(最简单的方法)在拉取图像时访问您的私有容器注册表的权限。您可以通过三个步骤执行此操作:

  1. 如官方文档中所述在 AIM(至少存储对象查看器)中创建并授予您的 GCP 服务帐户适当的角色
  2. 使用为您的 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

  1. 授予您的默认 Kubernetes 服务帐户(默认情况下您的 POD 在其安全上下文下运行)从私有 GCR 存储库中提取图像的权利。这是间接完成的,通过为其分配 imagePull 操作的秘密:

kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "my-private-gcr-readonly"}]}'

就是这样 !

PS。

您还可以查看教程,该教程解释了从 Kubernetes 集群中访问 Google Container Registry 的两种方式(使用 JSON 密钥或访问令牌)

于 2019-05-22T10:44:59.390 回答