Compartir a través de

使用 Azure 磁盘在 Azure Kubernetes 服务 (AKS) 中创建和管理持久卷 (PV)

本文介绍如何使用 Azure 磁盘动态和静态创建永久性卷(PV),以供 Azure Kubernetes 服务 (AKS) 群集中的单个 Pod 使用。

先决条件

  • 已安装并配置 Azure CLI 2.0.59 或更高版本。 使用 az --version 命令查找版本。 若要安装或升级,请参阅安装 Azure CLI

  • 在 AKS 群集上启用了 Azure 磁盘 CSI 驱动程序

  • Azure 磁盘 CSI 驱动程序具有每个节点的卷限制。 卷计数因节点/节点池的大小而异。 可以使用 kubectl get 命令来确定每个节点可分配的卷数。 例如:

    kubectl get CSINode <node-name> -o yaml
    

    如果每个节点的卷限制是工作负载的问题,请考虑使用 Azure 容器存储来代替 CSI 驱动程序来管理持久卷。

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

存储类用于定义使用永久性卷动态创建存储单位的方式。

每个 AKS 群集都包含四个内置存储类,其中两个类配置为使用 Azure 磁盘:

  • 默认存储类预配标准 SSD Azure 磁盘。
    • 标准 SSD 可备份标准存储并提供经济高效的存储,同时仍提供可靠的性能。
  • managed-csi-premium 存储类用于预配高级 Azure 磁盘。
    • 基于 SSD 的高性能、低延迟磁盘支持高级磁盘。 它们非常适合运行生产工作负荷的虚拟机(VM)。 在 AKS 上使用 Azure 磁盘 CSI 驱动程序时,还可以使用 managed-csi 存储类,该类由标准 SSD 本地冗余存储 (LRS) 提供支持。
  • 从 Kubernetes 版本 1.29 开始有效:跨多个可用性区域部署 AKS 群集时,AKS 现在使用区域冗余存储(ZRS)在内置存储类中创建托管磁盘。
    • ZRS 可确保在所选区域中的多个 Azure 可用性区域中同步复制 Azure 托管磁盘。 此冗余策略可增强应用程序的复原能力,并保护数据免受数据中心故障的影响。
      • 但是,请务必注意,与本地冗余存储(LRS)相比,ZRS 的成本更高。 如果成本优化是优先级,则可以使用 LRS SKU 名称参数创建新的存储类,并将其用于 PVC。

由于存在数据丢失风险,不支持缩小 PVC 的大小。 可以使用命令编辑现有存储类 kubectl edit sc ,也可以 创建自己的自定义存储类

注释

持久卷声明以 GiB 为单位定义,但 Azure 托管磁盘根据 SKU 按特定大小计费。 这些 SKU 的范围从 S4 或 P4 磁盘的 32 GiB 到 S80 或 P80 磁盘的 32 TiB(预览版)。 高级 SSD 的吞吐量和 IOPS 性能取决于 AKS 群集中节点的 SKU 和实例大小。 有关详细信息,请参阅 托管磁盘的定价和性能

使用 kubectl get sc 命令查看预先创建的存储类。 以下示例演示 AKS 群集中可用的预创建storage类:

kubectl get sc

输出应类似于以下示例输出,其中包括预为 Azure 磁盘创建的 defaultmanaged-csi 存储类:

NAME                PROVISIONER                AGE
default (default)   disk.csi.azure.com         1h
managed-csi         disk.csi.azure.com         1h

使用 Azure 磁盘为动态 PV 创建自定义存储类

默认存储类适用于大多数方案。 在某些情况下,你可能想要使用自己的参数自定义自己的存储类。 例如,你可能想要更改 volumeBindingMode 类。

可以使用一个 volumeBindingMode: Immediate 类,该类保证一旦创建 PVC 就立即生效。 当节点池受到拓扑约束时,例如使用可用区时,PV 会被绑定或提供,而无法知晓 Pod 的调度要求。

