使用服務帳戶建立多用戶群叢集

以 Dataproc 服務帳戶為基礎的多用戶群安全架構,可讓您與多位使用者共用叢集,並在建立叢集時,將一組使用者帳戶對應至服務帳戶。使用者可將 Jupyter 筆記本等互動式工作負載,提交至多租戶叢集上執行的核心,並使用獨立的使用者環境。

使用者將工作提交至多用戶群叢集時:

  • 這項工作會以特定 OS 使用者身分執行,並使用特定 Kerberos 主體。

  • 作業會使用對應的服務帳戶存取 Google Cloud 資源。

本文將說明如何建立 Dataproc 多租戶叢集,然後啟動 Jupyter Notebook 並連線至叢集上執行的 PySpark 核心。

注意事項和限制

建立多用戶群叢集時,請注意下列事項:

  • 只有已對應服務帳戶的 Google 帳戶使用者,才能使用叢集。無法對應 Google 群組。 未對應的使用者無法在叢集上執行工作。

  • 叢集已啟用並設定 Kerberos,確保叢集內通訊安全。不支援透過 Kerberos 進行使用者驗證。

  • 系統會封鎖對叢集和 Compute Engine 功能的直接 SSH 存取權,例如在叢集 VM 上執行啟動指令碼的功能。此外,工作無法以 sudo 權限執行。

  • 不支援 Dataproc Workflow

建立多用戶群叢集

您可以在建立 Dataproc 叢集時啟用多租戶功能。

控制台

使用 Google Cloud 控制台建立 Dataproc 叢集,步驟如下:

  1. 在 Google Cloud 控制台中,前往 Dataproc「Create a Dataproc cluster on Compute Engine」(在 Compute Engine 上建立 Dataproc 叢集) 頁面: 在 Compute Engine 上建立 Dataproc 叢集

  2. 在「設定叢集」面板中:

    1. 在「元件」下方:
      1. 在「元件閘道」下方,選取「啟用元件閘道」
      2. 在「選用元件」下方,選取「Jupyter Kernel Gateway」,讓多位使用者將自己的 Jupyter 筆記本連結至多租戶叢集。
  3. 在「Customize cluster」(自訂叢集) 面板中:

    1. 在「叢集屬性」下方:

      1. 如要允許新增或移除多租戶使用者,而不必重新建立叢集 (請參閱「更新多租戶叢集使用者」),請按一下「新增屬性」,然後新增 dataproc 前置字元、dynamic.multi.tenancy.enabled 屬性,並將值設為 true

        建議:由於 YARN 會為在多租戶叢集上執行的每個 Notebook 核心耗用大量叢集資源,因此請新增 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 對應檔:您可以指定本機或 Cloud Storage YAML 檔案,其中包含對應項目,而不使用 --secure-multi-tenancy-user-mapping 標記指定使用者帳戶與服務帳戶的對應項目。請使用 --identity-config-file 標記指定檔案。
    --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 會為在多租戶叢集上執行的每個 Notebook 核心耗用大量叢集資源,因此請新增 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 為叢集指定自訂 VM 服務帳戶。如果省略這個旗標,系統會使用預設叢集 VM 服務帳戶 PROJECT_NUMBER-compute@developer.gserviceaccount.com

    建議:為不同叢集使用不同的叢集服務帳戶,讓每個叢集 VM 服務帳戶只能模擬一小群對應的使用者服務帳戶。

  • 叢集服務帳戶必須具備 --scopes=https://www.googleapis.com/auth/iam,才能執行模擬作業。

  • --enable-component-gateway--optional-components=JUPYTER_KERNEL_GATEWAY: 啟用 Dataproc 元件閘道Jupyter Kernel Gateway 後,多位使用者就能將自己的 Jupyter 筆記本連結至多租戶叢集。

API

使用 SecurityConfig.IdentityConfig.userServiceAccountMapping field 指定使用者帳戶與服務帳戶的對應清單。

授予身分與存取權管理權限

如要將使用者筆記本連線至在多租戶叢集上執行的筆記本核心,對應的使用者、對應的服務帳戶和叢集 VM 服務帳戶必須具備存取資源所需的 IAM 權限。

對應的使用者權限

每個對應的使用者都必須具備 dataproc.clusters.getdataproc.clusters.use 權限,才能存取及連線至在多租戶叢集上執行的 Notebook 核心。您可以授予Dataproc 編輯者角色 (roles/dataproc.editor),其中包含這些權限 (請參閱「授予單一身分與存取權管理角色」),或建立具備這些權限的自訂角色

對應的服務帳戶權限

每個對應的服務帳戶都必須具備對應使用者筆記本應用程式所需的權限,例如存取 Cloud Storage 值區或 BigQuery 資料表的權限 (請參閱「管理服務帳戶的存取權」)。

VM 服務帳戶權限

多租戶叢集的 VM 服務帳戶必須對應每個服務帳戶都具有 iam.serviceAccounts.getAccessToken 權限。您可以授予服務帳戶憑證建立者角色 (roles/iam.serviceAccountTokenCreator),其中包含這項權限 (請參閱「管理服務帳戶的存取權」),或建立具有這項權限的自訂角色。 如要瞭解其他 VM 服務帳戶角色,請參閱「Dataproc VM 服務帳戶」。

將 Jupyter 筆記本連線至多用戶群叢集核心

對應的多用戶群叢集使用者可將 Vertex AI Workbench 或使用者管理的 Jupyter 筆記本,連線至多用戶群叢集上安裝的 Kernel。

Vertex AI 筆記本

如要建立 Jupyter 筆記本並連線至多用戶群叢集,請按照下列步驟操作:

  1. 建立 Vertex AI Workbench 執行個體
  2. 在「Workbench」執行個體分頁中,按一下執行個體的「Open JupyterLab」連結。
  3. 在「Dataproc 叢集筆記本」下方,按一下「PySpark (YARN 叢集)」MULTI_TENANCY_CLUSTER_NAME 資訊卡,即可連線並啟動新的 Jupyter PySpark 筆記本。

使用者管理的筆記本

如要建立使用者管理的 Jupyter 筆記本,並連線至 Dataproc 多租戶叢集,請按照步驟在使用者管理的 VM 上安裝 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

取代使用者

您可以使用 update 指令搭配 --identity-config-file 旗標,以一組新使用者取代現有使用者。這個標記很實用,可透過一個更新指令新增及移除使用者。

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

注意:

  • --identity-config-file:指定本機或 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