将图像从GCR拉入GKE

8 google-cloud-platform kubernetes google-kubernetes-engine

今天是我第一天玩GCR和GKE.如果我的问题听起来很幼稚,那么道歉.

所以我在GCR中创建了一个新的注册表.这是私人的.使用 文档,我使用该命令获取了Access Token

gcloud auth print-access-token
#<MY-ACCESS_TOKEN>
Run Code Online (Sandbox Code Playgroud)

我知道我的用户名是 oauth2accesstoken

我尝试时在我的本地笔记本电脑上

docker login https://eu.gcr.io/v2
Username: oauth2accesstoken
Password: <MY-ACCESS_TOKEN>
Run Code Online (Sandbox Code Playgroud)

我明白了:

Login Successful
Run Code Online (Sandbox Code Playgroud)

所以现在是时候docker-registry在Kubernetes 创造一个秘密了.

我运行以下命令:

kubectl create secret docker-registry eu-gcr-io-registry --docker-server='https://eu.gcr.io/v2' --docker-username='oauth2accesstoken' --docker-password='<MY-ACCESS_TOKEN>' --docker-email='<MY_EMAIL>'
Run Code Online (Sandbox Code Playgroud)

然后我的Pod定义如下:

apiVersion: v1
kind: Pod
metadata:
  name: my-app
spec:
  containers:
  - name: my-app
    image: eu.gcr.io/<my-gcp-project>/<repo>/<my-app>:latest
    ports:
    - containerPort: 8090
  imagePullSecrets:
  - name: eu-gcr-io-registry
Run Code Online (Sandbox Code Playgroud)

但是当我旋转吊舱时,我得到了错误:

Warning  Failed                 4m (x4 over 6m)   kubelet, node-3  Failed to pull image "eu.gcr.io/<my-gcp-project>/<repo>/<my-app>:latest": rpc error: code = Unknown desc = 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
Run Code Online (Sandbox Code Playgroud)

我验证了我的秘密检查YAML文件,并做了base64 --decode.dockerconfigjson,它是正确的.

那我错过了什么?

Ahm*_*gle 14

如果您的GKE集群和GCR注册表位于同一项目中:您不需要配置身份验证.GKE集群被授权从没有配置的同一项目中的私有GCR注册表中提取.(很可能你就是这个!)


如果您的GKE群集和GCR注册表位于不同的GCP项目中:请按照以下说明为您的GKE群集提供"服务帐户"访问权限,以便在您的GCR群集中读取私有映像:https://cloud.google.com/container-registry/文档/访问控制#granting_users_and_other_projects_access_to_a_registry

简而言之,这可以通过以下方式完成:

gsutil iam ch  serviceAccount:[PROJECT_NUMBER]-compute@developer.gserviceaccount.com:objectViewer gs://[BUCKET_NAME]
Run Code Online (Sandbox Code Playgroud)

[BUCKET_NAME]存储GCR图像的GCS存储区在哪里(如artifacts.[PROJECT-ID].appspot.com),[PROJECT_NUMBER]是托管GKE集群的数字 GCP项目ID.

  • 我的GKE和GCR映像位于同一项目中,但是在没有提供其他凭据的情况下,我得到了:`无法提取映像“ eu.gcr.io/project/we ...”:rpc错误:代码=未知desc =错误守护程序的响应:未经授权:您没有执行此操作所需的权限,并且您的凭据可能无效。要验证您的请求...`似乎同一项目没有任何保证。编辑:好在这里找到答案:/sf/ask/3783044681/ (7认同)
  • 您的节点需要具有 `https://www.googleapis.com/auth/devstorage.read_only` oauth 范围。 (6认同)