GKE 用マネージド ワークロード ID 認証のトラブルシューティング

このドキュメントでは、マネージド ワークロード ID の一般的なエラーの解決方法について説明します。

Pod のステータスは、次のコマンドを実行して確認できます。

kubectl describe pod

証明書を使用して Pod をデプロイできない

マウントされた証明書を使用して Google Kubernetes Engine(GKE)ワークロード Pod のデプロイに失敗した場合は、次のコマンドを使用して Pod のステータスを確認します。

kubectl describe pod POD_NAME -n POD_NAMESPACE

権限関連のエラー

このセクションでは、権限が正しくない場合のエラーについて説明します。

証明書の発行中に権限が拒否されました: GKE Auth から証明書を発行できませんでした

次のようなエラー メッセージが表示されます。

Permission denied while issuing the certificate: failed to issue the certificate from the GKE Auth: rpc error: code = PermissionDenied desc = Permission 'privateca.certificates.createForSelf' denied on 'projects/PROJECT_NUMBER/locations/REGION/caPools/ CA_POOL_ID'

このエラーは、ワークロード ID プールに下位 CA プールに対する CA Service Workload Certificate Requester ロール(roles/privateca.workloadCertificateRequester)がないために発生します。

このエラーを解決するには、ワークロード ID プールにロールを付与します。

gcloud privateca pools add-iam-policy-binding SUBORDINATE_CA_POOL_ID \
   --project=CA_POOL_PROJECT_ID \
   --location=REGION \
   --role=roles/privateca.workloadCertificateRequester \
   --member="principal://iam.googleapis.com/projects/CA_POOL_PROJECT_NUMBER/name/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog"

次のように置き換えます。

  • SUBORDINATE_CA_POOL_ID: 下位 CA プールの ID
  • CA_POOL_PROJECT_ID: ルート CA プールのプロジェクト ID
  • REGION: 下位 CA のリージョン
  • CA_POOL_PROJECT_NUMBER: CA プールのプロジェクト番号
  • PROJECT_ID: Workload Identity プールのプロジェクト ID

ボリュームの MountVolume.SetUp が失敗しました

次のようなエラー メッセージが表示されます。

MountVolume.SetUp failed for volume "fleet-spiffe-credentials" : rpc error: code = Internal desc = unable to mount volume: while creating volume: while loading trust bundles: rpc error: code = Internal desc = while getting trust map from the trustBundleWatcher: rpc error: code = Internal desc = no GKEClusterTrustBundle objects found with fleet WIP nickname fleet-project/svc.id.goog

このエラーは、ワークロード ID プールに下位 CA プールに対する Private CA プール読み取りロール(roles/privateca.poolReader)がないために発生します。

このエラーを解決するには、プールにロールを付与し、信頼バンドルが読み込まれるまで数分待ちます。

gcloud privateca pools add-iam-policy-binding SUBORDINATE_CA_POOL_ID \
 --location=REGION \
 --role=roles/privateca.poolReader \
 --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/name/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog"

次のように置き換えます。

  • SUBORDINATE_CA_POOL_ID: 下位 CA プールの ID
  • REGION: 下位 CA のリージョン
  • PROJECT_NUMBER: Workload Identity プールのプロジェクト番号
  • PROJECT_ID: Workload Identity プールのプロジェクト ID

次のコマンドを使用して、信頼バンドルの存在を確認できます。

kubectl get gkeclustertrustbundle

信頼バンドルが読み込まれると、レスポンスは次のようになります。

NAME                                         AGE
svc.id.goog-PROJECT_ID.svc.id.goog   5m35s

出力では、PROJECT_ID は信頼ルートが関連付けられているフリートのプロジェクト ID です。

証明書のエラー

このセクションのエラーは、証明書の構成に関連しています。

マネージド ワークロード ID 証明書が生成されないと、複数のエラーが発生する可能性があります。Pod にマウントされたボリュームにこれらの証明書が存在するかどうかを確認するには、次の操作を行います。

  1. Pod に接続します。

    # Open the pod sh interface
    kubectl exec -it $pod_name -n $pod_namespace -- sh
    
  2. 認証情報ファイルを一覧表示して検査します。

    # Look up the volume contents:
    ls -la /var/run/secrets/workload-spiffe-credentials
    cat /var/run/secrets/workload-spiffe-credentials/certificates.pem
    cat /var/run/secrets/workload-spiffe-credentials/ca_certificates.pem
    cat /var/run/secrets/workload-spiffe-credentials/private_key.pem
    cat /var/run/secrets/workload-spiffe-credentials/trust_bundles.json
    

Google Cloud コンソールから `gke-metadata-server コンテナの k8s_container ログを調べることで、Pod の証明書のプロビジョニング ステータスを確認することもできます。

証明書の発行中に前提条件が満たされませんでした

Pod の説明には次のメッセージが含まれることがあります。

Failed precondition while issuing the certificate: failed to issue the certificate from the GKE Auth: rpc error: code = FailedPrecondition

このエラーは、Workload Identity プールが証明書発行構成(CIC)で構成されていないことが原因で発生します。

このエラーを解決するには、CIC を作成し、それを使用してワークロード ID プールを更新します。