ImagePullBackOff 在 Google Cloud 中的不同專案中拉取 docker 映像時發生錯誤

ImagePullBackOff 在 Google Cloud 中的不同專案中拉取 docker 映像時發生錯誤

我正在嘗試從中提取私人圖像工件登記處使用 kubectl 從在不同 Google Cloud 專案中執行的 kubernetes 叢集將其儲存在 Google Cloud 中。

kubernetes version 1.20.15-gke.1000 

kubernetes 的服務帳戶已被授予 artifactregistry.reader 和 storageobject.viewer 權限,因為該映像與 kubernetes 服務帳戶位於不同的項目中

我將以下 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. 確保將此角色指派給正確的服務帳戶。拉取鏡像的服務帳戶是 Node 的服務帳戶,而不是 Pod 的服務帳戶。就我而言,我使用的是透過 TerraForm 配置的 GKE Autopilot。由於 Terraform 模組中的錯誤,節點使用的服務帳戶為default(預設計算服務帳戶,例如 <project_number>@cloudservices.gserviceaccount.com)

您可以使用該命令檢查您的節點池正在執行哪個服務帳戶gcloud container clusters describe ...

我希望這有幫助!

答案2

使用配置中其他項目的圖像

本頁面介紹如何設定您的專案,以便 Deployment Manager 可以使用屬於另一個專案的作業系統映像建立 Compute Engine 虛擬機器實例。

我希望您可以使用它來更新項目之間的註冊表。

相關內容