Identidad y roles de IAM de Dataproc en GKE

Identidad del plano de datos

Dataproc en GKE usa Workload Identity de GKE para permitir que los Pods dentro del clúster de Dataproc on GKE actúen con la autoridad de la configuración Cuenta de servicio de VM de Dataproc (identidad del plano de datos). Workload Identity requiere los siguientes permisos para actualizar las políticas de IAM en la función de GTFS usada por Dataproc on GKE clúster virtual:

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

GKE Workload Identity vincula lo siguiente Cuentas de servicio de GKE (KSA) a la cuenta de servicio de la VM de Dataproc:

  1. agent KSA (interactúa con el plano de control de Dataproc):
    serviceAccount:${PROJECT}.svc.id.goog[${DPGKE_NAMESPACE}/agent]
  2. spark-driver KSA (ejecuta controladores de Spark):
    serviceAccount:${PROJECT}.svc.id.goog[${DPGKE_NAMESPACE}/spark-driver]
  3. spark-executor KSA (ejecuta ejecutores de Spark):
    serviceAccount:${PROJECT}.svc.id.goog[${DPGKE_NAMESPACE}/spark-executor]

Asignar roles

Otorga permisos a la cuenta de servicio de VM de Dataproc para permitir que spark-driver y spark-executor accedan a los recursos del proyecto, las fuentes de datos, los receptores de datos y cualquier otro servicio que requiera tu carga de trabajo.

Ejemplo:

El siguiente comando asigna roles a la cuenta de servicio predeterminada de la VM de Dataproc para permitir que las cargas de trabajo de Spark se ejecuten Las VMs de clúster de Dataproc on GKE para acceder a buckets de Cloud Storage y conjuntos de datos de BigQuery en el proyecto.

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

Configuración de IAM personalizada

Dataproc en GKE usa Workload Identity de GKE para vincular la cuenta de servicio predeterminada de la VM de Dataproc (identidad del plano de datos) a las tres cuentas de servicio de GKE (KSA).

Para crear y usar una cuenta de servicio de Google (GSA) diferente que vincule a las KSA, sigue estos pasos:

  1. Crea la app de GTFS (consulta la sección Crear y administrar cuentas de servicio).

    Ejemplo de gcloud CLI:

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

    • En el ejemplo, se establece el nombre de GTFS como "dataproc-${USER}", pero puede usar un nombre diferente.
  2. Establece las variables de entorno:

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

    • DPGKE_GSA: Los ejemplos establecen y usan DPGKE_GSA como el nombre de la variable que contiene la dirección de correo electrónico de su aplicación. Puedes configurar y usar una configuración de variable de entorno.
    • DPGKE_NAMESPACE: Es el valor predeterminado. Espacio de nombres de GKE es el nombre de tu clúster de Dataproc en GKE.
  3. Cuando crees el clúster de Dataproc en GKE, agrega las siguientes propiedades para que Dataproc use tu GSA en lugar de la GSA predeterminada:

    --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. Asigna a la KSA agent el rol iam.workloadIdentityUser para permitir que actúe como su aplicación:

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

    3. Otórgale a la KSA spark-driver el rol de iam.workloadIdentityUser para permitir que actúe como su aplicación:

      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. Otórgale a la KSA spark-executor el rol de iam.workloadIdentityUser para permitir que actúe como su aplicación:

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