若要解决这种情况,可以使用 volumeBindingMode: WaitForFirstConsumer,这会在创建一个使用 PVC 的 Pod 之前延迟 PV 的绑定和预配。 通过这种方式,PV 符合 Pod 调度约束,并被配置在指定的可用性区域(或其他拓扑)中。 默认存储类使用 volumeBindingMode: WaitForFirstConsumer 类。

  1. 创建一个名为sc-azuredisk-csi-waitforfirstconsumer.yaml的文件,并将以下 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
    
  2. 使用 kubectl apply 命令创建存储类并指定 sc-azuredisk-csi-waitforfirstconsumer.yaml 文件:

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

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

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

使用 Azure 磁盘的动态 PV 的存储类参数

下表包含的参数可用于使用 Azure 磁盘为您的动态持久性卷声明(PVC)定义自定义存储类:

名称 含义 可用值 必需 默认值
skuName Azure 磁盘存储帐户类型(别名: storageAccountType) 。 PremiumV2_LRSUltraSSD_LRS 支持对增量快照还原的即时访问。 Standard_LRSPremium_LRSStandardSSD_LRSPremiumV2_LRSUltraSSD_LRSPremium_ZRSStandardSSD_ZRS StandardSSD_LRS
fsType 文件系统类型 ext4ext3ext2xfsbtrfs适用于 Linux
ntfs 适用于 Windows
ext4 适用于 Linux
ntfs 适用于 Windows
cachingMode Azure 数据磁盘主机缓存设置 (PremiumV2_LRS和UltraSSD_LRS仅支持 None 缓存模式) NoneReadOnlyReadWrite ReadOnly
resourceGroup 指定Azure磁盘的资源组 现有资源组名称 如果为空,驱动程序将使用与当前 AKS 群集相同的资源组名称
DiskIOPSReadWrite 超级磁盘高级 SSD v2 IOPS 功能(最小值:2 IOPS/GiB) 100~160000 500
DiskMBpsReadWrite 超级磁盘高级 SSD v2 吞吐量功能(最低:0.032/GiB) 1~2000 100
LogicalSectorSize 超级磁盘的逻辑扇区大小(以字节为单位)。 5124096 4096
tags Azure 磁盘标记 标记格式:key1=val1,key2=val2 ""
diskEncryptionSetID 用于启用静态加密的磁盘加密集的资源 ID 格式:/subscriptions/{subs-id}/resourceGroups/{rg-name}/providers/Microsoft.Compute/diskEncryptionSets/{diskEncryptionSet-name} ""
diskEncryptionType 磁盘加密集的加密类型。 EncryptionAtRestWithCustomerKey (默认情况下), EncryptionAtRestWithPlatformAndCustomerKeys ""
writeAcceleratorEnabled Azure 磁盘上的写入加速器 truefalse ""
networkAccessPolicy NetworkAccessPolicy 属性用于防止生成磁盘或快照的 SAS URI。 AllowAllDenyAllAllowPrivate AllowAll
diskAccessID 用于在磁盘上配置专用终结点的 DiskAccess 资源的 Azure 资源 ID ``
enableBursting 启用按需突发超过磁盘预定的性能目标。 按需突发应仅应用于高级版磁盘,同时磁盘大小 > 512 GB。 不支持超级磁盘和共享磁盘。 默认情况下禁用突发功能。 truefalse false
useragent 用于客户使用情况归因的用户代理 生成的用户代理格式: driverName/driverVersion compiler/version (OS-ARCH)
subscriptionID 指定创建 Azure 磁盘的 Azure 订阅 ID。 Azure 订阅 ID 如果不为空,则必须提供 resourceGroup
--- 以下参数仅适用于 v2 --- --- ---
maxShares 磁盘允许的共享磁盘装载总数。 将该值设置为 2 或 2 以上可启用附件副本。 支持的值取决于磁盘大小。 有关支持的值,请参阅 “共享 Azure 托管磁盘 ”。 1
maxMountReplicaCount 要维护的副本附件数。 该值必须在 [0..(maxShares - 1)] 范围内 如果 accessModeReadWriteMany,则默认值为 0。 否则默认值为 maxShares - 1

使用 Azure 磁盘创建 PVC

