你当前正在访问 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 群集的存储的逻辑分组。
可以使用以下选项来创建存储池:
- 创建动态存储池
- 使用已预配的 Azure 托管磁盘创建预先预配的存储池
- 使用自己的加密密钥创建动态存储池(可选)
如果使用 az aks create
或 az aks update
命令启用 Azure 容器存储,你可能已有存储池。 使用 kubectl get sp -n acstor
获取存储池的列表。 如果已有要使用的存储池,可以跳过此步骤,然后转到显示可用的存储类。
创建动态存储池
按照以下步骤为 Azure 磁盘创建动态存储池。
使用最喜爱的文本编辑器创建 YAML 清单文件,例如
code acstor-storagepool.yaml
。粘贴到以下代码中。 存储池名称值可以是所需的任何内容。 对于 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 磁盘,则可以使用存储池定义中的
IOPSReadWrite
和MBpsReadWrite
参数设置 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
保存 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 磁盘创建预配的存储池。
登录 Azure 门户。
对于要使用的每个磁盘,请导航到 Azure 托管磁盘并选择“设置”>“属性”。 复制“资源 ID”下的整个字符串并将其放入文本文件中。
使用最喜爱的文本编辑器创建 YAML 清单文件,例如
code acstor-storagepool.yaml
。粘贴到以下代码中。 存储池名称值可以是所需的任何内容。 将
<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>
应用 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
按照以下步骤使用自己的加密密钥创建存储池。 从此存储池创建的所有永久性卷都将使用相同的密钥进行加密。
使用最喜爱的文本编辑器创建 YAML 清单文件,例如
code acstor-storagepool-cmk.yaml
。粘贴以下代码,提供所需的参数,并保存文件。 存储池名称值可以是所需的任何内容。 对于 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
应用 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。
使用最喜爱的文本编辑器创建 YAML 清单文件,例如
code acstor-pvc.yaml
。粘贴以下代码并保存文件。 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
应用 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,可使用创建永久性卷声明时使用的名称值。
使用最喜爱的文本编辑器创建 YAML 清单文件,例如
code acstor-pod.yaml
。粘贴以下代码并保存文件。
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
应用 YAML 清单文件以部署 Pod。
kubectl apply -f acstor-pod.yaml
应该会看到与下面类似的输出:
pod/fiopod created
检查 Pod 是否正在运行,以及永久性卷声明是否已成功绑定到 Pod:
kubectl describe pod fiopod kubectl describe pvc azurediskpvc
检查 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_LRS
、Standard_LRS
、StandardSSD_LRS
、Premium_ZRS
和 StandardSSD_ZRS
SKU 时,存储池扩展具有以下限制:
- 如果现有存储池小于 4 TiB (4,096 GiB),则最多只能将其扩展到 4,095 GiB。 为了避免错误,如果当前存储池最初小于 4 TiB (4,096 GiB),请不要尝试将其扩展到 4,095 GiB 以上。 容量 > 4 TiB 的存储池可以扩展到可用的最大存储容量。
按照以下说明扩展 Azure 磁盘的现有存储池。
使用文本编辑器打开用于创建存储池的 YAML 清单文件,例如
code acstor-storagepool.yaml
。将 YAML 清单文件中指定的“存储”条目替换为所需的值。 此值必须大于存储池的当前容量。 例如,如果规范设置为
storage: 1Ti
,请将其更改为storage: 2Ti
。 如果创建了预配的存储池,则不会有“存储”条目,因为存储池从预配的 Azure 磁盘继承了容量大小。 如果在 YAML 中看不到“存储”条目,请添加以下代码,指定所需的存储容量,然后保存清单文件:spec: resources: requests: storage: 2Ti
注意
如果你在一个存储池中有两个容量各为 1 TiB 的磁盘,并且你将 YAML 清单文件中的读数修改为 storage: 4Ti
,则在应用 YAML 文件时,两个磁盘的容量都会扩展到 2 TiB,从而使总容量达到 4 TiB。
应用 YAML 清单文件以展开存储池。
kubectl apply -f acstor-storagepool.yaml
运行此命令来检查存储池的状态。 将
<storage-pool-name>
替换为存储池名称值。kubectl describe sp <storage-pool-name> -n acstor
应该会看到一条消息,例如“存储池正在扩展”。几分钟后再次运行该命令,消息应该会消失。
运行
kubectl get sp -A
,存储池应反映新大小。
删除存储池
如果要删除存储池,请运行以下命令。 将 <storage-pool-name>
替换为存储池名称。
kubectl delete sp -n acstor <storage-pool-name>