ImagePullBackOff-Fehler beim Abrufen des Docker-Images in einem anderen Projekt in Google Cloud

ImagePullBackOff-Fehler beim Abrufen des Docker-Images in einem anderen Projekt in Google Cloud

Ich versuche, ein privates Bild vonArtefakt-RegistrierungRepo in Google Cloud aus einem Kubernetes-Cluster, der in einem anderen Google Cloud-Projekt mit kubectl ausgeführt wird.

kubernetes version 1.20.15-gke.1000 

Dem Dienstkonto für Kubernetes wurden bereits die Berechtigungen artifactregistry.reader und storageobject.viewer erteilt, da sich das Image in einem anderen Projekt als das Kubernetes-Dienstkonto befindet.

Ich wende das folgende YAML auf den Kubectl-Befehl an.

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

Das Cloud-SQL-Proxy-Image wird abgerufen und der Container läuft, aber das Image im privaten Repository wird nicht abgerufen: „us-central1-docker.pkg.dev/myproject/docker-repo/test-app:v1“

wenn ich die Pods überprüfe, wird mir dieser Fehler angezeigt:

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

Kann mir jemand sagen, wie ich das lösen kann?

Antwort1

Ich hatte diese Woche ein ähnliches Problem. Nehmen wir an, Ihr GKE- und Servicekonto befindet sich in Projekt A und das Artefaktregister in Projekt B.

  1. artifactregistry.readerStellen Sie sicher, dass Sie die Rolle im Projekt B (nicht A) angeben .
  2. Stellen Sie sicher, dass Sie diese Rolle dem richtigen Dienstkonto zuweisen. Das Dienstkonto, das das Image abruft, ist das Dienstkonto des Knotens, nicht das Dienstkonto des Pods. In meinem Fall habe ich GKE Autopilot verwendet, das über TerraForm konfiguriert wurde. Aufgrund eines Fehlers im Terraform-Modul lautet das vom Knoten verwendete Dienstkonto default(das ist das Standard-Compute-Dienstkonto, z. B. <Projektnummer>@cloudservices.gserviceaccount.com).

Mit dem Befehl können Sie überprüfen, welches Dienstkonto in Ihrem Knotenpool ausgeführt wird gcloud container clusters describe ....

Ich hoffe das hilft!

Antwort2

Verwenden von Bildern aus anderen Projekten in Ihrer Konfiguration

Auf dieser Seite wird beschrieben, wie Sie Ihr Projekt so konfigurieren, dass der Deployment Manager virtuelle Compute Engine-Maschineninstanzen unter Verwendung von Betriebssystem-Images erstellen kann, die zu einem anderen Projekt gehören.

Ich hoffe, Sie können dies verwenden, um die Registrierung zwischen Projekten zu aktualisieren.

verwandte Informationen