Halaman ini menunjukkan cara menyelesaikan masalah izin yang terjadi saat menggunakan Config Sync dengan akun layanan Google.
Akses pembaca tidak ada
Saat menggunakan akun layanan Google (spec.git.gcpServiceAccountEmail
, atau
spec.oci.gcpServiceAccountEmail
, atau spec.helm.gcpServiceAccountEmail
) ke
melakukan autentikasi ke Cloud Source Repositories atau
Artifact Registry, sebuah 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
gagal dengan error yang mirip dengan berikut ini:
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 Federation untuk GKE
Saat menggunakan akun layanan Google untuk autentikasi, IAM pengikatan kebijakan diperlukan antara akun layanan Google dan Kubernetes akun layanan Anda. Jika binding kebijakan IAM tidak ada, Anda 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 Federation for GKE, tambahkan project ID organisasi Anda. Jika Anda menggunakan Workload Identity Federation untuk GKE, Anda dapat menggunakan dua project ID yang berbeda. SetelahserviceAccount:PROJECT_ID
, tambahkan project ID fleet tempat cluster Anda terdaftar. Di beberapaGSA_NAME@PROJECT_ID
, tambahkan project ID untuk semua project yang memiliki akses baca ke repositori di Cloud Source Repositories.KSA_NAME
: akun layanan Kubernetes untuk rekonsiliasi. Untuk repositori root, jika namaRootSync
adalahroot-sync
,KSA_NAME
adalahroot-reconciler
. Jika tidak,root-reconciler-ROOT_SYNC_NAME
.Untuk repositori namespace, jika nama
RepoSync
adalahrepo-sync
,KSA_NAME
adalahns-reconciler-NAMESPACE
. Jika tidak, akanns-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 peransource.reader
.
Untuk membuat binding kebijakan ini, Anda memerlukan iam.serviceAccounts.setIamPolicy
izin akses.
Pastikan bahwa fleet Workload Identity Federation for GKE diaktifkan di cluster Anda yang terdaftar. Untuk selengkapnya informasi selengkapnya, lihat Mendaftarkan cluster. Jika cluster Anda berada dalam project yang berbeda dari project host fleet, Anda perlu untuk mengikat akun layanan Google dengan akun layanan Kubernetes di project host fleet Anda.
cloud-platform
cakupan 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
--scopes
yang ditentukan pada waktu pembuatan cluster, atau dengan menggunakan
cloud-platform
cakupan pada waktu pembuatan cluster. Contoh:
gcloud container clusters create CLUSTER_NAME --scopes=cloud-platform
Jika cakupan hanya baca tidak ada, Anda akan melihat error yang mirip dengan berikut ini:
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":{}}
storage-ro
cakupan tidak ada untuk mengakses Artifact Registry
Saat Anda menggunakan Artifact Registry, lapisan image disimpan di Cloud Storage bucket. Saat memberi akun layanan Google akses ke image OCI atau Helm Anda Di Artifact Registry, cakupan hanya baca harus disertakan dalam akses cakupan untuk node di gugus ini.
Cakupan hanya baca dapat ditambahkan dengan menyertakan storage-ro
di --scopes
daftar yang ditentukan pada waktu pembuatan cluster, atau dengan 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 yang mirip dengan berikut ini:
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 penyebab error.
tetapi menyediakan perintah yang mencetak log dari container git-sync
yang mungkin memiliki
lebih banyak informasi.
Jika Anda telah mengaktifkan RootSync
atau RepoSync
API, jalankan perintah berikut:
kubectl logs -n config-management-system -l app=reconciler -c git-sync
Jika Anda belum mengaktifkan API RootSync
atau RepoSync
, jalankan perintah berikut:
kubectl logs -n config-management-system -l app=git-importer -c git-sync
API RootSync
dan RepoSync
diaktifkan secara default jika Anda menggunakan
Konsol Google Cloud atau Google Cloud CLI untuk menginstal Config Sync dan Anda
tidak dapat menonaktifkannya.
Langkah selanjutnya
- Jika Anda masih mengalami masalah, periksa apakah adalah masalah umum.