2

我正在尝试使用 kubernetes 设置 GCR

并得到错误:ErrImagePull 无法提取图像“eu.gcr.io/xxx/nodejs”:rpc 错误:代码 = 未知 desc = 来自守护进程的错误响应:对 eu.gcr.io/xxx/nodejs 的拉取访问被拒绝,存储库可以不存在或可能需要 'docker login'

尽管我已在服务帐户中正确设置了密码,并在部署规范中添加了图像拉取密码

部署.yml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  annotations:
    kompose.cmd: kompose convert
    kompose.version: 1.18.0 (06a2e56)
  creationTimestamp: null
  labels:
    io.kompose.service: nodejs
  name: nodejs
spec:
  replicas: 1
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        io.kompose.service: nodejs
    spec:
      containers:
      - env:
        - name: MONGO_DB
          valueFrom:
            configMapKeyRef:
              key: MONGO_DB
              name: nodejs-env
        - name: MONGO_HOSTNAME
          value: db
        - name: MONGO_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mongo-secret
              key: MONGO_PASSWORD
        - name: MONGO_PORT
          valueFrom:
            configMapKeyRef:
              key: MONGO_PORT
              name: nodejs-env
        - name: MONGO_USERNAME
          valueFrom:
            secretKeyRef:
              name: mongo-secret
              key: MONGO_USERNAME
        image: "eu.gcr.io/xxx/nodejs"
        name: nodejs
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
        resources: {}
      imagePullSecrets:
        - name: gcr-json-key
      initContainers:
        - name: init-db
          image: busybox
          command: ['sh', '-c', 'until nc -z db:27017; do echo waiting for db; sleep 2; done;']
      restartPolicy: Always
status: {}

用它来添加秘密,它说创建

kubectl create secret docker-registry gcr-json-key --docker-server=eu.gcr.io  --docker-username=_json_key  --docker-password="$(cat mycreds.json)"   --docker-email=mygcpemail@gmail.com

我该如何调试这个,欢迎任何想法!

4

2 回答 2

1

看起来问题是由于缺少编辑角色的相关服务帐户 XXXXXXXXXXXX-compute@XXXXXX.gserviceaccount.com 的权限引起的。

另外,我们需要限制分配权限的范围,只能从 google kubernetes 引擎推送和拉取图像,这个帐户需要存储管理员查看权限,可以按照本文中提到的说明分配 [1]。

此外,要在创建 Google Kubernetes Engine 集群时设置读写存储范围,请使用 --scopes 选项来提及此范围“storage-rw”[2]。

[1] https://cloud.google.com/container-registry/docs/access-control [2] https://cloud.google.com/container-registry/docs/using-with-google-cloud-platform #google-kubernetes-engine ”</p>

于 2019-10-02T22:21:03.190 回答
0

如果用于推送或拉取图像的 VM 实例和 Container Registry 存储桶在同一个 Google Cloud Platform 项目中,则为 Compute Engine 默认服务帐户配置了适当的权限来推送或拉取图像。

如果 VM 实例位于不同的项目中,或者该实例使用不同的服务帐号,则您必须配置对存储库使用的存储桶的访问权限。

默认情况下,Compute Engine 虚拟机具有为存储分区配置的只读访问范围。要推送私有 Docker 映像,您的实例必须配置读写存储访问范围,如访问范围中所述。请有1以供进一步参考:

请按照下表2

Action Permission Role Role Title
Pull (只读) - storage.objects.get roles/storage.objectViewer Storage Object Viewer storage.objects.list

此外,您可以分享是否有任何错误代码,因为您在任何步骤中遇到问题。

于 2019-10-07T22:57:16.723 回答