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.
artifactregistry.reader
Stellen Sie sicher, dass Sie die Rolle im Projekt B (nicht A) angeben .- 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.