你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

将 Azure HPC 缓存与 Azure Kubernetes 服务集成 (AKS)

Azure HPC 缓存可为高性能计算 (HPC) 任务加快对数据的访问。 通过在 Azure 中缓存文件,Azure HPC 缓存将云计算的可伸缩性带到现有工作流中。 本文介绍如何将 Azure HPC 缓存与 Azure Kubernetes 服务 (AKS) 集成。

开始之前

  • AKS 群集必须位于支持 Azure HPC 缓存的区域中。

  • 需要 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 缓存访问策略

安装 Azure CLI hpc-cache 扩展

重要

AKS 预览功能是可选择启用的自助功能。 预览功能是“按现状”和“按可用”提供的,不包括在服务级别协议和有限保证中。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:

若要安装 hpc-cache 扩展,请运行以下命令:

az extension add --name hpc-cache

运行以下命令以更新到已发布的最新扩展版本:

az extension update --name hpc-cache

注册 StorageCache 功能标志

使用命令 az provider register 注册 Microsoft.StorageCache 资源提供程序。

az provider register --namespace Microsoft.StorageCache --wait

状态显示为“已注册”需要几分钟时间。 使用 az feature show 命令验证注册状态:

az feature show --namespace "Microsoft.StorageCache"

创建 Azure HPC 缓存

  1. 使用包含查询参数 --query nodeResourceGroup 的命令 az aks show 获取节点资源群。

    az aks show --resource-group myResourceGroup --name myAKSCluster --query nodeResourceGroup -o tsv
    

    输出应类似于以下示例输出:

    MC_myResourceGroup_myAKSCluster_eastus
    
  2. 使用命令 az network vnet subnet create 创建专用 HPC 缓存子网。 首先定义 RESOURCE_GROUPVNET_NAMEVNET_IDSUBNET_NAME 的环境变量。 为 RESOURCE_GROUP 复制上一步中的输出,并为 SUBNET_NAME 指定值。

    RESOURCE_GROUP=MC_myResourceGroup_myAKSCluster_eastus
    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
    
  3. 在同一节点资源组和区域中创建 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 eastus \
      --subnet $SUBNET_ID \
      --sku-name "Standard_2G" \
      --name MyHpcCache
    

    注意

    创建 HPC 缓存最多可能需要 20 分钟。

创建和配置 Azure 存储

  1. 使用命令 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 eastus \
      --sku Standard_LRS
    
  2. 使用命令 az role assignment create 在订阅上分配“存储 Blob 数据参与者角色”。 首先,定义环境变量 STORAGE_ACCOUNT_IDAD_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
    
  3. 使用命令 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
    
  4. 使用 az role assignment 命令向 Azure HPC 缓存服务帐户提供访问存储帐户和 Blob 容器的权限。 首先,定义环境变量 HPC_CACHE_USERHPC_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
    
  5. 使用 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"
    

设置客户端负载均衡

  1. 使用 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
    
  2. 使用 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
    
  3. 使用 az network private-dns record-set a create 命令为面向客户端的 IP 地址创建轮循机制 DNS 名称。 首先,定义环境变量 DNS_NAMEHPC_MOUNTS0HPC_MOUNTS1HPC_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
    

创建永久性卷

  1. 创建名为 pv-nfs.yaml 的文件来定义永久性卷,然后粘贴以下清单。 替换属性 serverpath 的值。

    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pv-nfs
    spec:
      capacity:
        storage: 10000Gi
      accessModes:
        - ReadWriteMany
      mountOptions:
        - vers=3
      nfs:
        server: server.myhpccache.local
        path: /
    
  2. 使用 az aks get-credentials 命令获取 AKS 群集的凭据。

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    
  3. 使用 kubectl apply 命令创建永久性卷。

    kubectl apply -f pv-nfs.yaml
    
  4. 使用 kubectl describe 命令验证永久性卷的状态是否为“Available”。

    kubectl describe pv pv-nfs
    

创建永久性卷声明

  1. 创建名为 pvc-nfs.yaml 的文件来定义永久性卷声明,然后粘贴以下清单。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-nfs
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: ""
      resources:
        requests:
          storage: 100Gi
    
  2. 使用 kubectl apply 命令创建永久性卷声明。

    kubectl apply -f pvc-nfs.yaml
    
  3. 使用 kubectl describe 命令验证永久性卷声明的“状态”是否为“Bound”。

    kubectl describe pvc pvc-nfs
    

使用 Pod 装载 HPC 缓存

  1. 创建名为 nginx-nfs.yaml 的文件,用于定义使用永久性卷声明的 Pod,然后粘贴以下清单。

    kind: Pod
    apiVersion: v1
    metadata:
      name: nginx-nfs
    spec:
      containers:
     - image: mcr.microsoft.com/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
    
  2. 使用 kubectl apply 命令创建 Pod。

    kubectl apply -f nginx-nfs.yaml
    
  3. 使用 kubectl describe 命令验证 Pod 是否正在运行。

    kubectl describe pod nginx-nfs
    
  4. 使用 kubectl exec 命令连接到 Pod 以验证卷是否已装载到 Pod 中。

    kubectl exec -it nginx-nfs -- sh
    

    若要检查卷是否已装载,请使用 --human-readable(简写为 -h)选项以易于阅读的格式运行 df

    df -h
    

    以下示例类似于该命令返回的输出:

    Filesystem             Size  Used Avail Use% Mounted on
    ...
    server.myhpccache.local:/myfilepath 8.0E         0      8.0E   0% /mnt/azure/myfilepath
    ...
    

后续步骤