Nesta página, mostramos como resolver problemas de permissão que ocorrem ao usar o Config Sync com uma conta de serviço do Google.
Sem acesso ao leitor
Ao usar uma conta de serviço do Google (spec.git.gcpServiceAccountEmail, spec.oci.gcpServiceAccountEmail,
ou spec.helm.gcpServiceAccountEmail) para
se autenticar no Cloud Source Repositories ou no Artifact Registry, a conta
de serviço do Google exige o seguinte acesso de leitor:
- Cloud Source Repositories:
roles/source.reader - Artifact Registry:
roles/artifactregistry.reader
Se a conta de serviço não tiver esses papéis, git-sync, oci-sync ou
helm-sync vão falhar com erros semelhantes aos seguintes:
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 corrigir esse problema, conceda à conta de serviço o acesso correto de leitor.
Vinculação de política do IAM ausente com a Federação de Identidade da Carga de Trabalho para GKE
Ao usar uma conta de serviço do Google para autenticação, é necessário vincular uma política de IAM entre a conta de serviço do Google e a conta de serviço do Kubernetes. Se a vinculação de política do IAM estiver ausente, você receberá o seguinte erro:
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 corrigir o problema, crie a seguinte vinculação de política do 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
Substitua:
PROJECT_ID: se você estiver usando a Federação de Identidade da Carga de Trabalho para GKE, adicione o ID do projeto da sua organização. Se você usa a Federação de Identidade da Carga de Trabalho para GKE da frota, é possível usar dois IDs de projetos diferentes. EmserviceAccount:PROJECT_ID, adicione o ID do projeto da frota em que o cluster está registrado. EmGSA_NAME@PROJECT_ID, adicione uma ID do projeto para qualquer projeto que tenha acesso de leitura ao repositório no Cloud Source Repositories.KSA_NAME: a conta de serviço do Kubernetes do reconciliador. Para repositórios raiz, se o nomeRootSyncforroot-sync,KSA_NAMEserároot-reconciler. Caso contrário, serároot-reconciler-ROOT_SYNC_NAME.Para repositórios de namespace, se o nome
RepoSyncforrepo-sync,KSA_NAMEseráns-reconciler-NAMESPACE. Caso contrário, seráns-reconciler-NAMESPACE-REPO_SYNC_NAME.GSA_NAME: a conta de serviço personalizada do Google que você quer usar para se conectar ao Cloud Source Repositories. Verifique se a conta de serviço do Google selecionada tem o papelsource.reader.
A criação dessa vinculação de política requer a
permissão .iam.serviceAccounts.setIamPolicy
A Federação de Identidade da Carga de Trabalho para GKE precisa estar ativada nos clusters registrados. Para mais informações, consulte Registrar um cluster. Se o cluster estiver em um projeto diferente do projeto host da frota, será necessário vincular a conta de serviço do Google à conta de serviço do Kubernetes no projeto host da frota.
Escopo cloud-platform ausente para acessar o Cloud Source Repositories
Ao conceder a uma conta de serviço do Google acesso ao repositório Git no Cloud Source Repositories, o escopo somente leitura precisa ser incluído nos escopos de acesso dos nós no cluster.
O escopo somente leitura pode ser adicionado incluindo cloud-source-repos-ro na
lista --scopes especificada no momento da criação do cluster ou usando o
escopo cloud-platform no momento da criação do cluster. Exemplo:
gcloud container clusters create CLUSTER_NAME --scopes=cloud-platform
Se o escopo somente leitura estiver ausente, você verá um erro semelhante a este
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":{}}
Escopo storage-ro ausente para acessar o Artifact Registry
Ao usar o Artifact Registry, as camadas de imagem são mantidas nos buckets do Cloud Storage. Ao conceder a uma conta de serviço do Google acesso à imagem OCI ou Helm Chart no Artifact Registry, o escopo somente leitura precisa ser incluído em escopos de acesso para os nós no cluster.
O escopo somente leitura pode ser adicionado incluindo storage-ro na lista --scopes
especificada no momento da criação do cluster ou usando o escopo cloud-platform
no momento da criação do cluster. Exemplo:
gcloud container clusters create CLUSTER_NAME --scopes=cloud-platform
Se o escopo somente leitura estiver ausente, você verá um erro semelhante a este
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":{}}
Talvez a mensagem de erro não inclua todos os detalhes do que causou o erro,
mas ela fornecerá um comando que imprime os logs do contêiner git-sync
que podem ter mais informações.
Se você ativou as APIs RootSync ou RepoSync, execute o seguinte comando:
kubectl logs -n config-management-system -l app=reconciler -c git-sync
Se você não ativou as APIs RootSync ou RepoSync, execute o seguinte comando:
kubectl logs -n config-management-system -l app=git-importer -c git-sync
As APIs RootSync e RepoSync são ativadas por padrão se você usou o
consoleGoogle Cloud ou a Google Cloud CLI para instalar o Config Sync e
não pode desativá-lo.
A seguir
Se ainda estiver com problemas, verifique se o seu é um problema conhecido.
Se você não encontrar uma solução para seu problema na documentação, consulte Receber suporte para mais ajuda, incluindo conselhos sobre os seguintes tópicos:
- Abrir um caso de suporte entrando em contato com o Cloud Customer Care.
- Receber suporte da comunidade fazendo perguntas no StackOverflow.
Se você usa kpt ou Kustomize, use a tag
kptoukustomizepara pesquisar problemas semelhantes. - Abrir bugs ou solicitações de recursos usando o Issue Tracker público no GitHub.