Solucionar problemas de permisos con una cuenta de servicio de Google

En esta página se explica cómo resolver los problemas de permisos que se producen al usar Config Sync con una cuenta de servicio de Google.

Falta el acceso de lectura

Cuando se usa una cuenta de servicio de Google (spec.git.gcpServiceAccountEmail, spec.oci.gcpServiceAccountEmail o spec.helm.gcpServiceAccountEmail) para autenticarse en Cloud Source Repositories o Artifact Registry, la cuenta de servicio de Google requiere el siguiente acceso de lectura:

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

Si a la cuenta de servicio le faltan estos roles, git-sync, oci-sync o helm-sync fallará y mostrará errores similares a los siguientes:

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

Para solucionar este problema, concede a la cuenta de servicio el acceso de lectura correcto.

Falta un enlace de política de gestión de identidades y accesos con Workload Identity Federation para GKE

Cuando se usa una cuenta de servicio de Google para la autenticación, se requiere una vinculación de política de IAM entre la cuenta de servicio de Google y la cuenta de servicio de Kubernetes. Si falta el enlace de la política de gestión de identidades y accesos, se produce el siguiente error:

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"

Para solucionar el problema, crea el siguiente enlace de política de gestión de identidades y accesos:

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

Haz los cambios siguientes:

  • PROJECT_ID: Si usas Workload Identity Federation para GKE, añade el ID del proyecto de tu organización. Si usas la federación de identidades de cargas de trabajo de la flota para GKE, puedes usar dos IDs de proyecto diferentes. En serviceAccount:PROJECT_ID, añade el ID del proyecto de la flota en la que está registrado tu clúster. En GSA_NAME@PROJECT_ID, añade el ID de un proyecto que tenga acceso de lectura al repositorio en Cloud Source Repositories.

  • KSA_NAME: la cuenta de servicio de Kubernetes del reconciliador. En los repositorios raíz, si el nombre de RootSync es root-sync, KSA_NAME es root-reconciler. De lo contrario, es root-reconciler-ROOT_SYNC_NAME.

    En el caso de los repositorios de espacios de nombres, si el nombre de RepoSync es repo-sync, KSA_NAME es ns-reconciler-NAMESPACE. De lo contrario, es ns-reconciler-NAMESPACE-REPO_SYNC_NAME.

  • GSA_NAME: la cuenta de servicio de Google personalizada que quieres usar para conectarte a Cloud Source Repositories. Asegúrate de que la cuenta de servicio de Google que selecciones tenga el rol source.reader.

Para crear esta vinculación de política, se necesita el permiso iam.serviceAccounts.setIamPolicy.

Asegúrate de que la federación de Workload Identity de la flota para GKE esté habilitada en los clústeres registrados. Para obtener más información, consulta Registrar un clúster. Si tu clúster está en un proyecto distinto del proyecto host de la flota, debes asociar la cuenta de servicio de Google con la cuenta de servicio de Kubernetes en el proyecto host de la flota.

Falta el ámbito cloud-platform para acceder a Cloud Source Repositories

Cuando concedas acceso a tu repositorio de Git a una cuenta de servicio de Google en Cloud Source Repositories, el permiso de solo lectura debe incluirse en los permisos de acceso de los nodos del clúster.

El ámbito de solo lectura se puede añadir incluyendo cloud-source-repos-ro en la lista --scopes especificada al crear el clúster o usando el ámbito cloud-platform al crear el clúster. Por ejemplo:

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

Si falta el ámbito de solo lectura, verás un error similar al siguiente:

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

Falta el ámbito storage-ro para acceder a Artifact Registry

Cuando usas Artifact Registry, las capas de las imágenes se conservan en los contenedores de Cloud Storage. Cuando concedas acceso a una cuenta de servicio de Google a tu imagen de OCI o a tu gráfico de Helm en Artifact Registry, el ámbito de solo lectura debe incluirse en access scopes para los nodos del clúster.

El ámbito de solo lectura se puede añadir incluyendo storage-ro en la lista --scopes especificada al crear el clúster o usando el ámbito cloud-platform al crear el clúster. Por ejemplo:

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

Si falta el ámbito de solo lectura, verás un error similar al siguiente:

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

Es posible que el mensaje de error no incluya todos los detalles sobre la causa del error, pero sí proporciona un comando que imprime los registros del contenedor git-sync, que puede contener más información.

Si has habilitado las APIs RootSync o RepoSync, ejecuta el siguiente comando:

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

Si no has habilitado las APIs RootSync o RepoSync, ejecuta el siguiente comando:

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

Las APIs RootSync y RepoSync están habilitadas de forma predeterminada si has usado la consolaGoogle Cloud o la CLI de Google Cloud para instalar Config Sync y no puedes inhabilitarlas.

Siguientes pasos