使用云盘动态存储卷

更新时间:2025-03-25 06:40:40

云盘存储卷适用于非共享数据,I/O和延迟要求较高的应用场景。如果您之前没有云盘,您可以通过动态存储卷的方式实现自动创建云盘并挂载到Pod上,以此满足持久化存储需求。本文介绍如何使用云盘动态存储卷,并验证云盘的持久化存储。

使用场景

云盘适用于以下存储场景:

  • 对磁盘I/O要求高的应用,且没有共享数据的需求,如MySQL、Redis等数据存储服务。

  • 高速写日志。

  • 持久化存储数据,不会因Pod生命周期的结束而消失。

除了基于已有云盘创建静态存储卷外,您也可以使用StorageClass(存储类)来定义云盘资源,实现动态创建和分配存储资源。通过在PVC(存储声明)中关联StorageClass,系统会自动根据配置创建并绑定PV(存储卷)。该方式无需预先手动创建和配置存储资源,可以降低底层基础设施的复杂性,让您更关注应用的存储需求。

前提条件

集群中已安装CSI组件。

说明
  • 您可以在集群管理页的左侧导航栏选择运维管理 > 组件管理,在存储页签下确认csi-plugincsi-provisioner组件的安装情况。如需升级CSI组件来享受某些特定能力,请参见升级csi-plugincsi-provisioner

  • 如果您的集群目前使用Flexvolume组件,由于Flexvolume已废弃,请先迁移到CSI组件。具体操作,请参见迁移FlexvolumeCSI

注意事项

  • 云盘为非共享存储,未开启多重挂载的云盘只能同时被一个Pod挂载。关于多重挂载更多信息,请参见使用NVMe云盘多重挂载及Reservation

  • 云盘只能挂载到相同可用区的Pod上,不支持跨可用区挂载。

  • Pod重建时会重新挂载原有云盘,如果由于其他限制导致Pod无法调度到原可用区,则Pod会因为无法挂载云盘而一直处于Pending状态。

  • 推荐使用StatefulSet挂载云盘或者单独为Pod挂载云盘,不推荐使用Deployment。

    说明

    未开启多重挂载时,一个云盘只能挂载到一个Pod上,为Deployment挂载云盘时,Replica必须配置为1,即无法为每个Pod配置独立的存储卷,并且不能保证挂载、卸载的优先顺序。此外,由于Deployment的升级策略,重启Pod时,新的Pod可能会一直无法挂载云盘。因此不推荐为Deployment挂载云盘。

  • 使用云盘存储卷时,如果在应用的YAML中配置了securityContext.fsgroup,在挂载完成后,kubelet会执行chmodchown操作,导致挂载时间延长。

    说明

    配置了securityContext.fsgroup后,挂载云盘时会自动调整卷内文件的所有者,根据文件数量,这可能导致较长的准备时间。对于1.20及以上版本的Kubernetes集群,您可以将fsGroupChangePolicy配置为OnRootMismatch,实现仅在首次启动容器时才会调整文件的所有者,后续Pod升级或重建等场景下,挂载时长会恢复正常。若仍不能满足需求,建议利用initContainer自行实现调整权限相关操作。

StorageClass说明

存储类(StorageClass)用于定义存储的类别,您可以为其设置不同的参数,使存储资源能够根据需求自动供应和调整。更多信息,请参见存储基础知识

安装CSI组件后,ACK会提供云盘相关的StorageClass供您使用。如果默认提供的StorageClass无法满足您的需求,您可以手动创建新的StorageClass。

  • StorageClass不支持修改属性,只能新建。您可以通过控制台或者kubectl describe sc <storageclass-name>命令查看各个StorageClass的详细配置。关于各参数的说明,请参见StorageClass相关参数说明

  • 对于云盒用户,由于云盒内的ESSD云盘仅支持PL0级别,因此需要指定其performanceLevel参数值为PL0。由于默认提供的StorageClass创建的是PL1级别的ESSD云盘,因此无法直接使用,您需要手动创建新的StorageClass。

  • SSD云盘、高效云盘和普通云盘属于上一代云盘产品,已在部分地域及可用区逐步停止售卖。您在选择云盘时,建议选用ESSD PL0云盘或ESSD Entry云盘替换高效云盘和普通云盘,选用ESSD AutoPL云盘替换SSD云盘。

