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 卷。