Risolvere i problemi di autorizzazione con un account di servizio Google

Questa pagina mostra come risolvere i problemi di autorizzazione che si verificano quando utilizzi Config Sync con un account di servizio Google.

Accesso lettore mancante

Quando utilizzi un account di servizio Google (spec.git.gcpServiceAccountEmail, spec.oci.gcpServiceAccountEmail o spec.helm.gcpServiceAccountEmail) per eseguire l'autenticazione in Cloud Source Repositories o Artifact Registry, l'account di servizio Google richiede il seguente accesso in lettura:

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

Se nell'account di servizio mancano questi ruoli, si verifica un errore relativo a git-sync, oci-sync o helm-sync con errori simili ai seguenti:

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 ...

Per risolvere il problema, concedi all'account di servizio l'accesso in lettura corretto.

Associazione di criteri IAM mancante con Workload Identity

Quando utilizzi un account di servizio Google per l'autenticazione, è necessaria un'associazione di criteri IAM tra l'account di servizio Google e l'account di servizio Kubernetes. Se manca l'associazione dei criteri IAM, viene visualizzato il seguente errore:

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"

Per risolvere il problema, crea la seguente associazione di criteri IAM:

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

Sostituisci quanto segue:

  • PROJECT_ID: se utilizzi GKE Workload Identity, aggiungi l'ID progetto della tua organizzazione. Se utilizzi Workload Identity del parco risorse, puoi utilizzare due diversi ID progetto. In serviceAccount:PROJECT_ID, aggiungi l'ID progetto del parco risorse in cui è registrato il cluster. In GSA_NAME@PROJECT_ID, aggiungi un ID progetto per qualsiasi progetto con accesso in lettura al repository in Cloud Source Repositories.

  • KSA_NAME: l'account di servizio Kubernetes per il riconciliatore. Per i repository root, se il nome RootSync è root-sync, KSA_NAME è root-reconciler. In caso contrario, è root-reconciler-ROOT_SYNC_NAME.

    Per i repository dello spazio dei nomi, se il nome RepoSync è repo-sync, KSA_NAME è ns-reconciler-NAMESPACE. In caso contrario, è ns-reconciler-NAMESPACE-REPO_SYNC_NAME.

  • GSA_NAME: l'account di servizio Google personalizzato che vuoi utilizzare per la connessione a Cloud Source Repositories. Assicurati che l'account di servizio Google selezionato abbia il ruolo source.reader.

Per creare questa associazione di criteri è necessaria l'autorizzazione iam.serviceAccounts.setIamPolicy.

Assicurati che Workload Identity del parco risorse sia abilitato sui cluster registrati. Per ulteriori informazioni, consulta Registrare un cluster. Se il cluster si trova in un progetto diverso da quello host del parco risorse, devi associare l'account di servizio Google all'account di servizio Kubernetes nel progetto host del parco risorse.

Ambito cloud-platform mancante per accedere a Cloud Source Repositories

Quando concedi a un account di servizio Google l'accesso al tuo repository Git in Cloud Source Repositories, l'ambito di sola lettura deve essere incluso negli ambiti di accesso per i nodi nel cluster.

L'ambito di sola lettura può essere aggiunto includendo cloud-source-repos-ro nell'elenco --scopes specificato al momento della creazione del cluster o utilizzando l'ambito cloud-platform al momento della creazione del cluster. Ad esempio:

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

Se manca l'ambito di sola lettura, viene visualizzato un errore simile al seguente:

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":{}}

Ambito storage-ro mancante per accedere ad Artifact Registry

Quando utilizzi Artifact Registry, i livelli delle immagini vengono conservati nei bucket Cloud Storage. Quando concedi a un account di servizio Google l'accesso alla tua immagine OCI o al grafico Helm in Artifact Registry, l'ambito di sola lettura deve essere incluso negli ambiti di accesso per i nodi nel cluster.

L'ambito di sola lettura può essere aggiunto includendo storage-ro nell'elenco --scopes specificato al momento della creazione del cluster oppure utilizzando l'ambito cloud-platform al momento della creazione del cluster. Ad esempio:

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

Se manca l'ambito di sola lettura, viene visualizzato un errore simile al seguente:

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":{}}

Il messaggio di errore potrebbe non includere i dettagli completi della causa, ma fornisce un comando che stampa i log del container git-sync, che potrebbe contenere ulteriori informazioni.

Se hai abilitato le API RootSync o RepoSync, esegui questo comando:

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

Se non hai abilitato le API RootSync o RepoSync, esegui questo comando:

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

Le API RootSync e RepoSync sono abilitate per impostazione predefinita se hai utilizzato la console Google Cloud o Google Cloud CLI per installare Config Sync e non puoi disabilitarlo.

Passaggi successivi

  • Se i problemi persistono, controlla se il tuo problema è un problema noto.