使用服务账号创建多租户集群

借助基于 Dataproc 服务账号的安全多租户,您可以与多个用户共享集群,并在创建集群时将一组用户账号映射到服务账号。用户可以将交互式工作负载(例如 Jupyter 笔记本)提交到在具有隔离的用户环境的多租户集群上运行的内核。

当用户将作业提交到多租户集群时:

  • 作业以具有特定 Kerberos 主账号的特定操作系统用户身份运行。

  • 作业使用映射的服务账号访问 Google Cloud 资源。

本文档介绍了如何创建 Dataproc 多租户集群,然后启动 Jupyter 笔记本并将其连接到在集群上运行的 PySpark 内核。

注意事项和限制

创建多租户集群时:

  • 集群仅适用于具有映射服务账号的 Google 账号用户。无法映射 Google 群组。未映射的用户无法在集群上运行作业。

  • 在该集群上启用并配置 Kerberos,可实现集群内通信。 不支持通过 Kerberos 进行最终用户身份验证。

  • 对集群和 Compute Engine 功能的直接 SSH 访问(例如,在集群虚拟机上运行启动脚本的功能)都会被屏蔽。此外,作业无法使用 sudo 权限运行。

  • 不支持 Dataproc 工作流

创建多租户集群

您可以在创建 Dataproc 集群时启用多租户功能。

控制台

使用 Google Cloud 控制台创建 Dataproc 集群,如下所示:

  1. 在 Google Cloud 控制台中,前往 Dataproc 在 Compute Engine 上创建 Dataproc 集群页面:在 Compute Engine 上创建 Dataproc 集群

  2. 设置集群面板上:

    1. 组件下:
      1. 组件网关下,选择启用组件网关
      2. 可选组件下,选择 Jupyter 内核网关,以便让多个用户将其 Jupyter 笔记本连接到多租户集群。
  3. 自定义集群面板上:

    1. 集群属性下:

      1. 如需允许在不重新创建集群的情况下添加或移除多租户用户(请参阅更新多租户集群用户),请点击 添加属性,然后添加 dataproc 前缀、dynamic.multi.tenancy.enabled 属性,并将其值设置为 true

        建议:由于 YARN 会为在多租户集群上运行的每个笔记本内核消耗大量集群资源,因此请添加 Spark 和 YARN 属性来增加资源分配。

        示例:

        前缀
        spark spark.driver.memory 5g
        spark spark.executor.memory 5g
        spark spark.executor.cores 200
        capacity-scheduler yarn.scheduler.capacity.maximum-am-resource-percent 0.5

  4. 管理安全设置面板上:

    1. 项目访问权限下,选择为此集群启用 cloud-platform 范围
    2. 安全多租户下:
      1. 选择启用
      2. 多租户映射下:
        1. 点击 添加多租户映射,以添加用户账号到服务账号的映射。
  5. 确认或输入其他集群设置(请参阅使用 Google Cloud 控制台创建 Dataproc 集群)。

  6. 点击创建

gcloud

gcloud dataproc clusters create command--secure-multi-tenancy-user-mapping 标志搭配使用,以指定用户账号到服务账号的映射列表。

gcloud dataproc clusters create CLUSTER_NAME \
    --region=REGION \
    --secure-multi-tenancy-user-mapping=USER_MAPPINGS: \
    --properties "dataproc:dataproc.dynamic.multi.tenancy.enabled=true" \
    --service-account=CLUSTER_SERVICE_ACCOUNT@iam.gserviceaccount.com \
    --scopes=https://www.googleapis.com/auth/iam \
    --optional-components=JUPYTER_KERNEL_GATEWAY \
    --enable-component-gateway \
    other args ...

注意:

  • USER_MAPPINGS:指定将用户账号映射到服务账号的英文逗号分隔列表。

    --secure-multi-tenancy-user-mapping=UserA@my-company.com:SERVICE_ACCOUNT_FOR_USERA@iam.gserviceaccount.com,UserB@my-company.com:SERVICE_ACCOUNT_FOR_USERB@iam.gserviceaccount.com,UserC@my-company.com:SERVICE_ACCOUNT_FOR_USERC@iam.gserviceaccount.com
    
    使用 YAML 映射文件:您可以使用 --identity-config-file 标志指定包含用户账号到服务账号的映射的本地或 Cloud Storage YAML 文件,而不是使用 --secure-multi-tenancy-user-mapping 标志指定该映射。
    --identity-config-file=LOCAL_FILE or gs://BUCKET/FOLDER/FILENAME
    
    映射文件中的每一行都会将一个用户账号映射到一个服务账号。第一行包含 user_service_account_mapping: 标头。
    user_service_account_mapping:
    UserA@my-company.com:SERVICE_ACCOUNT_FOR_USERA@iam.gserviceaccount.com
    UserB@my-company.com:SERVICE_ACCOUNT_FOR_USERB@iam.gserviceaccount.com
    UserC@my-company.com:SERVICE_ACCOUNT_FOR_USERC@iam.gserviceaccount.com
    

  • --properties "dataproc:dataproc.dynamic.multi.tenancy.enabled=true":此属性允许在不重新创建集群的情况下添加或移除多租户集群用户(请参阅更新多租户集群用户)。

    建议:由于 YARN 会为在多租户集群上运行的每个笔记本内核消耗大量集群资源,因此请添加 Spark 和 YARN 属性来增加资源分配。

    示例:

    --properties=" \
    spark:spark.driver.memory=5g,\
    spark:spark.executor.memory=5g,\
    spark:spark.executor.cores=200, \
    capacity-scheduler:yarn.scheduler.capacity.maximum-am-resource-percent=0.5"
    
  • CLUSTER_SERVICE_ACCOUNT(可选):您可以使用 --service-account flag 为集群指定自定义虚拟机服务账号。如果省略此标志,系统会使用默认的集群虚拟机服务账号 PROJECT_NUMBER-compute@developer.gserviceaccount.com

    建议:为不同的集群使用不同的集群服务账号,以使每个集群服务账号只能模拟有限的一组已映射的用户服务账号。

  • 集群服务账号需要 --scopes=https://www.googleapis.com/auth/iam 才能执行模拟操作。

  • --enable-component-gateway--optional-components=JUPYTER_KERNEL_GATEWAY:启用 Dataproc 组件网关Jupyter 内核网关可让多个用户将其 Jupyter 笔记本连接到多租户集群。

