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

将 Azure 容器存储与 Azure 托管磁盘配合使用

Azure 容器存储是一项基于云的卷管理、部署和业务流程服务,专为容器原生构建。 本文介绍如何将 Azure 容器存储配置为使用 Azure 托管磁盘作为 Kubernetes 工作负载的后端存储。 最后,你将有一个使用 Azure 托管磁盘作为其存储的 Pod。

先决条件

  • 如果没有 Azure 订阅,请在开始之前创建一个免费帐户

  • 本文需要 Azure CLI 的最新版本(2.35.0 或更高版本)。 请参阅如何安装 Azure CLI。 如果你在 Azure Cloud Shell 中使用 Bash 环境,则表示已安装最新版本。 如果你打算在本地(而不是 Azure Cloud Shell 中)运行命令,请务必使用管理员权限运行命令。 有关详细信息,请参阅开始使用 Azure Cloud Shell

  • 你将需要 Kubernetes 命令行客户端 kubectl。 如果你使用的是 Azure Cloud Shell,则它已安装,或者可以通过运行 az aks install-cli 命令在本地安装它。

  • 如果尚未安装 Azure 容器存储,请按照将 Azure 容器存储与 Azure Kubernetes 服务配合使用中的说明进行操作。

  • 检查 Azure 容器存储区域是否支持你的目标区域。

  • 要将 Azure 容器存储与 Azure 托管磁盘配合使用,AKS 群集必须具有包含至少三台常规用途 VM 的节点池,例如适用于群集节点的 standard_d4s_v5,其中每台 VM 至少具有四个虚拟 CPU (vCPU)。

创建并附加永久性卷

按照以下步骤创建并附加永久性卷。

1.创建存储池

首先,通过在 YAML 清单文件中定义存储池来创建存储池,这是 Kubernetes 群集的存储的逻辑分组。

可以使用以下选项来创建存储池:

如果使用 az aks createaz aks update 命令启用 Azure 容器存储,你可能已有存储池。 使用 kubectl get sp -n acstor 获取存储池的列表。 如果已有要使用的存储池,可以跳过此步骤,然后转到显示可用的存储类

创建动态存储池

按照以下步骤为 Azure 磁盘创建动态存储池。

  1. 使用最喜爱的文本编辑器创建 YAML 清单文件,例如 code acstor-storagepool.yaml

  2. 粘贴到以下代码中。 存储池名称值可以是所需的任何内容。 对于 skuName,指定性能和冗余级别。 可接受的值为 Premium_LRS、Standard_LRS、StandardSSD_LRS、UltraSSD_LRS、Premium_ZRS、PremiumV2_LRS 和 StandardSSD_ZRS。 对于“存储”,请以 Gi 或 Ti 为单位指定池的存储容量。

    apiVersion: containerstorage.azure.com/v1
    kind: StoragePool
    metadata:
      name: azuredisk
      namespace: acstor
    spec:
      poolType:
        azureDisk:
          skuName: Premium_LRS
      resources:
        requests:
          storage: 1Ti
    

    如果使用 UltraSSD_LRS 或 PremiumV2_LRS 磁盘,则可以使用存储池定义中的 IOPSReadWriteMBpsReadWrite 参数设置 IOPS 和吞吐量。

    IOPSReadWrite 是指超级 SSD 和高级 v2 LRS 磁盘允许的 IOPS 数。 有关详细信息,请参阅超级磁盘 IOPS高级 SSD v2 IOPS

    MBpsReadWrite 是指超级 SSD 和高级 v2 LRS 磁盘允许的带宽。 Mbps 是指每秒数百万字节(MB/s = 每秒 10^6 字节)。 有关详细信息,请参阅超级磁盘吞吐量高级 SSD v2 吞吐量

    apiVersion: containerstorage.azure.com/v1
    kind: StoragePool
    metadata:
      name: azuredisk
      namespace: acstor
    spec:
      poolType:
        azureDisk:
          skuName: PremiumV2_LRS
          iopsReadWrite: 5000
          MbpsReadWrite: 200
      resources:
        requests:
          storage: 1Ti
    
  3. 保存 YAML 清单文件,然后应用该文件以创建存储池。

    kubectl apply -f acstor-storagepool.yaml 
    

    存储池创建完成后,将会看到如下消息:

    storagepool.containerstorage.azure.com/azuredisk created
    

    还可以运行此命令来检查存储池的状态。 将 <storage-pool-name> 替换为存储池名称值。 对于此示例,该值为 azuredisk

    kubectl describe sp <storage-pool-name> -n acstor
    

