【问题标题】:kubernetes fails to pull a private image [Google Cloud Container Registry, Digital Ocean]kubernetes 拉取私有镜像失败 [Google Cloud Container Registry, Digital Ocean]
【发布时间】:2020-02-01 01:15:36
【问题描述】:

我正在尝试使用 kubernetes 设置 GCR

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

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

deployment.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

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

【问题讨论】:

  • 请注意您的密码文件中没有错误的换行符。
  • key.json 没问题

标签: kubernetes google-container-registry


【解决方案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

【讨论】:

  • 我将它与 Digital Ocean 一起使用,结果证明是 GCP 上的权限问题,但是我创建了一个具有这些权限的新角色,它仍然有同样的错误,也使用了 Storage Viewer ,并验证它可以访问这个存储桶并且它有,但仍然是同样的错误,有什么想法吗?
  • 显然只有当我创建一个具有“编辑”角色的服务帐户时它才能工作,否则如果我优化存储查看器或存储管理员的权限,它就不起作用
  • 必须是Editor+Objects Viewer吗?
【解决方案2】:

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

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

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

请按照下表2:

操作权限角色角色标题
拉取(只读)- storage.objects.get 角色/storage.objectViewer 存储对象查看器 storage.objects.list

此外,如果您在任何步骤中遇到任何错误代码,您可以分享。

【讨论】:

    猜你喜欢
    • 2021-12-10
    • 2015-09-04
    • 1970-01-01
    • 2021-03-13
    • 2021-01-21
    • 2018-08-31
    • 2022-01-22
    • 2019-08-23
    • 2023-02-01
    相关资源
    最近更新 更多