Google サービス アカウントの権限に関する問題のトラブルシューティングを行う

このページでは、Google サービス アカウントで Config Sync を使用する際に発生する権限に関する問題を解決する方法について説明します。

読み取りアクセス権がない

Cloud Source Repositories または Artifact Registry の認証に Google サービス アカウント(spec.git.gcpServiceAccountEmailspec.oci.gcpServiceAccountEmail、または spec.helm.gcpServiceAccountEmail)を使用する場合、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 ...

この問題を解決するには、サービス アカウントに正しい読み取りアクセス権を付与します。

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 を使用している場合は、2 つの異なるプロジェクト ID を使用できます。serviceAccount:PROJECT_ID で、クラスタが登録されているフリートのプロジェクト ID を追加します。GSA_NAME@PROJECT_ID に、Cloud Source Repositories のリポジトリに対する読み取りアクセス権を持つプロジェクトのプロジェクト ID を追加します。

  • KSA_NAME: Reconciler の 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 が有効になっていることを確認します。詳細については、クラスタを登録するをご覧ください。クラスタがフリート ホスト プロジェクトと異なるプロジェクトにある場合は、フリート ホスト プロジェクトの Kubernetes サービス アカウントに Google サービス アカウントをバインドする必要があります。

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 API または RepoSync API を有効にしている場合は、次のコマンドを実行します。

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

RootSync API または RepoSync API を有効にしていない場合は、次のコマンドを実行します。

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

RootSync API と RepoSync APIは、Google Cloud コンソールまたは Google Cloud CLI を使用して Config Sync をインストールした場合はデフォルトで有効になり、無効にすることはできません。

次のステップ

  • 依然として問題が解決しない場合について、既知の問題であるかどうかを確認する。