创建存储池后,Azure 容器存储将使用命名约定 acstor-<storage-pool-name> 代表你创建存储类。 现可显示可用的存储类创建永久性卷声明

创建预配的存储池

如果有已预配的 Azure 托管磁盘,可以使用这些磁盘创建预配的存储池。 由于磁盘已预配,因此在创建存储池时无需指定 skuName 或存储容量。

按照以下步骤为 Azure 磁盘创建预配的存储池。

  1. 登录 Azure 门户。

  2. 对于要使用的每个磁盘,请导航到 Azure 托管磁盘并选择“设置”>“属性”。 复制“资源 ID”下的整个字符串并将其放入文本文件中。

  3. 使用最喜爱的文本编辑器创建 YAML 清单文件,例如 code acstor-storagepool.yaml

  4. 粘贴到以下代码中。 存储池名称值可以是所需的任何内容。 将 <resource-id> 替换为每个托管磁盘的资源 ID。 保存文件。

    apiVersion: containerstorage.azure.com/v1
    kind: StoragePool
    metadata:
      name: sp-preprovisioned
      namespace: acstor
    spec:
      poolType:
        azureDisk:
          disks:
            - reference <resource-id1>
            - reference <resource-id2>
    
  5. 应用 YAML 清单文件以创建存储池。

    kubectl apply -f acstor-storagepool.yaml 
    

    存储池创建完成后,将会看到如下消息:

    storagepool.containerstorage.azure.com/sp-preprovisioned created
    

    还可以运行此命令来检查存储池的状态。 将 <storage-pool-name> 替换为存储池名称值。 对于此示例,该值为 sp-preprovisioned。

    kubectl describe sp <storage-pool-name> -n acstor
    

创建存储池后,Azure 容器存储将使用命名约定 acstor-<storage-pool-name> 代表你创建存储类。 现可显示可用的存储类创建永久性卷声明

使用自己的加密密钥创建动态存储池(可选)

Azure 存储帐户中的所有数据都静态加密。 默认情况下,数据使用 Microsoft 管理的密钥进行加密。 为了更好地控制加密密钥,在创建存储池时,可以提供客户管理的密钥 (CMK) 来加密要创建的永久性卷。

若要使用自己的密钥进行服务器端加密,必须有一个带密钥的 Azure 密钥保管库。 该密钥保管库应已启用清除保护,并且必须使用 Azure RBAC 权限模型。 详细了解 Linux 上的客户管理的密钥

创建存储池时,必须定义 CMK 参数。 所需的 CMK 加密参数包括:

  • keyVersion 指定要使用的密钥的版本
  • keyName 是密钥的名称
  • keyVaultUri 是 Azure 密钥保管库的统一资源标识符,例如 https://user.vault.azure.net
  • 标识指定有权访问保管库的托管标识,例如 /subscriptions/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/resourcegroups/MC_user-acstor-westus2-rg_user-acstor-westus2_westus2/providers/Microsoft.ManagedIdentity/userAssignedIdentities/user-acstor-westus2-agentpool

