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

在 Azure Kubernetes 服务 (AKS) 中使用 Azure 磁盘容器存储接口 (CSI) 驱动程序

Azure 磁盘容器存储接口 (CSI) 驱动程序是符合 CSI 规范的驱动程序,供 Azure Kubernetes 服务 (AKS) 用来管理 Azure 磁盘的生命周期。

CSI 是有关对 Kubernetes 上的容器化工作负载公开任意块和文件存储系统的一个标准。 现在,AKS 可以采用 CSI 来编写、部署和迭代插件,以在 Kubernetes 中公开新的或改进现有的存储系统。 在 AKS 中使用 CSI 驱动程序可以避免改动核心 Kubernetes 代码并等待完成代码发布周期。

要创建支持 CSI 驱动程序的 AKS 群集,请参阅在 AKS 上启用 CSI 驱动程序。 本文介绍了如何使用 Azure 磁盘 CSI 驱动程序版本 1。

备注

Azure 磁盘 CSI 驱动程序 v2(预览版)提高了可伸缩性并降低了 Pod 故障转移延迟。 它使用共享磁盘在多个群集节点上预配附件副本,并与 Pod 调度程序集成以确保在 Pod 故障转移时选择具有附件副本的节点。 Azure 磁盘 CSI 驱动程序 v2(预览版)还提供了微调性能的功能。 如果有兴趣体验预览版,请提交请求:https://aka.ms/DiskCSIv2Preview。 此预览版的提供不含服务级别协议,我们会不时在该预览版中进行中断性变更。 不建议将预览版用于生产工作负载。 有关详细信息,请参阅 Microsoft Azure 预览版补充使用条款

备注

“树中驱动程序”是指包含在核心 Kubernetes 代码中的当前存储驱动程序,而不是新的 CSI 驱动程序(插件)。

Azure 磁盘 CSI 驱动程序功能

除了树中的驱动程序功能外,Azure 磁盘 CSI 驱动程序还支持以下功能:

  • 并发磁盘附加和拆离期间的性能改进
    • 树中驱动程序以串行方式附加或拆离磁盘,而 CSI 驱动程序以批量方式附加或拆离磁盘。 当多个磁盘附加到一个节点时,就会出现显著改进。
  • 支持高级 SSD v1 和 v2。
    • PremiumV2_LRS 仅支持 None 高速缓存模式
  • 区域冗余存储 (ZRS) 磁盘支持
    • 支持 Premium_ZRSStandardSSD_ZRS 磁盘类型。 可以在区域或非区域节点上调度 ZRS 磁盘,而不受磁盘卷应与给定节点位于同一区域的限制。 有关详细信息(包括哪些地区受支持),请查看托管磁盘的区域冗余存储
  • 快照
  • 卷克隆
  • 在不停机的情况下调整磁盘 PV 大小

备注

根据所使用的 VM SKU,Azure 磁盘 CSI 驱动程序可能具有每节点的卷限制。 例如,对于一些功能强大的 VM(例如,16 个核心),此限制为每个节点 64 个卷。 若要确定每个 VM SKU 的限制,请查看提供的每个 VM SKU 的“最大数据磁盘数”列。 有关提供的 VM SKU 及其相应的详细容量限制的列表,请参阅常规用途虚拟机大小

使用含 Azure 磁盘的 CSI 永久性卷

永久性卷 (PV) 表示已经过预配的可用于 Kubernetes Pod 的存储块。 PV 可供一个或多个 Pod 使用,并可动态或静态预配。 本文介绍了如何动态创建含 Azure 磁盘的 PV,以供 AKS 群集中的单个 Pod 使用。 有关静态预配,请参阅使用 Azure 磁盘创建静态卷

有关 Kubernetes 卷的详细信息,请参阅 AKS 中应用程序的存储选项

使用内置存储类动态创建 Azure 磁盘 PV

存储类用于定义使用永久性卷动态创建存储单位的方式。 有关 Kubernetes 存储类的详细信息,请参阅 Kubernetes 存储类