PVC 根据存储类自动分配存储。 在这种情况下,PVC 可以使用预先创建的存储类之一来创建标准或高级 Azure 托管磁盘。

  1. 创建一个名为 azure-pvc.yaml 的文件,并在其中粘贴以下清单。 该声明请求名为 azure-managed-disk、大小为 5 GB、具有 ReadWriteOnce 访问权限的磁盘。 managed-csi 被指定为存储类。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
        name: azure-managed-disk
    spec:
    accessModes:
    - ReadWriteOnce
    storageClassName: managed-csi
    resources:
        requests:
        storage: 5Gi
    

    小窍门

    若要创建使用 premium storage 的磁盘,请使用 storageClassName: managed-csi-premium,而不是 managed-csi

  2. 使用 kubectl apply 命令创建 PVC,并指定 azure-pvc.yaml 文件:

    kubectl apply -f azure-pvc.yaml
    

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

    persistentvolumeclaim/azure-managed-disk created
    
  3. 使用 kubectl describe pvc 命令验证 PV 是否已准备好供 Pod 使用。

    kubectl describe pvc azure-managed-disk
    

    输出应类似于以下示例输出,其中显示 PV 处于 挂起 状态:

    Name:            azure-managed-disk
    Namespace:       default
    StorageClass:    managed-csi
    Status:          Pending
    [...]
    

创建将 PVC 与 Azure 磁盘配合使用的 Pod

  1. 创建一个名为 azure-pvc-disk.yaml 的文件,并在其中粘贴以下清单。 此清单创建了一个基本的 NGINX Pod,它使用名为 azure-managed-disk 的持久卷声明,将 Azure 磁盘装载到路径 /mnt/azure。 (对于 Windows Server 容器,请使用 Windows 路径约定指定 mountPath ,如 “D:”)。

    kind: Pod
    apiVersion: v1
    metadata:
      name: mypod
    spec:
      containers:
        - name: mypod
          image: mcr.azk8s.cn/oss/nginx/nginx:1.15.5-alpine
          resources:
            requests:
              cpu: 100m
              memory: 128Mi
            limits:
              cpu: 250m
              memory: 256Mi
          volumeMounts:
            - mountPath: "/mnt/azure"
              name: volume
              readOnly: false
      volumes:
        - name: volume
          persistentVolumeClaim:
            claimName: azure-managed-disk
    
  2. 使用 kubectl apply 命令创建 pod。

    kubectl apply -f azure-pvc-disk.yaml
    

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

    pod/mypod created
    
  3. 您现在有一个正在运行的 pod,Azure 磁盘已挂载在 /mnt/azure 目录中。 使用 kubectl describe 命令检查 Pod 配置。

    kubectl describe pod mypod
    

    您的输出应该类似于以下示例输出,该输出显示名为 的 volume 正在使用名为 azure-managed-disk 的 PVC。

    [...]
    Volumes:
    volume:
        Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
        ClaimName:  azure-managed-disk
        ReadOnly:   false
        default-token-smm2n:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  default-token-smm2n
        Optional:    false
    [...]
    Events:
    Type    Reason                 Age   From                               Message
    ----    ------                 ----  ----                               -------
    Normal  Scheduled              2m    default-scheduler                  Successfully assigned mypod to aks-nodepool1-12345678-9
    Normal  SuccessfulMountVolume  2m    kubelet, aks-nodepool1-12345678-9  MountVolume.SetUp succeeded for volume "default-token-smm2n"
    Normal  SuccessfulMountVolume  1m    kubelet, aks-nodepool1-12345678-9  MountVolume.SetUp succeeded for volume "pvc-abc0d123-4e5f-67g8-901h-ijk23l45m678"
    [...]
    

Azure 磁盘的卷快照类参数

Azure 磁盘 CSI 驱动程序支持创建 持久卷的快照。 作为此功能的一部分,驱动程序可以根据参数中设置的值执行完整快照或快照。

下表提供了可用于使用 Azure 磁盘为卷快照定义自定义卷快照类的参数的详细信息:

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

使用 Azure 磁盘从 PVC 创建卷快照