按照以下步骤使用自己的加密密钥创建存储池。 从此存储池创建的所有永久性卷都将使用相同的密钥进行加密。

  1. 使用最喜爱的文本编辑器创建 YAML 清单文件,例如 code acstor-storagepool-cmk.yaml

  2. 粘贴以下代码,提供所需的参数,并保存文件。 存储池名称值可以是所需的任何内容。 对于 skuName,指定性能和冗余级别。 可接受的值为 Premium_LRS、Standard_LRS、StandardSSD_LRS、UltraSSD_LRS、Premium_ZRS、PremiumV2_LRS 和 StandardSSD_ZRS。 对于“存储”,请以 Gi 或 Ti 为单位指定池的存储容量。 请务必提供 CMK 加密参数。

    apiVersion: containerstorage.azure.com/v1
    kind: StoragePool
    metadata:
      name: azuredisk
      namespace: acstor
    spec:
      poolType:
        azureDisk:
          skuName: Premium_LRS
          encryption: {
            keyVersion: "<key-version>",
            keyName: "<key-name>",
            keyVaultUri: "<key-vault-uri>",
            identity: "<identity>"
          }
      resources:
        requests:
          storage: 1Ti
    
  3. 应用 YAML 清单文件以创建存储池。

    kubectl apply -f acstor-storagepool-cmk.yaml 
    

    存储池创建完成后,将会看到如下消息:

    storagepool.containerstorage.azure.com/azuredisk created
    

    还可以运行此命令来检查存储池的状态。 将 <storage-pool-name> 替换为存储池名称值。 对于此示例,该值为 azuredisk

    kubectl describe sp <storage-pool-name> -n acstor
    

创建存储池后,Azure 容器存储将使用命名约定 acstor-<storage-pool-name> 代表你创建存储类。

2.显示可用的存储类

当存储池可供使用时,必须选择存储类来定义在创建永久性卷声明和部署永久性卷时如何动态创建存储。

运行 kubectl get sc 以显示可用的存储类。 应会看到名为 acstor-<storage-pool-name> 的存储类。

重要

请勿使用标记为内部的存储类。 它是 Azure 容器存储正常运行所需的内部存储类。

3.创建永久性卷声明

永久卷声明 (PVC) 用于基于存储类自动预配存储。 按照以下步骤使用新的存储类创建 PVC。

  1. 使用最喜爱的文本编辑器创建 YAML 清单文件,例如 code acstor-pvc.yaml

  2. 粘贴以下代码并保存文件。 PVC name 值可以是所需的任何内容。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: azurediskpvc
    spec:
      accessModes:
        - ReadWriteOnce
      storageClassName: acstor-azuredisk # replace with the name of your storage class if different
      resources:
        requests:
          storage: 100Gi
    
  3. 应用 YAML 清单文件以创建 PVC。

    kubectl apply -f acstor-pvc.yaml
    

    此时会看到与下面类似的输出:

    persistentvolumeclaim/azurediskpvc created
    

    可以通过运行以下命令来验证 PVC 的状态:

    kubectl describe pvc azurediskpvc
    

创建 PVC 后,即可供 Pod 使用。

4.部署 Pod 并附加永久性卷

使用 Fio(灵活 I/O 测试器)创建 Pod 以进行基准测试和工作负载模拟,并为永久性卷指定装载路径。 对于 claimName,可使用创建永久性卷声明时使用的名称值。

  1. 使用最喜爱的文本编辑器创建 YAML 清单文件,例如 code acstor-pod.yaml

  2. 粘贴以下代码并保存文件。

    kind: Pod
    apiVersion: v1
    metadata:
      name: fiopod
    spec:
      nodeSelector:
        acstor.azure.com/io-engine: acstor
      volumes:
        - name: azurediskpv
          persistentVolumeClaim:
            claimName: azurediskpvc
      containers:
        - name: fio
          image: nixery.dev/shell/fio
          args:
            - sleep
            - "1000000"
          volumeMounts:
            - mountPath: "/volume"
              name: azurediskpv
    
  3. 应用 YAML 清单文件以部署 Pod。

    kubectl apply -f acstor-pod.yaml
    

    应该会看到与下面类似的输出:

    pod/fiopod created
    
  4. 检查 Pod 是否正在运行,以及永久性卷声明是否已成功绑定到 Pod:

    kubectl describe pod fiopod
    kubectl describe pvc azurediskpvc
    
  5. 检查 fio 测试以查看其当前状态:

    kubectl exec -it fiopod -- fio --name=benchtest --size=800m --filename=/volume/test --direct=1 --rw=randrw --ioengine=libaio --bs=4k --iodepth=16 --numjobs=8 --time_based --runtime=60
    

