Dataproc on GKE の IAM ロールと ID

データプレーン ID

GKE on Dataproc は GKE Workload Identity を使用して、GKE クラスタの Dataproc 内の Pod がデフォルトの Dataproc VM サービス アカウント(データプレーン ID)の権限で操作できるようにします。Workload Identity には、GKE 仮想クラスタの Dataproc で使用される GSA の IAM ポリシーを更新するために、次の権限が必要です。

  • compute.projects.get
  • iam.serviceAccounts.getIamPolicy
  • iam.serviceAccounts.setIamPolicy

  1. agent KSA(Dataproc コントロール プレーンとやり取り):
    serviceAccount:${PROJECT}.svc.id.goog[${DPGKE_NAMESPACE}/agent]
  2. spark-driver KSA(Spark ドライバを実行):
    serviceAccount:${PROJECT}.svc.id.goog[${DPGKE_NAMESPACE}/spark-driver]
  3. spark-executor KSA(Spark エグゼキュータを実行):
    serviceAccount:${PROJECT}.svc.id.goog[${DPGKE_NAMESPACE}/spark-executor]

ロールを割り当てる

Dataproc VM サービス アカウントに権限を付与して、spark-driverspark-executor がプロジェクト リソース、データソース、データシンク、ワークロードに必要なサービスなどにアクセスできるようにします。

例:

次のコマンドは、デフォルトの Dataproc VM サービス アカウントにロールを割り当てて、GKE クラスタ VM 上の Dataproc で実行されている Spark ワークロードがプロジェクト内の Cloud Storage バケットと BigQuery データにアクセスできるようにします。

gcloud projects add-iam-policy-binding \
    --role=roles/storage.objectAdmin \
    --role=roles/bigquery.dataEditor \
    --member="project-number-compute@developer.gserviceaccount.com" \
    "${PROJECT}"

カスタム IAM 構成

GKE on Dataproc は GKE Workload Identity を使用して、デフォルトの Dataproc VM サービス アカウント(データプレーン ID)を 3 つの GKE サービス アカウント(KSA)にリンクします。

別の Google サービス アカウント(GSA)を作成して使用し、KSA にリンクするには:

  1. GSA を作成します(サービス アカウントの作成と管理をご覧ください)。

    gcloud CLI の例:

    gcloud iam service-accounts create "dataproc-${USER}" \
        --description "Used by Dataproc on GKE workloads."
    
    注:

    • この例では、GSA 名を「dataproc-${USER}」に設定していますが、別の名前を使用することもできます。
  2. 環境変数を設定する

    PROJECT=project-id \
      DPGKE_GSA="dataproc-${USER}@${PROJECT}.iam.gserviceaccount.com"
      DPGKE_NAMESPACE=GKE namespace
    
    注:

    • DPGKE_GSA: これらの例では、GSA のメールアドレスを含む変数の名前として DPGKE_GSA を設定しています。別の変数名を設定して使用できます。
    • DPGKE_NAMESPACE: デフォルトの GKE Namespace は、Dataproc on GKE クラスタの名前です。
  3. GKE クラスタで Dataproc を作成する際に、Dataproc がデフォルトの GSA の代わりに GSA を使用するように、次のプロパティを追加します。

    --properties "dataproc:dataproc.gke.agent.google-service-account=${DPGKE_GSA}" \
    --properties "dataproc:dataproc.gke.spark.driver.google-service-account=${DPGKE_GSA}" \
    --properties "dataproc:dataproc.gke.spark.executor.google-service-account=${DPGKE_GSA}" \

  4. Run the following commands to assign necessary Workload Identity permissions to the service accounts:

    1. Assign your GSA the dataproc.worker role to allow it to act as agent:
      gcloud projects add-iam-policy-binding \
          --role=roles/dataproc.worker \
          --member="serviceAccount:${DPGKE_GSA}" \
          "${PROJECT}"
      
    2. agent KSA に iam.workloadIdentityUser ロールを割り当て、GSA として機能できるようにします。

      gcloud iam service-accounts add-iam-policy-binding \
          --role=roles/iam.workloadIdentityUser \
          --member="serviceAccount:${PROJECT}.svc.id.goog[${DPGKE_NAMESPACE}/agent]" \
          "${DPGKE_GSA}"
      

    3. spark-driver KSA に iam.workloadIdentityUser ロールを付与して、GSA として機能できるようにします。

      gcloud iam service-accounts add-iam-policy-binding \
          --role=roles/iam.workloadIdentityUser \
          --member="serviceAccount:${PROJECT}.svc.id.goog[${DPGKE_NAMESPACE}/spark-driver]" \
          "${DPGKE_GSA}"
      

    4. spark-executor KSA に iam.workloadIdentityUser ロールを付与して、GSA として機能できるようにします。

      gcloud iam service-accounts add-iam-policy-binding \
          --role=roles/iam.workloadIdentityUser \
          --member="serviceAccount:${PROJECT}.svc.id.goog[${DPGKE_NAMESPACE}/spark-executor]" \
          "${DPGKE_GSA}"