Berechtigungsprobleme mit einem Google-Dienstkonto beheben

Auf dieser Seite erfahren Sie, wie Sie Berechtigungsprobleme beheben, die bei der Verwendung von Config Sync mit einem Google-Dienstkonto auftreten.

Fehlender Lesezugriff

Wenn Sie ein Google-Dienstkonto (spec.git.gcpServiceAccountEmail, spec.oci.gcpServiceAccountEmail oder spec.helm.gcpServiceAccountEmail) zur Authentifizierung bei Cloud Source Repositories oder Artifact Registry verwenden, benötigt das Google-Dienstkonto folgende Lesezugriffe:

  • 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 der 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 eine IAM-Richtlinienbindung zwischen dem Google-Dienstkonto und dem Kubernetes-Dienstkonto 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

Ersetzen Sie Folgendes:

  • 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 bei Root-Repositories der Name RootSync root-sync lautet, ist KSA_NAME root-reconciler. Andernfalls ist es root-reconciler-ROOT_SYNC_NAME.

    Wenn bei Namespace-Repositories der Name RepoSync repo-sync lautet, 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.

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 an das 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

Wenn Sie Artifact Registry verwenden, 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 RootSync oder RepoSync APIs aktiviert haben, führen Sie den folgenden Befehl aus:

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

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

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

Die APIs RootSync und RepoSync sind standardmäßig aktiviert, wenn Sie Config Sync mit der Google Cloud Console oder der Google Cloud CLI installiert haben. Sie kann nicht deaktiviert werden.

Nächste Schritte

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