Google 서비스 계정의 권한 문제 해결

이 페이지에서는 Google 서비스 계정에 구성 동기화를 사용할 때 발생하는 권한 문제를 해결하는 방법을 보여줍니다.

리더 액세스 누락

Google 서비스 계정(spec.git.gcpServiceAccountEmail, spec.oci.gcpServiceAccountEmail, spec.helm.gcpServiceAccountEmail)을 사용하여 Cloud Source Repositories, Artifact Registry 또는 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 ...

이 문제를 해결하려면 서비스 계정에 올바른 리더 액세스 권한을 부여합니다.

워크로드 아이덴티티를 사용할 때 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 워크로드 아이덴티티를 사용하는 경우 조직의 프로젝트 ID를 추가합니다. Fleet 워크로드 아이덴티티를 사용하는 경우 두 개의 서로 다른 프로젝트 ID를 사용할 수 있습니다. serviceAccount:PROJECT_ID에서 클러스터가 등록된 Fleet의 프로젝트 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 권한이 필요합니다.

등록된 클러스터에서 Fleet 워크로드 아이덴티티가 사용 설정되어 있는지 확인합니다. 자세한 내용은 클러스터 등록을 참조하세요. 클러스터가 Fleet 호스트 프로젝트와 다른 프로젝트에 있는 경우 Google 서비스 계정을 Fleet 호스트 프로젝트의 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 버킷에 보관됩니다. Artifact Registry에서 Google 서비스 계정에 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

RootSyncRepoSync API는 Google Cloud 콘솔 또는 Google Cloud CLI를 사용하여 구성 동기화를 설치한 경우에 기본적으로 사용 설정됩니다. 이를 사용 중지할 수 없습니다.

다음 단계