本文档介绍了如何在 Google Kubernetes Engine (GKE) 集群上使用 H4D 机器系列和远程直接内存访问 (RDMA) 来运行高性能计算 (HPC) 工作负载。
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 虚拟机的容量。建议为 H4D 虚拟机分配密集资源。H4D 的某些预配模型支持密集资源分配,并可为您的 H4D 容量提供增强型集群管理功能。如需获取容量,请执行以下操作:
确保您符合以下 GKE 版本要求:
仅使用提供 H4D 机器类型的位置。如需了解详情,请参阅可用区域和可用区中的表格,并过滤出
H4D。仅使用 Container-Optimized OS 节点映像。
查看 H4D 限制。
查看如何处理主机维护,因为 H4D 机器类型不支持实时迁移。如需了解详情,请参阅 H4D 实例的维护体验和管理不进行实时迁移的 GKE 节点的中断。
配置 GKE 集群和网络
您可以使用 Cluster Toolkit 快速创建可用于生产环境的 GKE 集群,该集群使用与预留绑定的 H4D 虚拟机。本部分中的 Cluster Toolkit 说明使用 GKE H4D 蓝图。
或者,您也可以使用 Google Cloud CLI,以便非常灵活地配置集群环境,并使用与预留绑定的虚拟机或 Flex-start 虚拟机。
Cluster Toolkit
设置 Cluster Toolkit。我们建议使用 Cloud Shell 来执行此操作,因为 Cluster Toolkit 的依赖项已预先安装。
获取安装了集群工具包的主机机器的 IP 地址:
curl ifconfig.me保存此 IP 地址,以便在后续步骤中用于
IP_ADDRESS变量。创建一个 Cloud Storage 存储桶来存储 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 和子网:为集群配置默认虚拟私有云 (VPC) 和子网。为 IRDMA 网络接口卡 (NIC) 创建专用 VPC 和子网。按照以下说明创建的 VPC 会根据需要使用 Falcon VPC 网络配置文件。
为使用 RDMA over Falcon 传输协议的 IRDMA 网络接口创建 VPC:
gcloud compute --project=PROJECT_ID \ networks create RDMA_NETWORK_PREFIX-net \ --network-profile=COMPUTE_ZONE-vpc-falcon \ --subnet-mode=custom为 Falcon VPC 网络创建子网:
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 和客户端 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 工作负载。