Dataproc on GKE IAM 角色和身份

数据平面身份

Dataproc on GKE 使用 GKE 工作负载身份来允许 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 工作负载身份将默认的 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. 运行以下命令,为服务帐号分配必要的 Workload Identity 权限:

    1. 为您的 GSA 分配 dataproc.worker 角色,以允许其充当代理:
      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}"