Kubernetes 将图像从GCR拉入GKE

Kubernetes 将图像从GCR拉入GKE,kubernetes,google-cloud-platform,google-kubernetes-engine,Kubernetes,Google Cloud Platform,Google Kubernetes Engine,今天是我在GCR和GKE的第一天。如果我的问题听起来很幼稚,我道歉 因此,我在GCR中创建了一个新的注册表。这是私人的。使用文档,我使用命令获得了访问令牌 gcloud auth print-access-token #<MY-ACCESS_TOKEN> 我得到: Login Successful 现在是在Kubernetes中创建docker注册表的时候了 我运行了以下命令: kubectl create secret docker-registry eu-gcr-io-reg

今天是我在GCR和GKE的第一天。如果我的问题听起来很幼稚,我道歉

因此,我在GCR中创建了一个新的注册表。这是私人的。使用文档,我使用命令获得了访问令牌

gcloud auth print-access-token
#<MY-ACCESS_TOKEN>
我得到:

Login Successful
现在是在Kubernetes中创建
docker注册表的时候了

我运行了以下命令:

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>'
kubectl创建秘密docker注册表eu gcr io注册表--docker服务器=”https://eu.gcr.io/v2'--docker用户名='oauth2accesstoken'--docker密码=''--docker电子邮件=''
然后我的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
apiVersion:v1 种类:豆荚 元数据: 名称:我的应用程序 规格: 容器: -名称:我的应用程序 图片:eu.gcr.io//:最新 端口: -集装箱港口:8090 你的秘密: -名称:欧盟gcr io注册表
但当我旋转吊舱时,我得到了一个错误:

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
警告失败4m(x4/6m)kubelet,节点3未能拉取映像“eu.gcr.io//:latest”:rpc错误:code=Unknown desc=来自守护程序的错误响应:unauthorized:您没有执行此操作所需的权限,并且您可能具有无效凭据。要验证您的请求,请按照中的步骤进行操作:https://cloud.google.com/container-registry/docs/advanced-authentication
我通过检查YAML文件并在
.dockerconfigjson
上执行
base64--decode
验证了我的秘密,这是正确的


我错过了什么

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



如果您的GKE群集和GCR注册表位于不同的GCP项目中:请按照以下说明提供GKE群集访问的“服务帐户”以读取GCR群集中的私有映像:

简而言之,这可以通过以下方式实现:

gsutil iam ch  serviceAccount:[PROJECT_NUMBER]-compute@developer.gserviceaccount.com:objectViewer gs://[BUCKET_NAME]

其中,
[BUCKET\u NAME]
是存储GCR图像(如
工件。[PROJECT-ID].appspot.com
)的GCS BUCKET,
[PROJECT\u NUMBER]
是承载GKE集群的数值的GCP项目ID。

因为您在获取图像时存在权限问题,让我知道这是否有帮助。我的GKE和GCR映像在同一个项目中,但是没有提供其他凭据,我得到了以下信息:
无法提取映像“eu.GCR.io/project/we…”:rpc错误:code=Unknown desc=来自守护进程的错误响应:未经授权:您没有执行此操作所需的权限,您可能有无效的凭据。要验证您的请求…
看起来同一个项目没有提供任何保证。编辑:我们在这里找到了答案:是的,集群的标识和作用域应该允许访问云存储API以进行GCR访问。默认情况下,如果您正在创建无服务帐户或范围自定义,则GKE集群具有此功能。您的节点需要具有
https://www.googleapis.com/auth/devstorage.read_only
oauth作用域。@无论您的服务帐户权限是否不足,请检查与kubernetes群集相关的权限,云存储等,它绝对应该在没有任何特殊凭证的情况下工作。
gsutil iam ch  serviceAccount:[PROJECT_NUMBER]-compute@developer.gserviceaccount.com:objectViewer gs://[BUCKET_NAME]