在 AKS 上使用 Azure 磁盘 CSI 驱动程序时,还有两个使用 Azure 磁盘 CSI 存储驱动程序的内置 StorageClasses。 其他这些 CSI 存储类是使用群集连同树中默认的存储类一起创建的。

  • managed-csi:使用 Azure Standard SSD 本地冗余存储 (LRS) 创建托管磁盘。 从 Kubernetes 版本 1.29 开始,在跨多个可用性区域部署的 Azure Kubernetes 服务 (AKS) 群集中,此存储类利用 Azure 标准 SSD 区域冗余存储 (ZRS) 来创建托管磁盘。
  • managed-csi-premium:使用 Azure 高级 LRS 创建托管磁盘。 从 Kubernetes 版本 1.29 开始,在跨多个可用性区域部署的 Azure Kubernetes 服务 (AKS) 群集中,此存储类利用 Azure 高级区域冗余存储 (ZRS) 来创建托管磁盘。

这两个存储类中的回收策略可确保在删除相应 PV 时删除基础 Azure 磁盘。 存储类还会将 PV 配置为可扩展。 只需使用新大小编辑永久性卷声明 (PVC) 即可。

若要使用这些存储类,请创建一个引用并使用这些类的 PVC 和相应 Pod。 PVC 用于基于存储类自动预配存储。 PVC 可以使用一个预先创建的存储类或用户定义的存储类,创建所需 SKU 和大小的 Azure 托管磁盘。 创建 Pod 定义时,将指定 PVC 来请求所需的存储。

通过运行 kubectl apply 命令创建示例 Pod 和相应的 PVC:

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/pvc-azuredisk-csi.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/nginx-pod-azuredisk.yaml

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

persistentvolumeclaim/pvc-azuredisk created
pod/nginx-azuredisk created

Pod 处于运行状态后,运行以下命令创建名为 test.txt 的新文件。

kubectl exec nginx-azuredisk -- touch /mnt/azuredisk/test.txt

要验证磁盘是否已正确装载,请运行以下命令并验证输出是否出现 test.txt 文件:

kubectl exec nginx-azuredisk -- ls /mnt/azuredisk

lost+found
outfile
test.txt

创建自定义存储类

默认存储类适用于最常见的场景。 在某些情况下,你可能想要使用自己的参数来自定义自己的存储类。 例如,你可能需要更改 volumeBindingMode 类。

你可以使用 volumeBindingMode: Immediate 类,此类可保证创建 PVC 后立即生效。 在节点池受拓扑限制的情况下,例如在使用可用性区域时,绑定或预配 PV 时便不会考虑 Pod 的计划要求。

为处理这种情况,可以使用 volumeBindingMode: WaitForFirstConsumer,它会延迟 PV 绑定和预配,直至创建使用该 PVC 的 Pod。 这样,PV 将与 Pod 的计划约束指定的可用性区域(或其他拓扑)一致并预配到其中。 默认存储类使用 volumeBindingMode: WaitForFirstConsumer 类。

创建名为 sc-azuredisk-csi-waitforfirstconsumer.yaml 的文件,然后粘贴以下清单。 此存储类与 managed-csi 存储类相同,但它使用不同的 volumeBindingMode 类。

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: azuredisk-csi-waitforfirstconsumer
provisioner: disk.csi.azure.com
parameters:
  skuname: StandardSSD_LRS
allowVolumeExpansion: true
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer

通过运行 kubectl apply 命令创建存储类并指定 sc-azuredisk-csi-waitforfirstconsumer.yaml 文件:

kubectl apply -f sc-azuredisk-csi-waitforfirstconsumer.yaml

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

storageclass.storage.k8s.io/azuredisk-csi-waitforfirstconsumer created

卷快照

Azure 磁盘 CSI 驱动程序支持创建永久性卷的快照。 通过此功能,此驱动程序可以创建完整快照或增量快照,具体取决于 incremental 参数中设置的值(默认情况下为 true)。

下表提供所有参数的详细信息。

名称 含义 可用值 必需 默认值
resourceGroup 用于存储快照截图的资源组 现有资源组 如果未指定,快照将存储在源 Azure 磁盘所在的资源组中
增量 拍摄完整快照或增量快照 truefalse true
标记 Azure 磁盘标记 标记格式:“key1=val1,key2=val2” ""
userAgent 用于客户使用情况归因的用户代理 生成的用户代理格式为 driverName/driverVersion compiler/version (OS-ARCH)
subscriptionID 指定将在其中创建 Azure 磁盘的 Azure 订阅 ID Azure 订阅 ID 如果不为空,则必须提供 resourceGroup,必须将 incremental 设置为 false

