Berechtigungsprobleme mit einem Google-Dienstkonto beheben

Auf dieser Seite erfahren Sie, wie Sie Berechtigungsprobleme beheben, die auftreten, wenn Sie Config Sync mit einem Google-Dienstkonto verwenden.

Fehlender Lesezugriff

Wenn Sie ein Google-Dienstkonto (spec.git.gcpServiceAccountEmail oder spec.oci.gcpServiceAccountEmail oderspec.helm.gcpServiceAccountEmail) zur Authentifizierung bei Cloud Source Repositories oder Artifact Registry verwenden, erfordert das Google-Dienstkonto Folgenden Leser-Zugriff:

  • Cloud Source Repositories: roles/source.reader
  • Artifact Registry: roles/artifactregistry.reader

Wenn dem Dienstkonto diese Rollen fehlen, schlägt git-sync, oci-sync oder helm-sync mit Fehlern wie den folgenden fehl:

failed to pull image us-docker.pkg.dev/...: GET https://us-docker.pkg.dev/v2/token?scope=repository...: DENIED: Permission \"artifactregistry.repositories.downloadArtifacts\" denied on resource \"projects/.../locations/us/repositories/...\" (or it may not exist)
"Err":"failed to render the helm chart: exit status 1, stdout: Error: failed to download ...

Gewähren Sie dem Dienstkonto den richtigen Leserzugriff, um dieses Problem zu beheben.

Fehlende IAM-Richtlinienbindung mit Workload Identity

Wenn Sie ein Google-Dienstkonto zur Authentifizierung verwenden, ist zwischen dem Google-Dienstkonto und dem Kubernetes-Dienstkonto eine IAM-Richtlinienbindung erforderlich. Wenn die IAM-Richtlinienbindung fehlt, erhalten Sie die folgende Fehlermeldung:

KNV2004: unable to sync repo Error in the git-sync container: ERROR: failed to call ASKPASS callback URL: auth URL returned status 500, body: "failed to get token from credentials: oauth2/google: status code 403: {\n \"error\": {\n \"code\": 403,\n \"message\": \"The caller does not have permission\",\n \"status\": \"PERMISSION_DENIED\"\n }\n}\n"

Erstellen Sie die folgende IAM-Richtlinienbindung, um das Problem zu beheben:

gcloud iam service-accounts add-iam-policy-binding \
   --role roles/iam.workloadIdentityUser \
   --member "serviceAccount:PROJECT_ID.svc.id.goog[config-management-system/KSA_NAME]" \
   GSA_NAME@PROJECT_ID.iam.gserviceaccount.com

Dabei gilt:

  • PROJECT_ID: Wenn Sie GKE Workload Identity verwenden, fügen Sie die Projekt-ID Ihrer Organisation hinzu. Wenn Sie Flotten-Workload Identity verwenden, können Sie zwei verschiedene Projekt-IDs verwenden. Fügen Sie in serviceAccount:PROJECT_ID die Projekt-ID der Flotte hinzu, bei der Ihr Cluster registriert ist. Fügen Sie in GSA_NAME@PROJECT_ID eine Projekt-ID für jedes Projekt hinzu, das Lesezugriff auf das Repository in Cloud Source Repositories hat.

  • KSA_NAME: das Kubernetes-Dienstkonto für den Abgleich. Wenn der RootSync-Name für Stamm-Repositories root-sync ist, ist KSA_NAME root-reconciler. Andernfalls ist es root-reconciler-ROOT_SYNC_NAME.

    Wenn der RepoSync-Name für Namespace-Repositories repo-sync ist, ist KSA_NAME ns-reconciler-NAMESPACE. Andernfalls ist es ns-reconciler-NAMESPACE-REPO_SYNC_NAME.

  • GSA_NAME: Benutzerdefiniertes Google-Dienstkonto, das Sie zum Herstellen einer Verbindung zu Cloud Source Repositories verwenden möchten. Achten Sie darauf, dass das ausgewählte Google-Dienstkonto die Rolle source.reader hat.

Hinweis: Zum Erstellen dieser Richtlinienbindung ist die Berechtigung iam.serviceAccounts.setIamPolicy erforderlich.

