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. EnserviceAccount:PROJECT_ID
, añade el ID del proyecto de la flota en la que está registrado tu clúster. EnGSA_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 deRootSync
esroot-sync
,KSA_NAME
esroot-reconciler
. De lo contrario, esroot-reconciler-ROOT_SYNC_NAME
.En el caso de los repositorios de espacios de nombres, si el nombre de
RepoSync
esrepo-sync
,KSA_NAME
esns-reconciler-NAMESPACE
. De lo contrario, esns-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 rolsource.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
Si sigues teniendo problemas, comprueba si el problema que tienes es un problema conocido.
Si no encuentras una solución a tu problema en la documentación, consulta la sección Obtener asistencia para obtener más ayuda, incluidos consejos sobre los siguientes temas:
- Abrir un caso de asistencia poniéndose en contacto con el equipo de Atención al Cliente de Cloud.
- Recibir asistencia de la comunidad haciendo preguntas en Stack Overflow.
Si usas kpt o Kustomize, usa la etiqueta
kpt
okustomize
para buscar problemas similares. - Abrir errores o solicitudes de funciones mediante el sistema de seguimiento de problemas público en GitHub.