Résoudre les problèmes d'autorisation liés à un compte de service Google

Cette page explique comment résoudre les problèmes d'autorisation survenant lorsque vous utilisez Config Sync avec un compte de service Google.

Accès lecteur manquant

Lorsque vous utilisez un compte de service Google (spec.git.gcpServiceAccountEmail, spec.oci.gcpServiceAccountEmail ou spec.helm.gcpServiceAccountEmail) pour vous authentifier auprès de Cloud Source Repositories ou d'Artifact Registry, le compte de service Google nécessite l'accès en lecture suivant:

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

Si le compte de service ne dispose pas de ces rôles, git-sync, oci-sync ou helm-sync échoue avec des erreurs semblables à ce qui suit:

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

Pour résoudre ce problème, accordez au compte de service le droit d'accès en lecture approprié.

Liaison de stratégie IAM manquante avec Workload Identity

Lorsque vous utilisez un compte de service Google pour l'authentification, une liaison de stratégie IAM est requise entre le compte de service Google et le compte de service Kubernetes. Si la liaison de stratégie IAM est manquante, vous obtenez l'erreur suivante :

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"

Pour résoudre le problème, créez la liaison de stratégie IAM suivante :

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

Remplacez les éléments suivants :

  • PROJECT_ID : si vous utilisez GKE Workload Identity, ajoutez l'ID de projet de votre organisation. Si vous utilisez Workload Identity de votre parc, vous pouvez utiliser deux ID de projet différents. Dans serviceAccount:PROJECT_ID, ajoutez l'ID de projet du parc dans lequel votre cluster est enregistré. Dans GSA_NAME@PROJECT_ID, ajoutez un ID de projet pour tout projet disposant d'un accès en lecture au dépôt dans Cloud Source Repositories.

  • KSA_NAME : compte de service Kubernetes pour le rapprochement. Pour les dépôts racine, si le nom de RootSync est root-sync, KSA_NAME est root-reconciler. Sinon, la valeur est root-reconciler-ROOT_SYNC_NAME.

    Pour les dépôts d'espaces de noms, si le nom de RepoSync est repo-sync, KSA_NAME est ns-reconciler-NAMESPACE. Sinon, il est défini sur ns-reconciler-NAMESPACE-REPO_SYNC_NAME.

  • GSA_NAME : compte de service Google personnalisé que vous souhaitez utiliser pour vous connecter à Cloud Source Repositories. Assurez-vous que le compte de service Google que vous sélectionnez dispose du rôle source.reader.

La création de cette liaison de stratégie nécessite l'autorisation iam.serviceAccounts.setIamPolicy.

Assurez-vous que l'identité de charge de travail du parc est activée sur vos clusters enregistrés. Pour en savoir plus, consultez la section Enregistrer un cluster. Si votre cluster se trouve dans un projet différent du projet hôte du parc, vous devez lier le compte de service Google au compte de service Kubernetes dans le projet hôte du parc.

Champ d'application cloud-platform manquant pour accéder à Cloud Source Repositories

Lorsque vous autorisez un compte de service Google à accéder à votre dépôt Git dans Cloud Source Repositories, le champ d'application en lecture seule doit être inclus dans les niveaux d'accès pour les nœuds du cluster.

Le champ d'application en lecture seule peut être ajouté en incluant cloud-source-repos-ro dans la liste --scopes spécifiée lors la création du cluster ou en utilisant le champ d'application cloud-platform au moment de la création du cluster. Exemple :

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

Si le champ d'application en lecture seule est manquant, une erreur semblable à celle-ci s'affiche:

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

Niveau d'accès storage-ro manquant pour l'accès à Artifact Registry

Lorsque vous utilisez Artifact Registry, les calques d'image sont conservés dans des buckets Cloud Storage. Lorsque vous autorisez un compte de service Google à accéder à votre image OCI ou à votre chart Helm dans Artifact Registry, le niveau d'accès en lecture seule doit être inclus dans les niveaux d'accès des nœuds du cluster.

Le champ d'application en lecture seule peut être ajouté en incluant storage-ro dans la liste --scopes spécifiée lors la création du cluster ou en utilisant le champ d'application cloud-platform au moment de la création du cluster. Exemple :

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

Si le champ d'application en lecture seule est manquant, une erreur semblable à celle-ci s'affiche:

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

Le message d'erreur peut ne pas inclure tous les détails sur la cause de l'erreur, mais il fournit une commande qui imprime les journaux du conteneur git-sync qui peuvent contenir plus d'informations.

Si vous avez activé les API RootSync ou RepoSync, exécutez la commande suivante:

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

Si vous n'avez pas activé les API RootSync ou RepoSync, exécutez la commande suivante:

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

Les API RootSync et RepoSync sont activées par défaut si vous avez utilisé la console Google Cloud ou Google Cloud CLI pour installer Config Sync et que vous ne pouvez pas la désactiver.

Étapes suivantes