本文說明如何在 Google Kubernetes Engine (GKE) 叢集上執行高效能運算 (HPC) 工作負載,這些叢集使用 H4D 系列機器和遠端直接記憶體存取 (RDMA)。
H4D 是 Compute Engine 運算最佳化機器系列中的機器系列,這個機器系列經過最佳化,可提供高效能、低成本和擴充性。H4D 適用於跨多個節點擴充的應用程式。設定為使用 RDMA 的 H4D 執行個體,節點間的網路頻寬最高可達 200 Gbps。
事前準備
開始之前,請確認您已完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文中的指令。
選擇用量方案後,即可取得 H4D VM 的容量。建議為 H4D VM 分配密集資源。部分 H4D 佈建模型提供密集資源分配功能,可為 H4D 容量提供強化叢集管理功能。如要取得容量,請按照下列步驟操作:
- 請參閱「VM 和叢集建立的佈建模型」。
- 選擇用量選項並取得容量。
請確認您遵守下列 GKE 版本規定:
請僅使用提供 H4D 機器類型的地點。詳情請參閱「可用地區和區域」一文中的表格,並篩選
H4D。僅使用 Container-Optimized OS 節點映像檔。
請參閱 H4D 限制。
請瞭解如何處理主機維護作業,因為 H4D 機型不支援即時遷移。詳情請參閱「H4D 執行個體的維護體驗」和「管理無法即時遷移的 GKE 節點中斷情形」。
設定 GKE 叢集和網路
您可以使用 Cluster Toolkit 快速建立可供正式環境使用的 GKE 叢集,這類叢集會使用與預訂項目綁定的 H4D VM。本節中的 Cluster Toolkit 指令使用 GKE H4D 藍圖。
或者,您也可以使用 Google Cloud CLI,彈性地設定叢集環境,並搭配使用與預訂項目綁定的 VM 或彈性啟動 VM。
Cluster Toolkit
設定 Cluster Toolkit。建議您使用 Cloud Shell 執行這項操作,因為 Cluster Toolkit 已預先安裝依附元件。
取得安裝 Cluster Toolkit 的主機 IP 位址:
curl ifconfig.me請儲存這個 IP 位址,供後續步驟中的
IP_ADDRESS變數使用。建立 Cloud Storage bucket,儲存 Terraform 部署作業的狀態:
gcloud storage buckets create gs://BUCKET_NAME \ --default-storage-class=STANDARD \ --project=PROJECT_ID \ --location=COMPUTE_REGION_TERRAFORM_STATE \ --uniform-bucket-level-access gcloud storage buckets update gs://BUCKET_NAME --versioning請替換下列變數:
BUCKET_NAME:新 Cloud Storage 值區的名稱。PROJECT_ID:您的 Google Cloud 專案 ID。COMPUTE_REGION_TERRAFORM_STATE:要儲存 Terraform 部署作業狀態的運算區域。
在 GitHub 存放區的
examples/gke-h4d/gke-h4d-deployment.yaml藍圖中,填入terraform_backend_defaults和vars區段中的下列設定,以符合部署作業的特定值:DEPLOYMENT_NAME:部署作業的專屬名稱,長度必須介於 6 至 30 個字元之間。如果部署作業名稱在專案中重複,叢集建立作業就會失敗。預設值為gke-h4d。BUCKET_NAME:在上一個步驟中建立的 Cloud Storage 值區名稱。PROJECT_ID:您的 Google Cloud 專案 ID。COMPUTE_REGION:叢集的運算區域,必須與可預留機器的區域相符。COMPUTE_ZONE:H4D 機器節點集區的運算可用區。請注意,這個區域應與預訂中可用的機器區域相符。NODE_COUNT:叢集中的 H4D 節點數量。IP_ADDRESS/SUFFIX:允許連線至叢集的 IP 位址範圍。這個 CIDR 區塊必須包含您要用來呼叫 Terraform 的機器的 IP 位址。詳情請參閱「授權網路的運作方式」。視您是否要在佈建節點集區時,指定預留項目中的特定區塊,請在
reservation欄位中填入下列其中一個值:- 如要在預留項目中的任何位置放置節點集區,請提供預留項目的名稱 (
RESERVATION_NAME)。 如要指定預訂中的特定區塊,請使用下列格式的預訂和區塊名稱:
RESERVATION_NAME/reservationBlocks/BLOCK_NAME如要查看預訂中可用的區塊,請參閱「查看預訂拓撲」。
- 如要在預留項目中的任何位置放置節點集區,請提供預留項目的名稱 (
產生應用程式預設憑證 (ADC),授予 Terraform 存取權。如果您使用 Cloud Shell,可以執行下列指令:
gcloud auth application-default login部署藍圖,使用 H4D 機器類型佈建 GKE 基礎架構:
./gcluster deploy -d examples/gke-h4d/gke-h4d-deployment.yaml examples/gke-h4d/gke-h4d.yaml系統提示時,選取「(A)pply」(套用) 部署藍圖。
此外,這份藍圖會佈建 Filestore 執行個體,並透過永久磁碟區 (PV) 將其連線至 GKE 叢集。這份藍圖包含工作範本範例。這個範本會執行平行作業,讀取及寫入這個共用儲存空間的資料。部署輸出內容中會顯示
kubectl create,可用於觸發範例工作。
Google Cloud CLI
請將本節指令中的下列值替換掉:
PROJECT_ID:您的 Google Cloud 專案 ID。CLUSTER_NAME:叢集名稱。CONTROL_PLANE_LOCATION:叢集控制層的 Compute Engine 位置。提供地區叢集的區域,或區域叢集的可用區。建議您將區域叢集用於正式環境工作負載。如果是地區叢集,地區必須包含 H4D 可用的區域。如果是可用區叢集,可用區必須提供 H4D。如果您使用預留項目,區域和可用區必須與預留項目的區域和可用區相符。COMPUTE_ZONE:節點集區的可用區。這必須是 H4D 適用的區域。 如果您使用預留項目,區域和可用區必須與預留項目的區域和可用區相符。如要讓 H4D 節點與 Cloud RDMA 搭配運作,就無法建立多區域節點集區。RDMA_NETWORK_PREFIX:RDMA 網路前置字元 (例如h4d-rdma)。RDMA_SUBNET_CIDR:RDMA 子網路 CIDR 範圍。請確認這個範圍不會與叢集的預設網路重疊。NODE_POOL_NAME: H4D 節點集區的名稱。NODE_COUNT:要在節點集區中建立的 H4D 節點數量。H4D_MACHINE_TYPE:要使用的 H4D 機器類型 (例如h4d-highmem-192-lssd)。
請按照下列步驟,使用 gcloud CLI 建立叢集:
建立虛擬私有雲和子網路:設定叢集的預設虛擬私有雲 (VPC) 和子網路。如果是 IRDMA 網路介面卡 (NIC),請建立專屬的 VPC 和子網路。按照下列操作說明建立的 VPC 會視需要使用 Falcon VPC 網路設定檔。
為 IRDMA 網路介面建立 VPC,該介面使用 RDMA over Falcon 傳輸通訊協定:
gcloud compute --project=PROJECT_ID \ networks create RDMA_NETWORK_PREFIX-net \ --network-profile=COMPUTE_ZONE-vpc-falcon \ --subnet-mode=custom為 Falcon 虛擬私有雲網路建立子網路:
gcloud compute --project=PROJECT_ID \ networks subnets create \ RDMA_NETWORK_PREFIX-sub-0 \ --network=RDMA_NETWORK_PREFIX-net \ --region=CONTROL_PLANE_LOCATION \ --range=RDMA_SUBNET_CIDR
建立具備多重網路功能的 GKE 叢集:建立叢集。您也可以使用這項指令,明確提供服務和 Pod 的次要 CIDR 範圍。
執行下列指令:
gcloud container clusters create CLUSTER_NAME --project PROJECT_ID \ --enable-dataplane-v2 --enable-ip-alias --location=CONTROL_PLANE_LOCATION \ --enable-multi-networking \ [--services-ipv4-cidr=SERVICE_CIDR \ --cluster-ipv4-cidr=POD_CIDR]如果您使用這些選用旗標,請替換下列額外值:
SERVICE_CIDR:服務的次要 CIDR 範圍。POD_CIDR:Pod 的次要 CIDR 範圍。
使用這些標記時,請確認 CIDR 範圍不會與其他節點網路的子網路範圍重疊。例如
SERVICE_CIDR=10.65.0.0/19和POD_CIDR=10.64.0.0/19。建立 GKE 網路物件:使用 GKE 網路參數集設定 VPC 網路。套用
GKENetworkParamSet和Network物件:kubectl apply -f - <<EOF apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: rdma-0 spec: vpc: RDMA_NETWORK_PREFIX-net vpcSubnet: RDMA_NETWORK_PREFIX-sub-0 deviceMode: RDMA --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: rdma-0 spec: type: "Device" parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: rdma-0 EOF建立 H4D 節點集區:建立使用 H4D 並連線至 Falcon VPC 網路的節點集區。您可以使用受預訂項目限制的 H4D 節點和緊湊放置。或者,您也可以使用以彈性啟動佈建的 H4D 節點。選取與用量選項對應的分頁:
取決於預留項目
為密集配置建立資源政策。緊密放置群組可確保節點在區域內彼此相對位置的實體位置,進而為跨多個節點執行的緊密結合 HPC 工作負載,提供最佳效能。
執行下列指令:
gcloud compute resource-policies create group-placement POLICY_NAME \ --region REGION --collocation collocated替換下列值:
POLICY_NAME:資源政策的名稱 (例如h4d-compact)。REGION:叢集所在的區域。
建立使用 H4D 並連線至 RDMA 網路的節點集區:
gcloud container node-pools create NODE_POOL_NAME --project PROJECT_ID \ --location=CONTROL_PLANE_LOCATION --cluster CLUSTER_NAME --num-nodes=NODE_COUNT \ --node-locations=COMPUTE_ZONE \ --machine-type H4D_MACHINE_TYPE \ --additional-node-network network=RDMA_NETWORK_PREFIX-net,subnetwork=RDMA_NETWORK_PREFIX-sub-0 \ --placement-policy POLICY_NAME \ --max-surge-upgrade 0 \ --max-unavailable-upgrade MAX_UNAVAILABLE將
MAX_UNAVAILABLE替換為節點集區升級期間,可同時無法使用的節點數量上限。如果是緊湊型放置位置,建議快速升級,不要出現尖峰流量,盡可能在升級期間找到共置節點。
彈性啟動
建立節點集區,使用以彈性啟動佈建的 H4D 節點,並連線至 Falcon VPC 網路:
gcloud container node-pools create NODE_POOL_NAME --project PROJECT_ID \ --location=CONTROL_PLANE_LOCATION --cluster CLUSTER_NAME \ --node-locations=COMPUTE_ZONE \ --machine-type H4D_MACHINE_TYPE \ --additional-node-network network=RDMA_NETWORK_PREFIX-net,subnetwork=RDMA_NETWORK_PREFIX-sub-0 \ --flex-start --enable-autoscaling --reservation-affinity=none \ --min-nodes=0 --max-nodes=MAX_NODES --num-nodes=0將
MAX_NODES替換為每個區域中,指定節點集區可自動調度的節點數量上限。
準備 Docker 映像檔
使用下列範例 Dockerfile 準備映像檔:
FROM docker.io/rockylinux/rockylinux:8.10
RUN dnf -y install https://depot.ciq.com/public/download/ciq-sigcloud-next-8/ciq-sigcloud-next-8.x86_64/Packages/c/ciq-sigcloud-next-release-6-1.el8_10.cld_next.noarch.rpm
&& dnf -y update ciq-sigcloud-next-release
&& dnf clean all
RUN dnf install rdma-core libibverbs-utils librdmacm-utils infiniband-diags perftest -y
如要進一步瞭解哪些映像檔支援 IRDMA,請參閱「作業系統」中的表格,並點選「介面」分頁標籤。
設定 RDMA 的資訊清單
在 Pod 中繼資料中新增下列註解,即可啟用 Cloud RDMA:
metadata:
annotations:
networking.gke.io/default-interface: 'eth0'
networking.gke.io/interfaces: |
[
{"interfaceName":"eth0","network":"default"},
{"interfaceName":"eth1","network":"rdma-0"},
]
使用 rping 測試 RDMA
在伺服器和用戶端 Pod 之間執行 rping,驗證 Cloud RDMA 功能:
在伺服器 Pod 上執行
rping指令:rping -s在用戶端 Pod 上執行
rping指令:rping -c -C 2 -d -a SERVER_IP將
SERVER_IP替換為伺服器 Pod 的 IP 位址。如果成功,輸出內容會類似以下內容:
created cm_id 0x5b597bf94800 cma_event type RDMA_CM_EVENT_ADDR_RESOLVED cma_id 0x5b597bf94800 (parent) cma_event type RDMA_CM_EVENT_ROUTE_RESOLVED cma_id 0x5b597bf94800 (parent) rdma_resolve_addr - rdma_resolve_route successful created pd 0x5b597bf94fa0 created channel 0x5b597bf96830 created cq 0x5b597bf94ff0 created qp 0x5b597bf96c00 rping_setup_buffers called on cb 0x5b597bf8c820 allocated & registered buffers... cq_thread started. cma_event type RDMA_CM_EVENT_ESTABLISHED cma_id 0x5b597bf94800 (parent) ESTABLISHED rdma_connect successful RDMA addr 5b597bf8cd80 rkey dadac8c4 len 64 send completion recv completion RDMA addr 5b597bf8cff0 rkey 86ef015f len 64 send completion recv completion RDMA addr 5b597bf8cd80 rkey dadac8c4 len 64 send completion recv completion RDMA addr 5b597bf8cff0 rkey 86ef015f len 64 send completion recv completion rping_free_buffers called on cb 0x5b597bf8c820 destroy cm_id 0x5b597bf94800
後續步驟
- 進一步瞭解高效能運算。
- 部分 HPC 工作負載需要訊息傳遞介面 (MPI),才能透過 RDMA 執行緊密耦合的多節點工作負載。如要進一步瞭解如何在叢集中為 H4D 節點設定 MPI,請參閱「在 GKE H4D 上執行 MPI 工作負載」。