注释

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

  1. 使用以下命令创建卷快照类

    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
    
  2. 使用以下命令从之前在本教程中创建的动态 PVC 创建kubectl apply

    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
    
  3. 使用 kubectl describe 以下命令验证是否已成功创建卷快照:

    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:               00aa00aa-bb11-cc22-dd33-44ee44ee44ee
    Spec:
      Source:
        Persistent Volume Claim Name:  pvc-azuredisk
      Volume Snapshot Class Name:      csi-azuredisk-vsc
    Status:
      Bound Volume Snapshot Content Name:  snapcontent-00aa00aa-bb11-cc22-dd33-44ee44ee44ee
      Creation Time:                       2020-08-31T05:27:59Z
      Ready To Use:                        true
      Restore Size:                        10Gi
    Events:                                <none>
    

使用 Azure 磁盘,基于卷快照创建新的 PVC

可以基于卷快照创建新的 PVC。 在本部分中,我们使用从 “使用 Azure 磁盘创建 PVC 卷快照”部分 中的快照,并创建新的 PVC 和新的 Pod 进行消费。

  1. 使用以下命令 kubectl apply 创建 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
    
  2. 要验证它是否是之前创建的同一 PVC,需使用 kubectl exec 命令检查卷的内容,并在 Pod 中通过 ls 命令执行。

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

    输出应该类似于以下示例输出,它显示了与原始 PVC 相同的内容,并包括在原始 PVC 中创建的 test.txt 文件:

    lost+found
    outfile
    test.txt
    

使用 Azure 磁盘克隆卷

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

Azure 磁盘的 CSI 驱动程序支持卷克隆。 若要演示,请创建在本教程前面创建的动态 PVC 的 克隆卷 ,并创建 一个新的 Pod 来使用它

  1. 使用以下命令 kubectl apply 创建克隆的 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
    
  2. 使用 kubectl exec 命令检查卷的内容以在 Pod 中执行 ls 命令,验证克隆卷的内容是否与原始卷相同:

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

    输出应该类似于以下示例输出,它显示了与原始 PVC 相同的内容,并包括在原始 PVC 中创建的 test.txt 文件:

    lost+found
    outfile
    test.txt
    

使用 Azure 磁盘在不中断的情况下调整持久性卷的大小

注释

目前不支持收缩永久性卷。 尝试修改尺寸比当前大小更小的现有 PVC 会出现以下错误消息:

The persistentVolumeClaim "pvc-azuredisk" is invalid: spec.resources.requests.storage: Forbidden: field can not be less than previous value.

可以通过编辑 PVC 对象来请求更大的卷,指定更大的大小。 此项更改会触发为 PV 提供支持的基础卷的扩展。 永远不会创建新的 PV 来满足声明, 而是会调整现有卷的大小。

在 AKS 中,内置 managed-csi 存储类已经支持扩展,因此可以使用本教程前面创建的动态 PVC。 PVC 请求 10 GiB 永久性存储卷。

  1. 使用 kubectl exec 命令检查卷的当前大小,然后在 Pod 中执行 df -h 命令:

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

    输出应类似于以下示例输出,其中显示卷的当前大小为 10 Gi:

    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sdc        9.8G   42M  9.8G   1% /mnt/azuredisk
    
  2. 使用spec.resources.requests.storage命令增加kubectl patch字段,展开PVC。 在此示例中,我们将 PVC 的大小增加到 15 Gi:

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

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

    persistentvolumeclaim/pvc-azuredisk patched
    
  3. 使用 kubectl get pv 命令检查 PV,以确认新大小是否已在 PV 中反映。

    kubectl get pv
    

    输出应类似于以下示例输出,其中显示 PV 的大小已调整为 15 Gi:

    NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                     STORAGECLASS   REASON   AGE
    pvc-a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1   15Gi       RWO            Delete           Bound    default/pvc-azuredisk                     managed-csi             2d2h
    (...)
    
  4. 几分钟后,使用命令 kubectl get pvc 检查 PVC,确认新大小已反映在 PVC 中。

    kubectl get pvc pvc-azuredisk
    

    输出应类似于以下示例输出,显示 PVC 的大小已调整为 15 Gi:

    NAME            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    pvc-azuredisk   Bound    pvc-a0a0a0a0-bbbb-cccc-dddd-e1e1e1e1e1e1   15Gi       RWO            managed-csi    2d2h
    
  5. 在 Pod 中执行kubectl exec命令来运行df -h命令,确认磁盘大小已更新为新大小。

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

    输出应类似于以下示例输出,其中显示卷的大小已更新为 15 Gi:

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