创建卷快照

备注

在继续之前,请确保应用程序不会将数据写入源磁盘。

为演示此功能,我们使用 kubectl apply 命令创建卷快照类

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/snapshot/storageclass-azuredisk-snapshot.yaml

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

volumesnapshotclass.snapshot.storage.k8s.io/csi-azuredisk-vsc created

现在基于我们在本教程开头动态创建的 PVC pvc-azuredisk 创建卷快照

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/snapshot/azuredisk-volume-snapshot.yaml

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

volumesnapshot.snapshot.storage.k8s.io/azuredisk-volume-snapshot created

若要验证是否正确创建了快照,请运行以下命令:

kubectl describe volumesnapshot azuredisk-volume-snapshot

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

Name:         azuredisk-volume-snapshot
Namespace:    default
Labels:       <none>
Annotations:  API Version:  snapshot.storage.k8s.io/v1
Kind:         VolumeSnapshot
Metadata:
  Creation Timestamp:  2020-08-27T05:27:58Z
  Finalizers:
    snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection
    snapshot.storage.kubernetes.io/volumesnapshot-bound-protection
  Generation:        1
  Resource Version:  714582
  Self Link:         /apis/snapshot.storage.k8s.io/v1/namespaces/default/volumesnapshots/azuredisk-volume-snapshot
  UID:               dd953ab5-6c24-42d4-ad4a-f33180e0ef87
Spec:
  Source:
    Persistent Volume Claim Name:  pvc-azuredisk
  Volume Snapshot Class Name:      csi-azuredisk-vsc
Status:
  Bound Volume Snapshot Content Name:  snapcontent-dd953ab5-6c24-42d4-ad4a-f33180e0ef87
  Creation Time:                       2020-08-31T05:27:59Z
  Ready To Use:                        true
  Restore Size:                        10Gi
Events:                                <none>

基于卷快照创建新的 PVC

可以基于卷快照创建新的 PVC。 使用在上一步中创建的快照,并创建新的 PVC 和要使用它的新 Pod

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/snapshot/pvc-azuredisk-snapshot-restored.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/snapshot/nginx-pod-restored-snapshot.yaml

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

persistentvolumeclaim/pvc-azuredisk-snapshot-restored created
pod/nginx-restored created

最后,让我们通过运行以下命令检查内容来确保它与之前创建的 PVC 相同:

kubectl exec nginx-restored -- ls /mnt/azuredisk

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

lost+found
outfile
test.txt

与预期一样,我们仍然可以看到以前创建的 test.txt 文件。

克隆卷

克隆卷表示现有 Kubernetes 卷的副本。 有关在 Kubernetes 中克隆卷的详细信息,请参阅有关卷克隆的概念文档。

Azure 磁盘的 CSI 驱动程序支持卷克隆。 为了进行演示,我们创建之前创建的 azuredisk-pvc克隆卷要使用它的新 Pod

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/cloning/pvc-azuredisk-cloning.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/cloning/nginx-pod-restored-cloning.yaml

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

persistentvolumeclaim/pvc-azuredisk-cloning created
pod/nginx-restored-cloning created

可以通过运行以下命令并确认 test.txt 文件已创建来验证克隆卷的内容:

kubectl exec nginx-restored-cloning -- ls /mnt/azuredisk

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

lost+found
outfile
test.txt

在不停机的情况下,调整永久性卷的大小

可为 PVC 请求较大的卷。 编辑 PVC 对象,并指定较大的大小。 此项更改会触发为 PV 提供支持的基础卷的扩展。

备注

永远不会创建新的 PV 来满足声明, 而是会调整现有卷的大小。

在 AKS 中,内置的 managed-csi 存储类已经能够支持扩展,因此请使用先前通过此存储类创建的 PVC。 此 PVC 请求了 10 Gi 永久性卷。 通过运行以下命令进行确认:

kubectl exec -it nginx-azuredisk -- df -h /mnt/azuredisk

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

Filesystem      Size  Used Avail Use% Mounted on
/dev/sdc        9.8G   42M  9.8G   1% /mnt/azuredisk

运行以下命令,增加 spec.resources.requests.storage 字段,从而扩展 PVC:

kubectl patch pvc pvc-azuredisk --type merge --patch '{"spec": {"resources": {"requests": {"storage": "15Gi"}}}}'

备注

目前不支持收缩永久性卷。 尝试修补大小小于当前大小的现有 PVC 会导致以下错误消息:The persistentVolumeClaim "pvc-azuredisk" is invalid: spec.resources.requests.storage: Forbidden: field can not be less than previous value.

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

persistentvolumeclaim/pvc-azuredisk patched

运行以下命令以确认卷大小已增加:

kubectl get pv

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

NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                     STORAGECLASS   REASON   AGE
pvc-391ea1a6-0191-4022-b915-c8dc4216174a   15Gi       RWO            Delete           Bound    default/pvc-azuredisk                     managed-csi             2d2h
(...)

几分钟后,运行以下命令以确认 PVC 的大小:

kubectl get pvc pvc-azuredisk

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

NAME            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-azuredisk   Bound    pvc-391ea1a6-0191-4022-b915-c8dc4216174a   15Gi       RWO            managed-csi    2d2h

执行以下命令确认 Pod 内部磁盘的大小:

kubectl exec -it nginx-azuredisk -- df -h /mnt/azuredisk

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

Filesystem      Size  Used Avail Use% Mounted on
/dev/sdc         15G   46M   15G   1% /mnt/azuredisk

按需突发

通过按需磁盘突发模式,磁盘可以在其需求超出其当前容量时突发。 只要磁盘出现突发时,此模型就会产生额外的费用。 按需突发仅适用于大于 512 GiB 的高级 SSD。 有关高级 SSD 预配的 IOPS 和每个磁盘的吞吐量的详细信息,请参阅高级 SSD 大小。 或者,基于额度的突发:仅在磁盘的额度桶中积满突发额度时,磁盘才会突发。 磁盘突发时,基于额度的突发不会产生额外的费用。 基于额度的突发仅适用于高级 SSD 512 GiB 以及更小的磁盘和标准 SSD 1024 GiB 以及更小的磁盘。 有关按需突发的详细信息,请参阅按需突发

重要

默认 managed-csi-premium 存储类已禁用按需突发,并使用基于额度的突发。 基于默认 managed-csi-premium 存储类的永久性卷声明动态创建的任何高级 SSD 也禁用按需突发。

若要创建启用了按需突发的高级 SSD 永久性卷,可以创建新存储类,并将 enableBursting 参数设置为 true,如以下 YAML 模板所示。 有关启用按需突发的详细信息,请参阅按需突发。 有关生成自己的已启用按需突发的存储类的详细信息,请参阅创建可突发托管 CSI 高级存储类

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: burstable-managed-csi-premium
provisioner: disk.csi.azure.com
parameters:
  skuname: Premium_LRS
  enableBursting: "true"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true

Windows 容器

Azure 磁盘 CSI 驱动程序支持 Windows 节点和容器。 如果要使用 Windows 容器,请遵循 Windows 容器快速入门教程添加 Windows 节点池。

具有 Windows 节点池后,现在可以使用内置的存储类,如 managed-csi。 可以通过运行以下 kubectl apply 命令部署基于 Windows 的 StatefulSet 示例,该示例将时间戳保存到文件 data.txt 中:

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/azuredisk-csi-driver/master/deploy/example/windows/statefulset.yaml

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

statefulset.apps/busybox-azuredisk created

要验证卷的内容,请运行以下命令:

kubectl exec -it busybox-azuredisk-0 -- cat c:\\mnt\\azuredisk\\data.txt # on Linux/MacOS Bash
kubectl exec -it busybox-azuredisk-0 -- cat c:\mnt\azuredisk\data.txt # on Windows Powershell/CMD

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

2020-08-27 08:13:41Z
2020-08-27 08:13:42Z
2020-08-27 08:13:44Z
(...)

后续步骤