API

使用 SecurityConfig.IdentityConfig.userServiceAccountMapping field 指定用户账号到服务账号的映射列表。

授予 Identity and Access Management 权限

如需将用户笔记本连接到在多租户集群上运行的笔记本内核,已映射的用户、已映射的服务账号和集群虚拟机服务账号必须拥有访问资源所需的 IAM 权限。

已映射的用户权限

每个已映射的用户都必须拥有 dataproc.clusters.getdataproc.clusters.use 权限,用户需要这些权限才能访问并连接到在多租户集群上运行的笔记本内核。您可以授予提供这些权限的 Dataproc Editor 角色 (roles/dataproc.editor)(请参阅授予单个 IAM 角色),或者创建具有这些权限的自定义角色

已映射的服务账号权限

每个已映射的服务账号都必须拥有已映射的用户笔记本应用所需的权限,例如对 Cloud Storage 存储桶或 BigQuery 表的访问权限(请参阅管理对服务账号的访问权限)。

虚拟机服务账号权限

多租户集群虚拟机服务账号必须拥有每个已映射的服务账号的 iam.serviceAccounts.getAccessToken 权限。您可以授予提供此权限的 Service Account Token Creator 角色 (roles/iam.serviceAccountTokenCreator)(请参阅管理对服务账号的访问权限),也可以创建具有此权限的自定义角色。如需了解其他虚拟机服务账号角色,请参阅 Dataproc 虚拟机服务账号

将 Jupyter 笔记本连接到多租户集群内核

已映射的多租户集群用户可以将其 Vertex AI Workbench Jupyter 笔记本或用户管理的 Jupyter 笔记本连接到安装在多租户集群上的内核。

Vertex AI 笔记本

如需创建 Jupyter 笔记本并将其连接到多租户集群,请执行以下操作:

  1. 创建 Vertex AI Workbench 实例
  2. Workbench 实例标签页上,点击实例的打开 JupyterLab 链接。
  3. Dataproc 集群笔记本下,点击 MULTI_TENANCY_CLUSTER_NAME 上的 PySpark (YARN 集群) 卡片,以连接并启动新的 Jupyter PySpark 笔记本。

用户管理的笔记本

如需创建用户管理的 Jupyter 笔记本并将其连接到 Dataproc 多租户集群,请按照以下步骤在用户管理的虚拟机上安装 JupyterLab 扩展程序

更新多租户集群用户(预览版)

如果您在创建多租户集群时将 dataproc:dataproc.dynamic.multi.tenancy.enabled 集群属性设置为 true,则可以在创建集群后添加、移除或替换多租户集群用户。

添加用户

以下更新命令使用 --add-user-mappings 标志向安全多租户集群添加两个新的用户账号到服务账号的映射。

gcloud dataproc clusters update CLUSTER_NAME \
    --region=REGION \
    --add-user-mappings=new-user1@my-company.com=SERVICE_ACCOUNT_FOR_NEW_USER1@iam.gserviceaccount.com,new-user2@my-company.com=SERVICE_ACCOUNT_FOR_NEW_USER2@iam.gserviceaccount.com

移除用户

以下更新命令使用 --remove-user-mappings 标志从多租户集群中移除两个用户。此标志接受要移除的用户的用户账号。

gcloud dataproc clusters update CLUSTER_NAME \
    --region=REGION \
    --remove-user-mappings=UserB@my-company.com,UserC@my-company.com

替换用户

您可以将更新命令与 --identity-config-file 标志结合使用,将一组现有用户替换为一组新用户。此标志可用于通过一个更新命令同时添加和移除用户。

gcloud dataproc clusters update CLUSTER_NAME \
    --region=REGION \
    --identity-config-file=identity-config.yaml

注意:

  • --identity-config-file:指定包含新的用户账号到服务账号映射的本地 YAML 文件或 Cloud Storage YAML 文件。
    --identity-config-file=LOCAL_FILE or gs://BUCKET/FOLDER/FILENAME
    
    映射文件中的每一行都会将一个用户账号映射到一个服务账号。第一行包含 user_service_account_mapping: 标头。
    user_service_account_mapping:
    new-user1@my-company.com:SERVICE_ACCOUNT_FOR_NEW_USER1@iam.gserviceaccount.com
    new-user2@my-company.com:SERVICE_ACCOUNT_FOR_NEW_USER2@iam.gserviceaccount.com