使用 Azure 高级 SSD 的按需扩展功能

按需磁盘突发模型允许在磁盘需求超过当前容量时进行突发。 每当磁盘突发时,此模型会产生额外的费用。 按需突发仅适用于大于 512 GiB 的高级 SSD。 有关每个磁盘预配的高级 SSD IOPS 和吞吐量的详细信息,请参阅 高级 SSD 大小。 或者,基于信用额度的突发是指磁盘只有在其信用桶中累积了突发信用时才会突发。 磁盘突发时,基于信用的突发机制不会产生额外的费用。 基于信用的突发仅适用于高级的 SSD,512 GiB 及更小,以及标准的 SSD,1024 GiB 及更小。 有关按需突发的详细信息,请参阅 按需突发

重要

默认的 managed-csi-premium storage class 已禁用按需突发功能,并使用基于信用的突发模式。 基于默认 managed-csi-premium 存储类的持久性卷声明所动态创建的任何高级 SSD 也会禁用按需突发功能。

若要创建启用了 按需突发 的高级别 SSD 持久性卷,可以按照以下 YAML 模板创建一个新的存储类,并设置 enableBursting 参数为 true。 有关启用按需突发的更多信息,请参阅 按需突发。 有关构建支持按需突发的自定义存储类的详细信息,请参阅 创建可突发托管 CSI Premium 存储类

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

将 Azure 磁盘与 Windows 容器配合使用

Azure 磁盘 CSI 驱动程序支持 Windows 节点和容器。 若要使用 Windows 容器,请按照 Windows 容器快速入门 添加 Windows 节点池。 拥有 Windows 节点池后,可以使用内置的存储类,例如 managed-csi

  1. 使用以下命令部署一个基于 Windows 的有状态集,将时间戳保存到文件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
    
  2. 请使用 data.txt 命令在 pod 中执行 kubectl exec 命令以验证文件 type 的内容:

    kubectl exec -it statefulset-azuredisk-win-0 -- powershell -c "type c:/mnt/azuredisk/data.txt"
    

    输出应类似于以下示例输出,其中显示了正在保存到文件中 data.txt的时间戳:

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

使用 Azure 磁盘创建静态 PV

以下部分提供了有关使用 Azure 磁盘创建静态 PV 的说明。 静态 PV 是管理员手动创建的持久卷。 此 PV 可供集群中的 Pods 使用。 若要使用静态 PV,请创建引用 PV 的 PVC,然后创建引用 PVC 的 Pod。

使用 Azure 磁盘的静态 PV 的存储类参数

下表包含可用于使用 Azure 磁盘为静态 PVC 定义自定义存储类的参数:

名称 含义 可用值 必需 默认值
volumeHandle Azure 磁盘 URI /subscriptions/{sub-id}/resourcegroups/{group-name}/providers/microsoft.compute/disks/{disk-id} 是的 不适用
volumeAttributes.fsType 文件系统类型 ext4ext3ext2xfsbtrfs适用于 Linux
ntfs 适用于 Windows
ext4 适用于 Linux
ntfs 适用于 Windows
volumeAttributes.partition 现有磁盘的分区号(仅在 Linux 上受支持) 123 空(无分区)确保分区格式为: -part1
volumeAttributes.cachingMode 磁盘主机缓存设置 NoneReadOnlyReadWrite ReadOnly

创建 Azure 磁盘

