Google Cloud の別のプロジェクトで Docker イメージをプル中に ImagePullBackOff エラーが発生する

Google Cloud の別のプロジェクトで Docker イメージをプル中に ImagePullBackOff エラーが発生する

私はプライベートイメージを取得しようとしていますアーティファクトレジストリkubectl を使用して、別の Google Cloud プロジェクトで実行されている Kubernetes クラスタから Google Cloud のリポジトリを作成します。

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"

ポッドを確認すると、次のエラーが表示されます:

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 仮想マシン インスタンスを作成できるようにプロジェクトを構成する方法について説明します。

これを使用して、プロジェクト間でレジストリを更新できることを願っています。

関連情報