Memecahkan masalah izin pada akun layanan Google

Halaman ini menunjukkan cara menyelesaikan masalah izin yang terjadi saat menggunakan Sinkronisasi Konfigurasi dengan akun layanan Google.

Akses pembaca tidak ada

Saat menggunakan akun layanan Google (spec.git.gcpServiceAccountEmail, atau spec.oci.gcpServiceAccountEmail, atau spec.helm.gcpServiceAccountEmail) untuk melakukan autentikasi ke Cloud Source Repositories atau Artifact Registry, akun layanan Google memerlukan akses pembaca berikut:

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

Jika akun layanan tidak memiliki peran ini, git-sync atau oci-sync atau helm-sync akan gagal dengan error yang serupa dengan yang berikut:

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

Untuk memperbaiki masalah ini, beri akun layanan akses pembaca yang benar.

Tidak ada binding kebijakan IAM dengan Workload Identity

Saat menggunakan akun layanan Google untuk autentikasi, binding kebijakan IAM diperlukan antara akun layanan Google dan akun layanan Kubernetes. Jika binding kebijakan IAM tidak ada, Anda akan mendapatkan error berikut:

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"

Untuk memperbaiki masalah ini, buat binding kebijakan IAM berikut:

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

Ganti kode berikut:

  • PROJECT_ID: Jika Anda menggunakan GKE Workload Identity, tambahkan project ID organisasi Anda. Jika menggunakan Workload Identity fleet, Anda dapat menggunakan dua project ID yang berbeda. Di serviceAccount:PROJECT_ID, tambahkan project ID fleet tempat cluster Anda terdaftar. Dalam GSA_NAME@PROJECT_ID, tambahkan project ID untuk setiap project yang memiliki akses baca ke repositori di Cloud Source Repositories.

  • KSA_NAME: akun layanan Kubernetes untuk rekonsiler. Untuk repositori root, jika nama RootSync adalah root-sync, KSA_NAME adalah root-reconciler. Jika tidak, root-reconciler-ROOT_SYNC_NAME.

    Untuk repositori namespace, jika nama RepoSync adalah repo-sync, KSA_NAME adalah ns-reconciler-NAMESPACE. Jika tidak, nilainya adalah ns-reconciler-NAMESPACE-REPO_SYNC_NAME.

  • GSA_NAME: akun layanan Google kustom yang ingin Anda gunakan untuk terhubung ke Cloud Source Repositories. Pastikan akun layanan Google yang Anda pilih memiliki peran source.reader.

Untuk membuat binding kebijakan ini, diperlukan izin iam.serviceAccounts.setIamPolicy.

Pastikan Workload Identity fleet diaktifkan di cluster yang terdaftar. Untuk mengetahui informasi selengkapnya, baca bagian Mendaftarkan cluster. Jika cluster berada dalam project yang berbeda dengan project fleet host, Anda harus mengikat akun layanan Google dengan akun layanan Kubernetes dalam project host fleet.

Cakupan cloud-platform tidak ada untuk mengakses Cloud Source Repositories

Saat memberi akun layanan Google akses ke repositori Git Anda di Cloud Source Repositories, cakupan hanya baca harus disertakan dalam cakupan akses untuk node dalam cluster.

Cakupan hanya baca dapat ditambahkan dengan menyertakan cloud-source-repos-ro dalam daftar --scopes yang ditentukan pada waktu pembuatan cluster, atau menggunakan cakupan cloud-platform pada waktu pembuatan cluster. Contoh:

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

Jika cakupan hanya baca tidak ada, Anda akan melihat error seperti berikut:

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

Cakupan storage-ro tidak ada untuk mengakses Artifact Registry

Saat Anda menggunakan Artifact Registry, lapisan image disimpan di bucket Cloud Storage. Saat memberi akun layanan Google akses ke image OCI atau Helm Chart di Artifact Registry, cakupan hanya baca harus disertakan dalam cakupan akses untuk node di cluster.

Cakupan hanya baca dapat ditambahkan dengan menyertakan storage-ro dalam daftar --scopes yang ditentukan pada waktu pembuatan cluster, atau menggunakan cakupan cloud-platform pada waktu pembuatan cluster. Contoh:

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

Jika cakupan hanya baca tidak ada, Anda akan melihat error seperti berikut:

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

Pesan error mungkin tidak menyertakan detail lengkap tentang penyebab error, tetapi memberikan perintah yang mencetak log dari penampung git-sync yang mungkin memiliki lebih banyak informasi.

Jika Anda telah mengaktifkan API RootSync atau RepoSync, jalankan perintah berikut:

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

Jika Anda belum mengaktifkan RootSync atau RepoSync API, jalankan perintah berikut:

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

RootSync API dan RepoSync API diaktifkan secara default jika Anda menggunakan Google Cloud Console atau Google Cloud CLI untuk menginstal Config Sync dan Anda tidak dapat menonaktifkannya.

Langkah selanjutnya

  • Jika Anda masih mengalami masalah, periksa apakah masalah Anda adalah masalah umum.