【问题标题】:GCloud: Failed to pull image (400) - Permission "artifactregistry.repositories.downloadArtifacts" deniedGCloud:无法提取图像(400)-权限“artifactregistry.repositories.downloadArtifacts”被拒绝
【发布时间】:2021-09-19 01:19:24
【问题描述】:

由于以下问题,我的 pod 无法创建:

Failed to pull image "europe-west3-docker.pkg.dev/<PROJECT_ID>/<REPO_NAME>/my-app:1.0.0": rpc error: code = Unknown desc = Error response from daemon: Get https://europe-west3-docker.pkg.dev/v2/<PROJECT_ID>/<REPO_NAME>/my-app/manifests/1.0.0: denied: Permission "artifactregistry.repositories.downloadArtifacts" denied on resource "projects/<PROJECT_ID>/locations/europe-west3/repositories/<REPO_NAME>" (or it may not exist)

我从来没有经历过这样的事情。也许有人可以帮助我。

这是我所做的:

  1. 我在 Google Cloud 的 Zone europe-west-3-a 上建立了一个标准的 Kubernetes 集群
  2. 我开始按照这里描述的步骤https://cloud.google.com/kubernetes-engine/docs/tutorials/hello-app
  3. 我构建了 docker 成像器并将其推送到 Artifcats 存储库
  4. 我可以确认存储库和图像都存在于 Google 控制台中以及使用 docker 拉取图像
  5. 现在我要部署我的应用,这里是部署文件:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  labels:
    app: my-app
spec:
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: europe-west3-docker.pkg.dev/<PROJECT_ID>/<REPO_NAME>/my-app:1.0.0
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
  1. 由于上述错误,创建 Pod 失败。

我错过了什么?

【问题讨论】:

  • 如果图像确实存在于该位置,则错误表明集群(的服务帐户)无权访问工件注册表。这应该默认启用如果集群和存储库在同一个项目中。是这样吗?

标签: docker kubernetes google-kubernetes-engine gcloud


【解决方案1】:

我认为教程有误。

我能够通过以下方式完成这项工作:

  • 创建服务帐户和密钥
  • 分配帐户 Artifact Registry 权限
  • 创建代表服务帐户的 Kubernetes 密钥
  • 使用imagePullSecrets
PROJECT=[[YOUR-PROJECT]]
REPO=[[YOUR-REPO]]
LOCATION=[[YOUR-LOCATION]]

# Service Account and Kubernetes Secret name
ACCOUNT="artifact-registry" # Or ...

# Email address of the Service Account
EMAIL=${ACCOUNT}@${PROJECT}.iam.gserviceaccount.com

# Create Service Account
gcloud iam service-accounts create ${ACCOUNT} \
--display-name="Read Artifact Registry" \
--description="Used by GKE to read Artifact Registry repos" \
--project=${PROJECT}

# Create Service Account key
gcloud iam service-accounts keys create ${PWD}/${ACCOUNT}.json \
--iam-account=${EMAIL} \
--project=${PROJECT}

# Grant Service Account role to reader Artifact Reg
gcloud projects add-iam-policy-binding ${PROJECT} \
--member=serviceAccount:${EMAIL} \
--role=roles/artifactregistry.reader

# Create a Kubernetes Secret representing the Service Account
kubectl create secret docker-registry ${ACCOUNT} \
--docker-server=https://${LOCATION}-docker.pkg.dev \
--docker-username=_json_key \
--docker-password="$(cat ${PWD}/${ACCOUNT}.json)" \
--docker-email=${EMAIL} \
--namespace=d{NAMESPACE}

然后:

IMAGE="${LOCATION}-docker.pkg.dev/${PROJECT}/${REPO}/my-app:1.0.0"

echo "
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  labels:
    app: my-app
spec:
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      imagePullSecrets:
        - name: ${ACCOUNT}
      containers:
      - name: my-app
        image: ${IMAGE}
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
" | kubectl apply --filename=- --namespace=${NAMESPACE}

注意还有其他方法可以实现。

您可以使用集群的默认(计算引擎)服务帐户,而不是此处的专用服务帐户,但默认服务帐户使用更广泛,授予它更大的权力可能过于广泛。

您可以将imagePullSecrets 添加到 GKE 命名空间的默认服务帐户。这将使该命名空间中的任何部署都能够从存储库中提取,这也可能过于广泛。

我认为有一种特定于 GKE 的方式来授予集群服务帐户 GCP (!) 角色。

【讨论】:

  • 我遇到了同样的问题,并且能够仅使用 gcloud projects add-iam-policy-binding ... 行修复它,而无需创建新的服务帐户(即仅使用默认服务帐户)。我怀疑这可能是因为我过于急切地撤销了“额外权限”。感谢您为我指明正确的方向!
【解决方案2】:

非常感谢达兹威尔金!你为我指明了正确的方向。

创建具有适当权限的新服务帐户并将其“分配”给集群后,一切都按预期工作。我没有imagePullSecrets tho,因为它是可选的。

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,并且能够通过执行使其工作:

    gcloud projects add-iam-policy-binding ${PROJECT} \
    --member=serviceAccount:${EMAIL} \
    --role=roles/artifactregistry.reader
    

    ${PROJECT} = 项目名称,${EMAIL} = 默认服务帐户,例如类似123456789012-compute@developer.gserviceaccount.com

    我怀疑我过去可能过于急切地删除了一些“多余的权限”。

    【讨论】:

      猜你喜欢
      • 2022-07-25
      • 1970-01-01
      • 1970-01-01
      • 2018-08-19
      • 2018-11-16
      • 1970-01-01
      • 2014-10-29
      • 1970-01-01
      • 2020-05-31
      相关资源
      最近更新 更多