创建用于 AKS 的 Azure 磁盘时,可以在节点资源组中创建磁盘资源。 此方法允许 AKS 集群访问和管理磁盘资源。 如果您改为在单独的资源组中创建磁盘,则必须为群集的 AKS 托管标识授予该磁盘资源组的 Contributor 角色。

  1. 使用az aks show 命令和参数 --query nodeResourceGroup 来标识节点资源组名称。

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

    输出应类似于以下示例输出,其中显示了 AKS 群集的节点资源组名称:

    MC_myResourceGroup_myAKSCluster_eastus
    
  2. 使用 az disk create 命令创建磁盘。 指定节点资源组名称和磁盘资源名称,例如 myAKSDisk。 以下示例创建 20 GiB 磁盘,并在创建磁盘后输出磁盘的 ID。 如果需要创建与 Windows Server 容器一起使用的磁盘,请添加 --os-type windows 参数以正确格式化该磁盘。

    az disk create \
      --resource-group MC_myResourceGroup_myAKSCluster_eastus \
      --name myAKSDisk \
      --size-gb 20 \
      --query id --output tsv
    

    注释

    Azure 磁盘依据特定大小的 SKU 收取费用。 这些 SKU 的范围从 S4 或 P4 磁盘的 32 GiB 到 S80 或 P80 磁盘的 32 TiB(预览版)。 高级托管磁盘的吞吐量和 IOPS 性能取决于 SKU 和 AKS 群集中节点的实例大小。 请参阅 托管磁盘的定价和性能

    输出应类似于以下示例输出,其中显示了已创建的磁盘的资源 ID:

    /subscriptions/<subscriptionID>/resourceGroups/MC_myAKSCluster_myAKSCluster_eastus/providers/Microsoft.Compute/disks/myAKSDisk
    

创建引用 Azure 磁盘的 PV 和 PVC

  1. 使用以下示例清单创建一个包含 PV 的 pv-azuredisk.yaml 文件。 使用上一步骤中的磁盘资源 ID 更新 volumeHandle。 对于 Windows Server 容器,请为参数指定 fsType

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      annotations:
        pv.kubernetes.io/provisioned-by: disk.csi.azure.com
      name: pv-azuredisk
    spec:
      capacity:
        storage: 20Gi
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Retain
      storageClassName: managed-csi
      csi:
        driver: disk.csi.azure.com
        volumeHandle: /subscriptions/<subscriptionID>/resourceGroups/MC_myAKSCluster_myAKSCluster_eastus/providers/Microsoft.Compute/disks/myAKSDisk
        volumeAttributes:
          fsType: ext4
    

    如“ 创建 Azure 磁盘”中所述,如果在单独的资源组中创建了该 volumeHandle 磁盘,则需要向 AKS 群集的托管标识 Contributor 授予磁盘资源组的角色。

  2. 使用以下示例清单创建一个包含使用 PV 的 PVC 的 pvc-azuredisk.yaml 文件:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-azuredisk
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi
      volumeName: pv-azuredisk
      storageClassName: managed-csi
    
  3. 使用 kubectl apply 以下命令创建 PV 和 PVC:

    kubectl apply -f pv-azuredisk.yaml
    kubectl apply -f pvc-azuredisk.yaml
    
  4. 通过 kubectl get pvc 命令验证 PVC 是否已成功创建并绑定到 PV。

    kubectl get pvc pvc-azuredisk
    

    输出应类似于以下示例输出,其中显示了 PVC 处于 绑定 状态:

    NAME            STATUS   VOLUME         CAPACITY    ACCESS MODES   STORAGECLASS   AGE
    pvc-azuredisk   Bound    pv-azuredisk   20Gi        RWO                           5s
    

创建将 PVC 与 Azure 磁盘配合使用的 Pod

  1. 使用以下示例清单创建 azure-disk-pod.yaml 文件来引用您的 PVC。 (对于 Windows Server 容器,请使用 Windows 路径约定指定 mountPath ,如 “D:”)。

    apiVersion: v1
    kind: Pod
    metadata:
      name: mypod
    spec:
      nodeSelector:
        kubernetes.io/os: linux
      containers:
      - image: mcr.azk8s.cn/oss/nginx/nginx:1.15.5-alpine
        name: mypod
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 250m
            memory: 256Mi
        volumeMounts:
          - name: azure
            mountPath: /mnt/azure
      volumes:
        - name: azure
          persistentVolumeClaim:
            claimName: pvc-azuredisk
    
  2. 使用 kubectl apply 命令应用配置并装载卷。

    kubectl apply -f azure-disk-pod.yaml
    

清理资源

  • 使用以下 [kubectl delete][kubectl-delete] 命令删除在本教程中创建的资源:

    # Remove the pod
    kubectl delete -f azure-pvc-disk.yaml
    
    # Remove the persistent volume claim
    kubectl delete -f azure-pvc.yaml