Azure HPC 缓存可为高性能计算 (HPC) 任务加快对数据的访问。 通过在 Azure 中缓存文件,Azure HPC 缓存将云计算的可伸缩性带到现有工作流中。 本文介绍如何将 Azure HPC 缓存与 Azure Kubernetes 服务 (AKS) 集成。
在您开始之前
- 需要 Azure CLI 2.7 或更高版本。 运行 - az --version即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI。
- 在 Azure 订阅中注册 - hpc-cache扩展。 有关将 HPC 缓存 与 Azure CLI 配合使用的详细信息,请参阅 HPC 缓存 CLI 先决条件。
- 查看 HPC 缓存先决条件。 需要满足以下条件,然后才能运行 HPC 缓存: - 缓存需要一个至少有 64 个可用 IP 地址的专用子网。
- 此子网不得托管其他 VM 或容器。
- 必须可通过 AKS 节点访问子网。
 
- 如果需要以没有根访问权限的用户身份运行应用程序,则可能需要使用更改所有者 (chown) 命令将目录所有权更改为其他用户,从而禁用根压缩。 没有根访问权限的用户需要拥有某个目录才能访问文件系统。 要让用户拥有某个目录,root 用户必须通过 chown 将该目录的所有者修改为该用户。但是,如果 HPC 缓存已启用 root squash,则此操作将被拒绝,因为 root 用户 (UID 0) 正在映射到匿名用户。 有关根压缩和客户端访问策略的详细信息,请参阅 HPC 缓存访问策略。 
安装 hpc-cache Azure CLI 扩展
重要
AKS 预览功能可在自助服务和自愿选择的基础上启用。 预览版按“现状”和“视供应情况”提供,它们不包括在服务级别协议和有限保证范围内。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:
若要安装 hpc-cache 扩展,请运行以下命令:
az extension add --name hpc-cache
运行以下命令以更新到已发布的最新扩展版本:
az extension update --name hpc-cache
注册 StorageCache 功能标志
使用命令  注册 az provider register 资源提供程序。
az provider register --namespace Microsoft.StorageCache --wait
几分钟后,状态将显示为“已注册”。 使用 az feature show 命令验证注册状态:
az feature show --namespace "Microsoft.StorageCache"
创建 Azure HPC 缓存
- 使用包含查询参数 - az aks show的命令- --query nodeResourceGroup获取节点资源群。- az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv- 输出应类似于以下示例输出: - MC_myResourceGroup_myAKSCluster_chinanorth3
- 使用命令 - az network vnet subnet create创建专用 HPC 缓存子网。 首先定义- RESOURCE_GROUP、- VNET_NAME、- VNET_ID和- SUBNET_NAME的环境变量。 为- RESOURCE_GROUP复制上一步中的输出,并为- SUBNET_NAME指定值。- RESOURCE_GROUP=MC_myResourceGroup_myAKSCluster_chinanorth3 VNET_NAME=$(az network vnet list --resource-group $RESOURCE_GROUP --query [].name -o tsv) VNET_ID=$(az network vnet show --resource-group $RESOURCE_GROUP --name $VNET_NAME --query "id" -o tsv) SUBNET_NAME=MyHpcCacheSubnet- az network vnet subnet create \ --resource-group $RESOURCE_GROUP \ --vnet-name $VNET_NAME \ --name $SUBNET_NAME \ --address-prefixes 10.0.0.0/26
- 在同一节点资源组和区域中创建 HPC 缓存。 首先定义环境变量 - SUBNET_ID。- SUBNET_ID=$(az network vnet subnet show --resource-group $RESOURCE_GROUP --vnet-name $VNET_NAME --name $SUBNET_NAME --query "id" -o tsv)- 使用 - az hpc-cache create命令创建 HPC 缓存。 以下示例在美国东部区域创建了一个名为“MyHpcCache”的标准 2G 缓存类型的 HPC 缓存。 指定 --location、--sku-name 和 --name 的值。- az hpc-cache create \ --resource-group $RESOURCE_GROUP \ --cache-size-gb "3072" \ --location chinanorth3 \ --subnet $SUBNET_ID \ --sku-name "Standard_2G" \ --name MyHpcCache- 注释 - 创建 HPC 缓存最多可能需要 20 分钟。 
创建和配置 Azure 存储
- 使用命令 - az storage account create创建存储帐户。 首先定义环境变量- STORAGE_ACCOUNT_NAME。- 重要 - 需要选择唯一的存储帐户名称。 将 - uniquestorageaccount替换为指定的名称。 存储帐户名称长度必须为 3 到 24 个字符,且只能包含数字和小写字母。- STORAGE_ACCOUNT_NAME=uniquestorageaccount- 以下示例在美国东部区域创建了一个使用 Standard_LRS SKU 的存储帐户。 指定 --location 和 --sku 的值。 - az storage account create \ --name $STORAGE_ACCOUNT_NAME \ --resource-group $RESOURCE_GROUP \ --location chinanorth3 \ --sku Standard_LRS
- 使用命令 在订阅上分配“存储 Blob 数据参与者角色” - az role assignment create。 首先,定义环境变量- STORAGE_ACCOUNT_ID和- AD_USER。- STORAGE_ACCOUNT_ID=$(az storage account show --name $STORAGE_ACCOUNT_NAME --query "id" -o tsv) AD_USER=$(az ad signed-in-user show --query objectId -o tsv)- az role assignment create --role "Storage Blob Data Contributor" --assignee $AD_USER --scope $STORAGE_ACCOUNT_ID
- 使用命令 - az storage container create在存储帐户中创建 Blob 容器。 首先,定义环境变量- CONTAINER_NAME并替换 Blob 容器的名称。- CONTAINER_NAME=mystoragecontainer- az storage container create --name $CONTAINER_NAME --account-name $STORAGE_ACCOUNT_NAME --auth-mode login
- 使用 - az role assignment命令向 Azure HPC 缓存服务帐户提供访问存储帐户和 Blob 容器的权限。 首先,定义环境变量- HPC_CACHE_USER和- HPC_CACHE_ID。- HPC_CACHE_USER="StorageCache Resource Provider" HPC_CACHE_ID=$(az ad sp list --display-name "${HPC_CACHE_USER}" --query "[].objectId" -o tsv)- az role assignment create --role "Storage Account Contributor" --assignee $HPC_CACHE_ID --scope $STORAGE_ACCOUNT_ID az role assignment create --role "Storage Blob Data Contributor" --assignee $HPC_CACHE_ID --scope $STORAGE_ACCOUNT_ID
- 使用 - az hpc-cache blob-storage-target add命令将 Blob 容器作为存储目标添加到 HPC 缓存。 以下示例为 HPC 缓存 MyHpcCache 创建了一个名为 MyStorageTarget 的 Blob 容器。 指定 --name、--cache-name 和 --virtual-namespace-path 的值。- az hpc-cache blob-storage-target add \ --resource-group $RESOURCE_GROUP \ --cache-name MyHpcCache \ --name MyStorageTarget \ --storage-account $STORAGE_ACCOUNT_ID \ --container-name $CONTAINER_NAME \ --virtual-namespace-path "/myfilepath"
设置客户端负载均衡
- 使用 - az network private-dns zone create命令为面向客户端的 IP 地址创建 Azure 专用 DNS 区域。 首先,定义环境变量- PRIVATE_DNS_ZONE并指定区域的名称。- PRIVATE_DNS_ZONE="myhpccache.local"- az network private-dns zone create \ --resource-group $RESOURCE_GROUP \ --name $PRIVATE_DNS_ZONE
- 使用 - az network private-dns link vnet create命令在 Azure 专用 DNS 区域和 VNet 之间创建 DNS 链接。 替换 --name 的值。- az network private-dns link vnet create \ --resource-group $RESOURCE_GROUP \ --name MyDNSLink \ --zone-name $PRIVATE_DNS_ZONE \ --virtual-network $VNET_NAME \ --registration-enabled true
- 使用 - az network private-dns record-set a create命令为面向客户端的 IP 地址创建轮循机制 DNS 名称。 首先,定义环境变量- DNS_NAME、- HPC_MOUNTS0、- HPC_MOUNTS1和- HPC_MOUNTS2。 替换- DNS_NAME属性的值。- DNS_NAME="server" HPC_MOUNTS0=$(az hpc-cache show --name "MyHpcCache" --resource-group $RESOURCE_GROUP --query "mountAddresses[0]" -o tsv | tr --delete '\r') HPC_MOUNTS1=$(az hpc-cache show --name "MyHpcCache" --resource-group $RESOURCE_GROUP --query "mountAddresses[1]" -o tsv | tr --delete '\r') HPC_MOUNTS2=$(az hpc-cache show --name "MyHpcCache" --resource-group $RESOURCE_GROUP --query "mountAddresses[2]" -o tsv | tr --delete '\r')- az network private-dns record-set a add-record -g $RESOURCE_GROUP -z $PRIVATE_DNS_ZONE -n $DNS_NAME -a $HPC_MOUNTS0 az network private-dns record-set a add-record -g $RESOURCE_GROUP -z $PRIVATE_DNS_ZONE -n $DNS_NAME -a $HPC_MOUNTS1 az network private-dns record-set a add-record -g $RESOURCE_GROUP -z $PRIVATE_DNS_ZONE -n $DNS_NAME -a $HPC_MOUNTS2
创建永久性卷
- 创建名为 - pv-nfs.yaml的文件来定义永久性卷,然后粘贴以下清单。 替换属性- server和- path的值。- --- apiVersion: v1 kind: PersistentVolume metadata: name: pv-nfs spec: capacity: storage: 10000Gi accessModes: - ReadWriteMany mountOptions: - vers=3 nfs: server: server.myhpccache.local path: /
- 使用 - az aks get-credentials命令获取 AKS 群集的凭据。- az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
- 使用 - kubectl apply命令创建永久性卷。- kubectl apply -f pv-nfs.yaml
- 使用 命令验证永久性卷的状态是否为“ - kubectl describe”。- kubectl describe pv pv-nfs
创建永久性卷声明
- 创建名为 - pvc-nfs.yaml的文件来定义永久性卷声明,然后粘贴以下清单。- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-nfs spec: accessModes: - ReadWriteMany storageClassName: "" resources: requests: storage: 100Gi
- 使用 - kubectl apply命令创建永久性卷声明。- kubectl apply -f pvc-nfs.yaml
- 使用 命令验证永久性卷声明的“状态”是否为“ - kubectl describe”。- kubectl describe pvc pvc-nfs
使用 Pod 装载 HPC 缓存
- 创建名为 - nginx-nfs.yaml的文件,用于定义使用永久性卷声明的 Pod,然后粘贴以下清单。- kind: Pod apiVersion: v1 metadata: name: nginx-nfs spec: containers: - image: mcr.azk8s.cn/oss/nginx/nginx:1.15.5-alpine name: nginx-nfs command: - "/bin/sh" - "-c" - while true; do echo $(date) >> /mnt/azure/myfilepath/outfile; sleep 1; done volumeMounts: - name: disk01 mountPath: /mnt/azure volumes: - name: disk01 persistentVolumeClaim: claimName: pvc-nfs
- 使用 - kubectl apply命令创建 pod。- kubectl apply -f nginx-nfs.yaml
- 使用 - kubectl describe命令验证 Pod 是否正在运行。- kubectl describe pod nginx-nfs
- 使用 - kubectl exec命令连接到 Pod 以验证卷是否已装载到 Pod 中。- kubectl exec -it nginx-nfs -- sh- 若要检查卷是否已装载,请使用 - df(简写为- --human-readable)选项以易于阅读的格式运行- -h。- df -h- 以下示例类似于该命令返回的输出: - Filesystem Size Used Avail Use% Mounted on ... server.myhpccache.local:/myfilepath 8.0E 0 8.0E 0% /mnt/azure/myfilepath ...
后续步骤
- 有关 Azure HPC 缓存的详细信息,请参阅 HPC 缓存概述。
- 有关在 AKS 中使用 NFS 的详细信息,请参阅在 AKS 中手动创建并使用网络文件系统 (NFS) Linux Server 卷。