排查 Google 服务账号的权限问题

本页面介绍如何解决将 Config Sync 与 Google 服务账号搭配使用时发生的权限问题。

缺少读取权限

使用 Google 服务账号(spec.git.gcpServiceAccountEmailspec.oci.gcpServiceAccountEmailspec.helm.gcpServiceAccountEmail)向 Cloud Source Repositories 或 Artifact Registry 进行身份验证时,Google 服务账号需要具有以下读取权限:

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

如果服务账号缺少这些角色,git-syncoci-synchelm-sync 会失败,并显示类似于以下内容的错误:

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

如需解决此问题,请向服务账号授予正确的 reader 权限。

缺少与 Workload Identity 的 IAM 政策绑定

使用 Google 服务账号进行身份验证时,Google 服务账号与 Kubernetes 服务账号之间需要有 IAM 政策绑定。如果缺少 IAM 政策绑定,则会出现以下错误:

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"

要解决此问题,请创建以下 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

替换以下内容:

  • PROJECT_ID:如果您使用的是 GKE Workload Identity,请添加您的组织的项目 ID。 如果您使用的是舰队 Workload Identity,则可以使用两个不同的项目 ID。在 serviceAccount:PROJECT_ID 中,添加集群注册到的舰队的项目 ID。在 GSA_NAME@PROJECT_ID 中,添加对 Cloud Source Repositories 中的代码库具有读取权限的任何项目的项目 ID。

  • KSA_NAME:协调器的 Kubernetes 服务账号。对于根代码库,如果 RootSync 名称为 root-sync,则 KSA_NAMEroot-reconciler。否则为 root-reconciler-ROOT_SYNC_NAME

    对于命名空间代码库,如果 RepoSync 名称为 repo-sync,则 KSA_NAMEns-reconciler-NAMESPACE;否则为 ns-reconciler-NAMESPACE-REPO_SYNC_NAME

  • GSA_NAME:您要用于连接到 Cloud Source Repositories 的自定义 Google 服务账号。确保您选择的 Google 服务账号具有 source.reader 角色。

创建此政策绑定需要 iam.serviceAccounts.setIamPolicy 权限。

确保在已注册的集群上启用了 Workload Identity。如需了解详情,请参阅注册集群。如果集群所在项目与舰队宿主项目不同,您需要将 Google 服务账号与舰队宿主项目中的 Kubernetes 服务账号绑定。

缺少用于访问 Cloud Source Repositories 的 cloud-platform 范围

向 Google 服务账号授予对 Cloud Source Repositories 中的 Git 代码库的访问权限时,只读范围必须包含在集群节点的访问权限范围中。

如需添加只读范围,您可以在创建集群时指定的 --scopes 列表中包含 cloud-source-repos-ro,或在创建集群时使用 cloud-platform 范围。例如:

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

如果缺少只读范围,您会看到类似于以下内容的错误:

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

缺少用于访问 Artifact Registry 的 storage-ro 范围

在使用 Artifact Registry 时,映像层保存在 Cloud Storage 存储桶中。向 Google 服务账号授予对 Artifact Registry 中的 OCI 映像或 Helm 图表的访问权限时,只读范围必须包含在集群节点的访问权限范围中。

如需添加只读范围,您可以在创建集群时指定的 --scopes 列表中包含 storage-ro,或在创建集群时使用 cloud-platform 范围。例如:

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

如果缺少只读范围,您会看到类似于以下内容的错误:

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

错误消息可能不包含导致错误的完整详细信息,但它提供了一个命令来输出 git-sync 容器中的日志,该日志中可能包含更多信息。

如果您启用了 RootSyncRepoSync API,请运行以下命令:

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

如果您尚未启用 RootSyncRepoSync API,请运行以下命令:

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

如果您使用 Google Cloud 控制台或 Google Cloud CLI 安装了 Config Sync,则 RootSyncRepoSync 默认处于启用状态且无法停用。

后续步骤

  • 如果您仍然遇到问题,请检查您的问题是否为已知问题