Dataproc on GKE IAM 角色和身份

数据平面身份

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

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

GKE 工作负载身份将以下 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 虚拟机服务账号分配角色,以允许在 Dataproc on GKE 集群虚拟机上运行的 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 工作负载身份将默认 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. 在 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}"