本文說明如何在 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,彈性設定叢集環境。
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 bucket 的名稱。PROJECT_ID:您的 Google Cloud 專案 ID。COMPUTE_REGION_TERRAFORM_STATE:要儲存 Terraform 部署作業狀態的運算區域。
在
examples/gke-h4d/gke-h4d-deployment.yaml藍圖中 (位於 GitHub 存放區),填入terraform_backend_defaults和vars區段中的下列設定,以符合部署作業的特定值:DEPLOYMENT_NAME:部署作業的專屬名稱,長度必須介於 6 到 30 個字元之間。如果部署作業名稱在專案內重複,叢集建立作業就會失敗。預設值為gke-h4d。BUCKET_NAME:您在上一個步驟中建立的 Cloud Storage bucket 名稱。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 和子網路。按照下列操作說明建立的虛擬私有雲會視需要使用 Falcon 虛擬私有雲網路設定檔。
為 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 網路參數集設定虛擬私有雲網路。套用
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 虛擬私有雲網路的節點集區。您可以使用受預訂項目限制的 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
後續步驟
- 進一步瞭解高效能運算。
- 瞭解在 GKE 上執行 HPC 工作負載的最佳做法。
- 部分 HPC 工作負載需要訊息傳遞介面 (MPI),才能使用 RDMA 執行緊密耦合的多節點工作負載。如要進一步瞭解如何在叢集中為 H4D 節點設定 MPI,請參閱「在 GKE H4D 上執行 MPI 工作負載」。