基於 Dataproc 服務帳戶的安全多租戶架構支援多名使用者共用叢集,其方式是在建立叢集時,將一組使用者帳戶對應至服務帳戶。使用者可在隔離的使用者環境下,將互動式工作負載(例如 Jupyter Notebook)提交至該多租戶叢集上執行的核心。
使用者將工作提交至多租戶叢集時:
這項工作會以特定 OS 使用者身分執行,並使用特定 Kerberos 主體。
這項工作會使用對應的服務帳戶存取 Google Cloud 資源。
本文將說明如何建立 Dataproc 多租戶叢集,然後啟動 Jupyter Notebook,並連線至叢集上執行的 PySpark 核心。
注意事項與限制
建立多租戶叢集時,請注意下列事項:
叢集僅供對應服務帳戶的 Google 帳戶使用者使用。Google 群組無法進行對應。未對應的使用者無法在叢集上執行工作。
叢集會啟用並設定 Kerberos,以確保叢集內通訊安全。不支援透過 Kerberos 進行使用者驗證。
系統會封鎖直接透過 SSH 存取叢集和 Compute Engine 功能,例如在叢集 VM 上執行啟動指令碼。此外,工作無法以
sudo權限執行。不支援 Dataproc 工作流程。
建立多租戶叢集
您可以在建立 Dataproc 叢集時啟用多租戶功能。
控制台
使用 Google Cloud 控制台建立 Dataproc 叢集,步驟如下:
在 Google Cloud 控制台,前往 Dataproc「Create a Dataproc cluster on Compute Engine」(在 Compute Engine 上建立 Dataproc 叢集) 頁面:在 Compute Engine 上建立 Dataproc 叢集
在「Set up cluster」(設定叢集)面板中:
- 在「Components」(元件) 下方:
- 在「Component Gateway」(元件閘道) 下方,選取「enable component gateway」(啟用元件閘道)。
- 在「Optional components」(選用元件) 下方,選取「Jupyter Kernel Gateway」(Jupyter Kernel 閘道) ,讓多位使用者將自己的 Jupyter Notebook 連結至多租戶叢集。
- 在「Components」(元件) 下方:
在「Customize cluster」(自訂叢集) 面板中:
在「Cluster properties」(叢集屬性) 下方:
如要允許新增或移除多租戶使用者而不必重新建立叢集 (請參閱「更新多租戶叢集使用者」),請按一下「Add Properties」(新增屬性),然後新增
dataproc前置字元、dataproc.dynamic.multi.tenancy.enabled屬性,並將值設為true。建議:由於 YARN 會為多租戶叢集上執行的各個 Notebook 核心耗用大量叢集資源,因此請新增 Spark 和 YARN 屬性,以增加資源分配量。
範例:
前置字串 索引鍵 值 spark spark.driver.memory 5G spark spark.executor.memory 5G spark spark.executor.cores 2 capacity-scheduler yarn.scheduler.capacity.maximum-am-resource-percent 0.5
在「Manage security」(管理安全性 )面板中:
- 在「Project access」(專案存取權) 下方,選取「Enables the cloud-platform scope for this cluste為」(為此叢集啟用 cloud-platform 範圍)。
- 在「Secure Multi Tenancy」(安全多租戶架構) 下方:
- 選取「Enable」(啟用)。
- 在「Multi-tenancy Mapping」(多租戶對應) 下方:
- 按一下「Add Multi-tenancy Mapping」(新增多租戶對應) ,將使用者帳戶對應至服務帳戶。
確認或輸入其他叢集設定 (請參閱「使用 Google Cloud 控制台建立 Dataproc 叢集」)。
點選「Create」(建立)。
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:指定一份以半形逗號分隔的清單,將使用者帳戶對應至服務帳戶。
使用 YAML 對應檔案:您可以透過--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
--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 會為多租戶叢集上執行的各個 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 閘道,即可讓多位使用者將自己的 Jupyter Notebook 連結至多租戶叢集。
API
使用 SecurityConfig.IdentityConfig.userServiceAccountMapping field 指定使用者帳戶與服務帳戶的對應清單。
授予身分與存取權管理權限
如要將使用者 Notebook 連線至在多租戶叢集上執行的 Notebook 核心,對應的使用者、對應的服務帳戶和叢集 VM 服務帳戶,都必須具備存取資源所需的 IAM 權限。
對應的使用者權限
每位對應使用者都必須具備 dataproc.clusters.get 和 dataproc.clusters.use 權限,才能存取及連線至在多租戶叢集上執行的 Notebook 核心。您可以授予Dataproc 編輯者角色 (roles/dataproc.editor),其中即包含這些權限 (請參閱「授予單一身分與存取權管理角色」),或建立具備這些權限的自訂角色。
對應的服務帳戶權限
每個對應的服務帳戶都必須具備對應使用者 Notebook 應用程式所需的權限,例如存取 Cloud Storage bucket 或 BigQuery 資料表的權限 (請參閱「管理服務帳戶的存取權」)。
VM 服務帳戶權限
針對每個對應的服務帳戶,多租戶叢集的 VM 服務帳戶都必須具備 iam.serviceAccounts.getAccessToken 權限。您可以授予服務帳戶權杖建立者角色 (roles/iam.serviceAccountTokenCreator),其中即包含這項權限 (請參閱「管理服務帳戶的存取權」),或建立具有此權限的自訂角色。如要瞭解其他 VM 服務帳戶角色,請參閱「Dataproc VM 服務帳戶」。
將 Jupyter Notebook 連線至多租戶叢集核心
對應的多租戶叢集使用者可將 Vertex AI Workbench 或使用者自行管理的 Jupyter Notebook 連線至多租戶叢集所安裝的核心。
Vertex AI Notebook
如要建立 Jupyter Notebook 並連線至多租戶叢集,請執行下列操作:
- 建立 Vertex AI Workbench 執行個體。
- 在「Workbench」執行個體分頁中,按一下執行個體的「Open JupyterLab」(開啟 JupyterLab)連結。
- 在「ataproc Cluster Notebooks」(Dataproc 叢集 Notebook)下方,按一下「PySpark (YARN Cluster)」(PySpark (YARN 叢集))
MULTI_TENANCY_CLUSTER_NAME資訊卡,即可連線並啟動新的 Jupyter PySpark Notebook。
使用者自行管理的 Notebook
如要建立使用者管理的 Jupyter Notebook 並連線至 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
替換使用者
您可以使用更新指令搭配 --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