Dataproc on GKE IAM 角色和身份

数据平面身份

Dataproc on GKE 使用 GKE Workload Identity 来允许 Dataproc on GKE 集群中的 Pod 使用默认 Dataproc 虚拟机服务账号(数据平面身份)的权限执行操作。Workload Identity 需要具有以下权限,才能更新 Dataproc on GKE 虚拟集群使用的 GSA 上的 IAM 政策:

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

GKE Workload Identity 会将以下 GKE 服务账号 (KSA) 与 Dataproc 虚拟机服务账号相关联:

  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 虚拟机服务账号授予权限,以允许 spark-driverspark-executor 访问项目资源、数据源、数据接收器以及工作负载所需的任何其他服务。

示例:

以下命令会向默认 Dataproc 虚拟机服务账号分配角色,以允许在 GKE 集群虚拟机上的 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 配置

Dataproc on GKE 使用 GKE Workload Identity 将默认的 Dataproc 虚拟机服务账号(数据平面身份)与三个 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:示例设置并使用 DPGKE_GSA 作为包含 GSA 电子邮件地址的变量名称。您可以设置和使用其他变量名称。
    • DPGKE_NAMESPACE:默认 GKE 命名空间是您的 Dataproc on GKE 集群的名称。
  3. 创建 Dataproc on GKE 集群时,请为 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}"