Soluciona problemas de permisos con una cuenta de servicio de Google

En esta página, se muestra cómo resolver problemas de permisos que se producen cuando se usa el Sincronizador de configuración con una cuenta de servicio de Google.

Falta el acceso de lector

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 lector:

  • 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 fallan con 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, otorga a la cuenta de servicio el acceso de lector correcto.

Falta la vinculación de la política de IAM con Workload Identity Federation for GKE

Cuando se usa una cuenta de servicio de Google para la autenticación, se requiere una vinculación de políticas de IAM entre la cuenta de servicio de Google y la cuenta de servicio de Kubernetes. Si falta la vinculación de política de IAM, recibirás 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 la siguiente vinculación de política de 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

Reemplaza lo siguiente:

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

  • KSA_NAME: Es la cuenta de servicio de Kubernetes para el conciliador. Para 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.

    Para los repositorios de espacio 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: Es la cuenta de servicio de Google personalizada que deseas usar para conectarte a Cloud Source Repositories. Asegúrate de que la cuenta de servicio de Google que selecciones tenga el rol source.reader.

Nota: Para crear esta vinculación de política se requiere el permiso iam.serviceAccounts.setIamPolicy.

Asegúrate de que orkload Identity Federation for GKE para flotas, esté habilitada en los clústeres registrados. Para obtener más información, consulta Registra un clúster. Si tu clúster está en un proyecto diferente del proyecto host de la flota, debes vincular la cuenta de servicio de Google con la cuenta de servicio de Kubernetes en el proyecto host de la flota.

Falta un permiso cloud-platform para acceder a Cloud Source Repositories

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

Para agregar el permiso de solo lectura, incluye cloud-source-repos-ro en la lista --scopes especificada cuando creas el clúster o usas el permiso cloud-platform en el momento de la creación del clúster. Por ejemplo:

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

Si falta el permiso 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 permiso storage-ro para acceder a Artifact Registry

Cuando usas Artifact Registry, las capas de imágenes se guardan en buckets de Cloud Storage. Cuando otorgas a una cuenta de servicio de Google acceso a tu imagen de OCI o a tu diagrama de Helm en Artifact Registry, el permiso de solo lectura se debe incluir en los permisos de acceso para los nodos del clúster.

El alcance de solo lectura se puede agregar si incluyes storage-ro en la lista --scopes especificada en el momento de la creación del clúster o si usas el permiso cloud-platform en el momento de la creación del clúster. Por ejemplo:

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

Si falta el permiso 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 de la causa del error, pero proporciona un comando que imprime los registros del contenedor de git-sync que pueden tener más información.

Si habilitaste las APIs de RootSync o RepoSync, ejecuta el siguiente comando:

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

Si no habilitaste las APIs de RootSync o RepoSync, ejecuta el siguiente comando:

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

Las APIs de RootSync y RepoSync están habilitadas de forma predeterminada si usaste la consola de Google Cloud o Google Cloud CLI para instalar el Sincronizador de configuración y tú no puedes inhabilitarlas.

¿Qué sigue?