本页面介绍如何解决将 Config Sync 与 Google 服务账号搭配使用时发生的权限问题。
缺少读取权限
使用 Google 服务账号(spec.git.gcpServiceAccountEmail
、spec.oci.gcpServiceAccountEmail
或 spec.helm.gcpServiceAccountEmail
)向 Cloud Source Repositories 或 Artifact Registry 进行身份验证时,Google 服务账号需要具有以下读取权限:
- Cloud Source Repositories:
roles/source.reader
- Artifact Registry:
roles/artifactregistry.reader
如果服务账号缺少这些角色,git-sync
、oci-sync
或 helm-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_NAME
为root-reconciler
。否则为root-reconciler-ROOT_SYNC_NAME
。对于命名空间代码库,如果
RepoSync
名称为repo-sync
,则KSA_NAME
为ns-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
容器中的日志,该日志中可能包含更多信息。
如果您启用了 RootSync
或 RepoSync
API,请运行以下命令:
kubectl logs -n config-management-system -l app=reconciler -c git-sync
如果您尚未启用 RootSync
或 RepoSync
API,请运行以下命令:
kubectl logs -n config-management-system -l app=git-importer -c git-sync
如果您使用 Google Cloud 控制台或 Google Cloud CLI 安装了 Config Sync,则 RootSync
和 RepoSync
默认处于启用状态且无法停用。
后续步骤
- 如果您仍然遇到问题,请检查您的问题是否为已知问题。