在 Google Cloud 中的不同项目中拉取 docker 镜像时出现 ImagePullBackOff 错误

在 Google Cloud 中的不同项目中拉取 docker 镜像时出现 ImagePullBackOff 错误

我正在尝试从中提取私人图像工件注册表使用 kubectl 从在不同 Google Cloud 项目中运行的 kubernetes 集群中获取 Google Cloud 中的 repo。

kubernetes version 1.20.15-gke.1000 

由于图像与 kubernetes 服务帐户位于不同的项目中,因此 kubernetes 的服务帐户已被授予artifactregistry.reader 和 storageobject.viewer 权限

我将以下 yaml 应用于 kubectl 命令。

kubectl apply -f proxy_with_workload_identity.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-app
spec:
  selector:
    matchLabels:
      app: app-project
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: app-project
    spec:
      containers:
        - env:
            - name: DB_USER
              valueFrom:
                secretKeyRef:
                  key: username
                  name: db-credentials
            - name: DB_PASS
              valueFrom:
                secretKeyRef:
                  key: password
                  name: db-credentials
            - name: DB_NAME
              value: postgres
          image: "us-central1-docker.pkg.dev/myproject/docker-repo/test-app:v1" 
          name: app-project
          ports:
            - containerPort: 9376
              protocol: TCP
        - command:
            - /cloud_sql_proxy 
            - "-instances=demo-dev:us-central1:1-sql-1=tcp:5432"
          image: "gcr.io/cloudsql-docker/gce-proxy:latest"
          name: cloud-sql-proxy
          resources:
            requests:
              cpu: 200m
              memory: 32Mi
          securityContext:
            runAsNonRoot: true
      serviceAccountName: testapp

cloud-sql-proxy 映像正在被拉取并且容器正在运行,但是私有存储库中的映像未被拉取“us-central1-docker.pkg.dev/myproject/docker-repo/test-app:v1”

当我检查 pod 时,出现了这个错误:

code = Unknown desc = failed to pull and unpack image "us-central1-docker.pkg.dev/myproject/docker-repo/test-app:v1:v1": failed to resolve reference "us-central1-docker.pkg.dev/myproject/docker-repo/test-app:v1": failed to authorize: failed to fetch oauth token: unexpected status: 403 Forbidden

谁能告诉我如何解决这个问题?

答案1

本周我遇到了类似的问题。假设您的 GKE 和服务帐户位于项目 A 中,而工件注册表位于项目 B 中。

  1. 确保你给出的是artifactregistry.reader项目 B(而不是 A)中的角色
  2. 确保将此角色分配给正确的服务帐户。提取映像的服务帐户是节点的服务帐户,而不是 Pod 的服务帐户。就我而言,我使用的是通过 TerraForm 配置的 GKE Autopilot。由于 Terraform 模块中存在错误,节点使用的服务帐户是default(这是默认的计算服务帐户,例如 <project_number>@cloudservices.gserviceaccount.com)

您可以使用命令检查您的节点池正在运行哪个服务帐户gcloud container clusters describe ...

我希望这有帮助!

答案2

在您的配置中使用其他项目的图像

本页面介绍如何配置您的项目,以便 Deployment Manager 可以使用属于另一个项目的操作系统映像创建 Compute Engine 虚拟机实例。

我希望您可以使用它来更新项目之间的注册表。

相关内容