默认提供的StorageClass名称

动态创建的云盘类型

默认提供的StorageClass名称

动态创建的云盘类型

alicloud-disk-topology-alltype

高可用配置。系统会根据待挂载Pod调度到的ECS节点的可用区和实例规格,结合云盘库存,按照ESSD云盘、SSD云盘、高效云盘的顺序依次尝试创建。

重要

StorageClass已配置volumeBindingMode: WaitForFirstConsumer,表示先调度Pod再创建云盘,可以保证云盘和节点处于同一可用区,避免因可用区不一致而挂载失败的问题。

alicloud-disk-essd

创建ESSD云盘。PL等级默认为PL1。

alicloud-disk-ssd

创建SSD云盘。

alicloud-disk-efficiency

创建高效云盘。

基于StorageClass动态创建的云盘采用按量付费。

挂载云盘动态存储卷(kubectl

步骤一:创建StorageClass

如果默认提供的StorageClass无法满足您的需求,您可以手动创建新的StorageClass。StorageClass不支持修改属性,只能新建。

重要

云盘不支持跨可用区挂载,并且某些类型的云盘不支持挂载到某些规格的ECS实例。因此挂载云盘时,需要确保待挂载云盘的Pod所调度到的ECS节点的可用区和规格能够和动态创建的云盘相匹配。关于云盘类型和ECS实例规格的匹配关系,请参见实例规格族

  1. 连接集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群CloudShell上通过kubectl管理Kubernetes集群

  2. 修改以下YAML内容,并保存为disk-sc.yaml。

    说明

    在多可用区场景下,建议采用延迟绑定的方式,以此优化因云盘和ECS节点不在一个可用区导致挂载失败的问题。

    先调度Pod再创建云盘(延迟绑定)
    先创建云盘再创建Pod
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: alicloud-disk-wait-for-first-consumer
    provisioner: diskplugin.csi.alibabacloud.com
    parameters:
      type: cloud_auto,cloud_essd,cloud_ssd # 使用该配置,按优先级自适应选择云盘类型,最终创建的云盘类型受节点实例、所在可用区云盘支持情况等因素影响。
      fstype: ext4
      diskTags: "a:b,b:c"
      encrypted: "false"
      performanceLevel: PL1  # 通过云盒使用时,需设置为PL0。
      provisionedIops: "40000"
      burstingEnabled: "false"
    volumeBindingMode: WaitForFirstConsumer
    reclaimPolicy: Retain
    allowVolumeExpansion: true
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: alicloud-disk-immediate
    provisioner: diskplugin.csi.alibabacloud.com
    parameters:
      type: cloud_essd,cloud_ssd,cloud_efficiency #使用该配置,按优先级自适应选择云盘类型,最终创建的云盘类型受节点实例、所在可用区云盘支持情况等因素影响
      regionId: cn-beijing
      zoneId: cn-beijing-b
      encrypted: "false"
    reclaimPolicy: Retain
    allowVolumeExpansion: true
    volumeBindingMode: Immediate

    StorageClass的相关参数说明如下:

    参数

    说明

    参数

    说明

    name

    StorageClass的名称。名称必须以小写字母开头,只能包含小写字母、数字、小数点(.)和短划线(-)。

    provisioner

    驱动类型。此处配置为diskplugin.csi.alibabacloud.com,表示使用阿里云云盘CSI插件。

    parameters

    必须配置的参数为type,表示云盘类型。支持设置的参数值如下:

    • cloud_auto:ESSD AutoPL云盘

    • cloud_essd(默认值):ESSD云盘

    • cloud_essd_entry:ESSD Entry云盘

    • cloud_ssd:SSD云盘

    • cloud_efficiency:高效云盘

    • elastic_ephemeral_disk_standard: 标准版弹性临时盘

    • elastic_ephemeral_disk_premium: 高级版弹性临时盘

    • cloud_regional_disk_auto: ESSD同城冗余云盘

    支持任意组合上述参数,例如:type: cloud_ssd,cloud_essd,cloud_auto,此时将按照配置顺序依次尝试创建指定类型的云盘,直到创建成功。

    重要

    您可以基于节点可用区和实例规格,结合云盘计费、性能等选择合适的云盘类型。相关参考如下:

    可按需添加以下可选参数,定义更多关于自动创建云盘的配置。

    • resourceGroupId:云盘的资源组。默认为""

    • regionId:云盘所在的地域,与集群的地域相同。

    • zoneId:云盘所在的可用区。

      • 单可用区集群,与集群所在可用区相同。

      • 多可用区集群,可同时配置多个可用区,例如cn-beijing-a,cn-beijing-b

    • fstype:云盘所使用的文件系统,取值ext4xfs,默认为ext4

    • mkfsOptions:云盘格式化参数。例如mkfsOptions: "-O project,quota"

    • diskTags:云盘标签。例如diskTags: "a:b,b:c",也可以使用diskTags/a: b的格式指定(CSI组件版本≥v1.30.3)。

    • encrypted:云盘是否加密。默认为false,创建的云盘不加密。

    • performanceLevel:ESSD云盘的性能级别,取值PL0PL1PL2PL3。默认值为PL1。更多信息,请参见容量范围与性能级别的关系

      说明

      通过云盒使用时,由于云盒内的ESSD云盘仅支持PL0级别,因此必须设置为PL0

    • volumeExpandAutoSnapshot:该参数自CSI组件的1.31.4版本起已废弃使用。

    • provisionedIops:云盘的预配置性能(IOPS)。仅ESSD AutoPL云盘支持配置。取值范围为0~min{50,000, 1000×容量-基准性能},基准性能=min{1,800+50×容量, 50000}

    • burstingEnabled:是否开启Burst(性能突发)。仅ESSD AutoPL云盘支持配置。默认为false,表示不开启。

    • multiAttach:是否开启多重挂载。默认为false,表示不开启。更多信息,请参见云盘多重挂载功能

    volumeBindingMode

    云盘的绑定模式。默认为Immediate,支持WaitForFirstConsumer

    • Immediate:表示先创建云盘再创建Pod。

    • WaitForFirstConsumer:延迟绑定,即调度器先调度Pod,并根据Pod的可用区信息创建云盘。

    根据绑定模式的配置,可用区选择规则如下:

    • 绑定模式为WaitForFirstConsumer时,则选择首个使用PVCPod所在可用区为创建云盘的可用区。

    • 绑定模式为Immediate时,如果zoneId配置为单个可用区,则选择此可用区作为创建云盘的可用区;如果zoneId配置为多个可用区,则每次选择轮询配置的多个可用区中的一个作为创建云盘的可用区。

    说明

    如果是多可用区集群,建议使用WaitForFirstConsumer。更多信息,请参见云盘存储卷的高可用配置建议

    reclaimPolicy

    云盘的回收策略,默认为Delete,支持Retain

    • Delete:删除PVC时,PV和云盘会一起删除。

    • Retain:删除PVC时,PV和云盘数据不会被删除,需要您手动删除。

    如果数据安全性要求高,推荐使用Retain方式以免误删数据。

    allowVolumeExpansion

    配置为true时,表示允许云盘扩容。

  3. 创建StorageClass。

    kubectl create -f disk-sc.yaml
  4. 查看StorageClass。

    kubectl get sc

    预期返回:

    NAME                                    PROVISIONER                       RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
    alicloud-disk-efficiency                diskplugin.csi.alibabacloud.com   Delete          Immediate              true                   158m
    alicloud-disk-essd                      diskplugin.csi.alibabacloud.com   Delete          Immediate              true                   158m
    alicloud-disk-ssd                       diskplugin.csi.alibabacloud.com   Delete          Immediate              true                   158m
    alicloud-disk-topology-alltype          diskplugin.csi.alibabacloud.com   Delete          WaitForFirstConsumer   true                   158m
    alicloud-disk-wait-for-first-consumer   diskplugin.csi.alibabacloud.com   Retain          WaitForFirstConsumer   true                   10s

步骤二:创建PVC

  1. 将以下YAML内容保存为disk-pvc.yaml。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: disk-pvc
    spec:
      accessModes:
      - ReadWriteOnce
      volumeMode: Filesystem
      resources:
        requests:
          storage: 20Gi
      storageClassName: alicloud-disk-wait-for-first-consumer  # 以使用延迟绑定的storageClass为例。

    相关参数说明如下:

    参数

    说明

    参数

    说明

    accessModes

    存储卷的访问模式。具体请参见Volume访问模式

    可配置为ReadWriteOnceReadOnlyManyReadWriteMany,具体取决于StorageClass中的multiAttach配置以及PVC中的volumeMode配置。

    • multiAttachfalse时,volumeMode配置为任意值,访问模式仅支持ReadWriteOnce

    • multiAttachtruevolumeModeFilesystem时,访问模式仅支持ReadWriteOnceReadOnlyMany

    • multiAttachtruevolumeModeBlock时,三种访问模式均支持。

    说明

    multiAttach表示是否开启多重挂载。默认为false,表示不开启。更多信息,请参见云盘多重挂载功能

    volumeMode

    存储卷的模式。取值范围:

    • Filesystem(默认):文件系统

    • Block:块

    storage

    分配给Pod的存储容量,即要创建的云盘容量大小。

    说明

    各类型云盘支持的容量范围请参见块存储性能

    storageClassName

    要绑定的StorageClass名称。

  2. 创建PVC。

    kubectl create -f disk-pvc.yaml
  3. 查看PVC。

    kubectl get pvc

    预期返回如下,由于采用延迟绑定的方式,因此此时不会创建PV,PVC会处于Pending状态。

    NAME       STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS                            VOLUMEATTRIBUTESCLASS   AGE
    disk-pvc   Pending                                      alicloud-disk-wait-for-first-consumer   <unset>                 14s

步骤三:创建应用并挂载云盘

  1. 使用以下YAML内容,创建disk-test.yaml文件。

    以下YAML示例可以创建包含1PodStatefulSet,Pod通过名为disk-pvcPVC申请存储资源,挂载路径为/data

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: disk-test
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80
            volumeMounts:
            - name: pvc-disk
              mountPath: /data
          volumes:
            - name: pvc-disk
              persistentVolumeClaim:
                claimName: disk-pvc
  2. 创建StatefulSet并挂载云盘。

    kubectl create -f disk-test.yaml
  3. 查看StatefulSetPod的部署情况。

    kubectl get pod -l app=nginx

    预期返回如下,示例使用的StatefulSet副本数为1,因此创建了一个Pod。

    NAME          READY   STATUS    RESTARTS   AGE
    disk-test-0   1/1     Running   0          14s
  4. 查看挂载路径,确认已挂载云盘。

    kubectl exec disk-test-0 -- df -h /data

    预期返回:

    Filesystem      Size  Used Avail Use% Mounted on
    /dev/vdb         20G   24K   20G   1% /data

挂载云盘动态存储卷(控制台)

步骤一:创建存储类(StorageClass)

如果默认提供的StorageClass无法满足您的需求,您可以手动创建新的StorageClass。StorageClass不支持修改属性,只能新建。

重要

云盘不支持跨可用区挂载,并且某些类型的云盘不支持挂载到某些规格的ECS实例。因此挂载云盘时,需要确保待挂载云盘的Pod所调度到的ECS节点的可用区和规格能够和动态创建的云盘相匹配。关于云盘类型和ECS实例规格的匹配关系,请参见实例规格族

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择存储 > 存储类

  3. 存储类页面,单击创建

  4. 在弹出的对话框中,完成参数配置,然后单击创建

    参数

    描述

    示例

    参数

    描述

    示例

    名称

    StorageClass名称,自定义输入。格式要求请参考界面提示。

    alicloud-disk-wait-for-first-consumer

    存储卷类型

    选择云盘

    云盘

    参数

    默认参数为type,表示云盘类型。支持设置的参数值如下:

    • cloud_auto:ESSD AutoPL云盘

    • cloud_essd(默认值):ESSD云盘

    • cloud_essd_entry:ESSD Entry云盘

    • cloud_ssd:SSD云盘

    • cloud_efficiency:高效云盘

    • elastic_ephemeral_disk_standard: 标准版弹性临时盘

    • elastic_ephemeral_disk_premium: 高级版弹性临时盘

    • cloud_regional_disk_auto: ESSD同城冗余云盘

    支持任意组合上述参数,例如:type: cloud_ssd,cloud_essd,cloud_auto,此时将按照配置顺序依次尝试创建指定类型的云盘,直到创建成功。

    重要

    您可以基于节点可用区和实例规格,结合云盘计费、性能等选择合适的云盘类型。相关参考如下:

    可按需添加以下可选参数,定义更多关于自动创建云盘的配置。

    • resourceGroupId:云盘的资源组。默认为""

    • regionId:云盘所在的地域,与集群的地域相同。

    • zoneId:云盘所在的可用区。

      • 单可用区集群,与集群所在可用区相同。

      • 多可用区集群,可同时配置多个可用区,例如cn-beijing-a,cn-beijing-b

    • fstype:云盘所使用的文件系统,取值ext4xfs,默认为ext4

    • mkfsOptions:云盘格式化参数。例如mkfsOptions: "-O project,quota"

    • diskTags:云盘标签。例如diskTags: "a:b,b:c",也可以使用diskTags/a: b的格式指定(CSI组件版本≥v1.30.3)。

    • encrypted:云盘是否加密。默认为false,创建的云盘不加密。

    • performanceLevel:ESSD云盘的性能级别,取值PL0PL1PL2PL3。默认值为PL1。更多信息,请参见容量范围与性能级别的关系

      说明

      通过云盒使用时,由于云盒内的ESSD云盘仅支持PL0级别,因此必须设置为PL0

    • volumeExpandAutoSnapshot:该参数自CSI组件的1.31.4版本起已废弃使用。

    • provisionedIops:云盘的预配置性能(IOPS)。仅ESSD AutoPL云盘支持配置。取值范围为0~min{50,000, 1000×容量-基准性能},基准性能=min{1,800+50×容量, 50000}

    • burstingEnabled:是否开启Burst(性能突发)。仅ESSD AutoPL云盘支持配置。默认为false,表示不开启。

    • multiAttach:是否开启多重挂载。默认为false,表示不开启。更多信息,请参见云盘多重挂载功能

    type:cloud_auto,cloud_essd,cloud_ssd

    回收策略

    云盘的回收策略,默认为Delete,支持Retain

    • Delete:删除PVC时,PV和云盘会一起删除。

    • Retain:删除PVC时,PV和云盘数据不会被删除,需要您手动删除。

    如果数据安全性要求高,推荐使用Retain方式以免误删数据。

    Retain

    绑定模式

    云盘的绑定模式。默认为Immediate,支持WaitForFirstConsumer

    • Immediate:表示先创建云盘再创建Pod。

    • WaitForFirstConsumer:延迟绑定,即调度器先调度Pod,并根据Pod的可用区信息创建云盘。

    根据绑定模式的配置,可用区选择规则如下:

    • 绑定模式为WaitForFirstConsumer时,则选择首个使用PVCPod所在可用区为创建云盘的可用区。

    • 绑定模式为Immediate时,如果zoneId配置为单个可用区,则选择此可用区作为创建云盘的可用区;如果zoneId配置为多个可用区,则每次选择轮询配置的多个可用区中的一个作为创建云盘的可用区。

    说明

    如果是多可用区集群,建议使用WaitForFirstConsumer。更多信息,请参见云盘存储卷的高可用配置建议

    WaitForFirstConsumer

    创建完成后,在存储类页面可以看到新创建的StorageClass。

步骤二:创建存储声明(PVC)

  1. 在集群管理页左侧导航栏,选择存储 > 存储声明

  2. 存储声明页面,单击创建

  3. 在弹出的对话框中,完成参数配置,然后单击创建

    参数

    描述

    示例

    参数

    描述

    示例

    存储声明类型

    选择云盘

    云盘

    名称

    PVC名称,自定义输入。格式要求请参考界面提示。

    diks-pvc

    分配模式

    选择使用存储类动态创建

    使用存储类动态创建

    已有存储类

    选择要绑定的StorageClass。

    alicloud-disk-topology-alltype

    总量

    分配给Pod的存储容量,即要创建的云盘的容量大小。

    说明

    各类型云盘支持的容量范围请参见块存储性能

    20Gi

    访问模式

    仅支持ReadWriteOnce,表示卷只能被一个Pod以读写方式挂载。

    ReadWriteOnce

    创建完成后,在存储声明页面可以看到新创建的PVC。

步骤三:创建应用并挂载云盘

  1. 在集群管理页左侧导航栏,选择工作负载 > 有状态

  2. 有状态页面,单击使用镜像创建

  3. 完成StatefulSet的参数配置,单击创建

    需要注意的参数如下,其他参数按需设置。更多信息,请参见创建有状态工作负载StatefulSet

    配置页

    参数

    描述

    示例

    配置页

    参数

    描述

    示例

    应用基本信息

    应用名称

    StatefulSet名称,自定义输入。格式要求请参考界面提示。

    disk-test

    副本数量

    配置StatefulSet的副本数量。

    1

    容器配置

    镜像名称

    输入用于部署应用的镜像地址。

    anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6

    所需资源

    设置所需的vCPU、内存和临时存储资源。

    • CPU:0.25 Core

    • 内存:512 MiB

    • Ephemeral-Storage:不设置

    数据卷

    单击增加云存储声明,然后完成参数配置。

    • 挂载源:选择步骤二创建的PVC。

    • 容器路径:输入云盘要挂载到的容器路径。

    • 挂载源:disk-pvc

    • 容器路径:/data

  4. 查看应用部署情况。

    1. 有状态页面,单击应用名称。

    2. 容器组页签下,确认Pod已正常运行(状态为Running)。

验证云盘的持久化存储(kubectl)

按照上文示例创建的StatefulSet中含有1Pod,该Pod挂载了一个云盘。当该Pod被删除时,自动创建的新Pod将重新挂载之前的云盘,云盘中的数据仍然保留。您可以通过以下方式验证云盘的持久化存储。

  1. 查看挂载路径,即查看云盘中的数据。

    kubectl exec disk-test-0 -- ls /data

    预期返回:

    lost+found
  2. 在云盘中写入文件。

    kubectl exec disk-test-0 -- touch /data/test
  3. 删除Pod。

    kubectl delete pod disk-test-0
    说明

    删除StatefulSet中的Pod后,系统会自动创建一个新的Pod。

  4. 查看新创建的Pod。

    kubectl get pod -l app=nginx

    预期返回如下,由于StatefulSet的命名特性,新创建的Pod和之前的Pod名称一致。

    NAME          READY   STATUS    RESTARTS   AGE
    disk-test-0   1/1     Running   0          27s
  5. 确认新创建的Pod已重新挂载云盘,云盘中的数据仍然存在。

    kubectl exec disk-test-0 -- ls /data

    预期返回如下,可以看到云盘中存在之前写入的test文件。

    lost+found  
    test

相关文档

  • 本页导读 (1)
  • 使用场景
  • 前提条件
  • 注意事项
  • StorageClass说明
  • 挂载云盘动态存储卷(kubectl)
  • 步骤一:创建StorageClass
  • 步骤二:创建PVC
  • 步骤三:创建应用并挂载云盘
  • 挂载云盘动态存储卷(控制台)
  • 步骤一:创建存储类(StorageClass)
  • 步骤二:创建存储声明(PVC)
  • 步骤三:创建应用并挂载云盘
  • 验证云盘的持久化存储(kubectl)
  • 相关文档