Achten Sie darauf, dass Workload Identity auf Ihren registrierten Clustern aktiviert ist. Weitere Informationen finden Sie unter Cluster registrieren. Wenn sich Ihr Cluster in einem anderen Projekt als dem Flotten-Hostprojekt befindet, müssen Sie das Google-Dienstkonto mit dem Kubernetes-Dienstkonto im Flotten-Hostprojekt binden.

Fehlender cloud-platform-Bereich für den Zugriff auf Cloud Source Repositories

Wenn Sie einem Google-Dienstkonto Zugriff auf Ihr Git-Repository in Cloud Source Repositories gewähren, muss der schreibgeschützte Bereich in Zugriffsbereiche für die Knoten im Cluster enthalten sein.

Der schreibgeschützte Bereich kann hinzugefügt werden, indem Sie cloud-source-repos-ro in die Liste --scopes aufnehmen, die beim Erstellen des Clusters angegeben wird, oder indem Sie den Bereich cloud-platform beim Erstellen des Clusters verwenden. Beispiel:

gcloud container clusters create CLUSTER_NAME --scopes=cloud-platform

Wenn der schreibgeschützte Bereich fehlt, wird ein Fehler wie der folgende angezeigt:

Error in the git-sync container: {"Msg":"unexpected error syncing repo, will retry","Err":"Run(git clone -v --no-checkout -b main --depth 1 https://source.developers.google.com/p/PROJECT_ID/r/csr-auth-test /repo/source): exit status 128: { stdout: \"\", stderr: \"Cloning into '/repo/source'...\\nremote: INVALID_ARGUMENT: Request contains an invalid argument\\nremote: [type.googleapis.com/google.rpc.LocalizedMessage]\\nremote: locale: \\\"en-US\\\"\\nremote: message: \\\"Invalid authentication credentials. Please generate a new identifier: https://source.developers.google.com/new-password\\\"\\nremote: \\nremote: [type.googleapis.com/google.rpc.RequestInfo]\\nremote: request_id: \\\"fee01d10ba494552922d42a9b6c4ecf3\\\"\\nfatal: unable to access 'https://source.developers.google.com/p/PROJECT_ID/r/csr-auth-test/': The requested URL returned error: 400\\n\" }","Args":{}}

Fehlender storage-ro-Bereich für den Zugriff auf Artifact Registry

Bei Verwendung von Artifact Registry werden Image-Ebenen in Cloud Storage-Buckets gespeichert. Wenn Sie einem Google-Dienstkonto Zugriff auf Ihr OCI-Image oder Helm-Diagramm in Artifact Registry gewähren, muss der schreibgeschützte Bereich in den Zugriffsbereichen für die Knoten im Cluster enthalten sein.

Der schreibgeschützte Bereich kann hinzugefügt werden, indem Sie storage-ro in die Liste --scopes aufnehmen, die beim Erstellen des Clusters angegeben wird, oder indem Sie den Bereich cloud-platform beim Erstellen des Clusters verwenden. Beispiel:

gcloud container clusters create CLUSTER_NAME --scopes=cloud-platform

Wenn der schreibgeschützte Bereich fehlt, wird ein Fehler wie der folgende angezeigt:

Error in the oci-sync container: {"Msg":"unexpected error fetching package, will retry","Err":"failed to pull image us-docker.pkg.dev/...: GET https://us-docker.pkg.dev/v2/token?scope=repository%3A...%3Apull\u0026service=us-docker.pkg.dev: UNAUTHORIZED: failed authentication","Args":{}}

Die Fehlermeldung enthält möglicherweise nicht alle Details zur Ursache des Fehlers. Sie stellt aber einen Befehl bereit, der die Logs des Containers git-sync ausgibt, die weitere Informationen enthalten können.

Wenn Sie die APIs RootSync oder RepoSync aktiviert haben, führen Sie den folgenden Befehl aus:

kubectl logs -n config-management-system -l app=reconciler -c git-sync

Wenn Sie die APIs RootSync oder RepoSync nicht aktiviert haben, führen Sie den folgenden Befehl aus:

kubectl logs -n config-management-system -l app=git-importer -c git-sync

Hinweis: APIs RootSync und RepoSync sind standardmäßig aktiviert, wenn Sie Config Sync mit der Google Cloud Console oder der Google Cloud-Befehlszeile installiert haben, und lassen sich nicht deaktivieren.

Nächste Schritte

  • Wenn weiterhin Probleme auftreten, prüfen Sie, ob es sich bei Ihrem Problem um ein bekanntes Problem handelt.