现在,你已部署了使用 Azure 磁盘作为存储的 Pod,并且可以将其用于 Kubernetes 工作负载。

管理永久性卷和存储池

现在你已创建了永久性卷,可以根据需要分离并重新附加该卷。 还可以扩展或删除存储池。

分离并重新附加永久性卷

要分离永久性卷,请删除永久卷附加到的 Pod。 将 <pod-name> 替换为 Pod 的名称,例如 fiopod

kubectl delete pods <pod-name>

要重新附加永久性卷,只需在 YAML 清单文件中引用永久性卷声明名称,如部署 Pod 并附加永久性卷中所述。

要检查永久性卷声明绑定到哪个永久性卷,请运行 kubectl get pvc <persistent-volume-claim-name>

展开存储池

可展开 Azure 磁盘支持的存储池,从而无需停机就能快速纵向扩展。 目前不支持收缩存储池。 超级磁盘或高级 SSD v2 磁盘不支持存储池扩展。

注意

扩展存储池可以增加 Azure 容器存储和 Azure 磁盘的成本。 请参阅 Azure 容器存储定价页了解 Azure 容器存储计费

目前,在使用 Premium_LRSStandard_LRSStandardSSD_LRSPremium_ZRSStandardSSD_ZRS SKU 时,存储池扩展具有以下限制:

  • 如果现有存储池小于 4 TiB (4,096 GiB),则最多只能将其扩展到 4,095 GiB。 为了避免错误,如果当前存储池最初小于 4 TiB (4,096 GiB),请不要尝试将其扩展到 4,095 GiB 以上。 容量 > 4 TiB 的存储池可以扩展到可用的最大存储容量。

按照以下说明扩展 Azure 磁盘的现有存储池。

  1. 使用文本编辑器打开用于创建存储池的 YAML 清单文件,例如 code acstor-storagepool.yaml

  2. 将 YAML 清单文件中指定的“存储”条目替换为所需的值。 此值必须大于存储池的当前容量。 例如,如果规范设置为 storage: 1Ti,请将其更改为 storage: 2Ti。 如果创建了预配的存储池,则不会有“存储”条目,因为存储池从预配的 Azure 磁盘继承了容量大小。 如果在 YAML 中看不到“存储”条目,请添加以下代码,指定所需的存储容量,然后保存清单文件:

    spec:
      resources:
        requests:
          storage: 2Ti
    

注意

如果你在一个存储池中有两个容量各为 1 TiB 的磁盘,并且你将 YAML 清单文件中的读数修改为 storage: 4Ti,则在应用 YAML 文件时,两个磁盘的容量都会扩展到 2 TiB,从而使总容量达到 4 TiB。

  1. 应用 YAML 清单文件以展开存储池。

    kubectl apply -f acstor-storagepool.yaml 
    
  2. 运行此命令来检查存储池的状态。 将 <storage-pool-name> 替换为存储池名称值。

    kubectl describe sp <storage-pool-name> -n acstor
    

    应该会看到一条消息,例如“存储池正在扩展”。几分钟后再次运行该命令,消息应该会消失。

  3. 运行 kubectl get sp -A,存储池应反映新大小。

删除存储池

如果要删除存储池,请运行以下命令。 将 <storage-pool-name> 替换为存储池名称。

kubectl delete sp -n acstor <storage-pool-name>

请参阅