实现云盘动态预留持久化存储卷资源

除静态存储外,您也可以创建PVC并配置StorageClass来实现存储资源的动态分配,让系统为您自动预留持久化存储卷。您可以更关注集群应用的存储需求,无需预先手动创建和配置存储资源,降低底层基础设施的复杂性。

使用限制

  • 云盘不支持跨可用区使用。

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

  • 云盘类型和ECS类型需要匹配才可以挂载,否则会导致Pod无法启动。关于云盘类型和ECS类型的匹配关系,请参见实例规格族

    重要

    当您将集群中的ECS实例从按量付费转换成包年包月时,不能将云盘一起变成包年包月,否则云盘将无法被挂载使用。您可以通过购买SCU的方式降低成本。关于SCU的更多信息,请参见存储容量单位包SCU概述

前提条件

重要
  • 如果您的集群中包含CentOS 7.9镜像(或其他运行小于4.9版本Linux内核)的宿主机,并且在集群中使用了XFS文件系统(fstype参数设置为xfs)的存储卷,请勿将CSI组件升级到v1.24.7及以上的版本。因为旧版内核与新版本组件不兼容。如果误升级,挂载XFS文件系统的存储卷的Pod将可能无法启动,对其他文件系统无影响,请提交工单处理。

  • 如需将CSI组件升级至v1.26.4版本,您需要将CSI provisioner和CSI plugin同时升级至该版本。

使用说明

  • 在应用部署时,通过StorageClass自动创建PV购买云盘。如果您已经购买云盘,推荐使用云盘静态存储卷

  • 申请云盘的大小,不能超出云盘的单盘容量范围。更多信息,请参见存储规格

  • 当Pod重建时,会重新挂载原云盘。若由于其他限制无法调度到原可用区,则Pod将会处于Pending状态。

  • 动态创建的云盘为按量付费的云盘,关于云盘计费项信息,请参见块存储计费。关于云盘的价格信息,请参见详细定价

您可以通过控制台创建StorageClass和PVC并创建应用,也可以通过kubectl完成此操作。

通过控制台使用云盘动态存储卷

步骤一:创建StorageClass

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

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

  3. 存储类页面,单击右上角的创建

  4. 创建对话框,配置存储类StorageClass的相关参数。

    主要配置项说明如下。

    配置项

    说明

    名称

    StorageClass的名称。

    存储卷类型

    可选择云盘NAS。本示例选择云盘

    参数

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

    • 高效云盘cloud_efficiency

    • ESSD AutoPLcloud_auto

    • SSD云盘cloud_ssd

    • ESSD云盘cloud_essd

    • ESSD Entrycloud_essd_entry

    以上参数可任意组合。例如type: cloud_efficiency, cloud_ssd, cloud_essd,此配置方式会支持对指定类型的云盘依次创建,直到创建成功。

    说明

    不同ECS机型支持的云盘类型不同。更多信息,请参见块存储FAQ

    单击添加,可设置自定义参数。支持自定义参数如下:

    • resourceGroupId:可选,定义云盘的资源组。默认为""

    • regionId:可选,自动创建云盘所在的地域,与集群的地域相同。

    • zoneId:可选,自动创建云盘所在的区域。

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

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

    • fstype:可选,自动创建云盘所使用的文件系统,取值ext4xfs,默认为ext4

    • mkfsOptions:可选,云盘格式化所用的参数。例如mkfsOptions: "-O project,quota"

    • diskTags:可选,自定义云盘标签。例如diskTags: "a:b,b:c"。也可以使用diskTags/a: b 的格式指定(v1.30.3起)。

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

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

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

    • provisionedIops:可选,云盘的预配置性能(IOPS)。

      可能值:0~min{50,000, 1000×容量-基准性能}。

      基准性能=min{1,800+50×容量, 50000}。

      说明

      该参数仅支持ESSD AutoPL云盘。更多信息,请参见ESSD AutoPL云盘规格

    • burstingEnabled:可选,是否开启Burst(性能突发)。默认为false。

      • true:开启。

      • false:不开启。

      说明

      该参数仅支持ESSD AutoPL云盘。更多信息,请参见ESSD AutoPL云盘规格

    • multiAttach:可选,设置为true以开启多实例挂载,请参见云盘多重挂载功能

    回收策略

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

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

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

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

    绑定模式

    云盘的绑定模式。默认为Immediate

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

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

  5. 参数配置完成后,单击创建

    创建成功后,您可在存储类列表查看创建的StorageClass。

步骤二:创建PVC

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

  2. 存储声明页面,单击右上角的创建

  3. 创建存储声明对话框,配置PVC参数。

    配置项

    说明

    存储声明类型

    支持云盘、NAS、OSS三种云存储类型。本示例选择云盘。

    名称

    创建的存储声明名称在命名空间内必须唯一。

    分配模式

    本示例选择使用存储类动态创建,即支持通过StorageClass动态创建PV。

    已有存储类

    选择已有的StorageClass,用于动态创建PV。

    总量

    所创建存储卷的容量。

    访问模式

    仅能使用ReadWriteOnce。更多选项请参见通过kubectl命令行使用云盘动态存储卷

  4. 单击创建

    创建成功后,在存储声明列表中可看到创建的存储声明,并且已绑定相应的存储卷。

步骤三:创建应用

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

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

  3. 配置创建应用的参数信息。

    以下主要为您介绍数据卷的配置。关于其他参数的描述,请参见创建有状态工作负载StatefulSet

  4. ACK数据卷支持配置本地存储和云存储,本示例需要配置云存储类型。配置了一个云盘类型的数据卷,将该云盘挂载到容器的/tmp路径下,在该路径下生成的容器数据会存储到云盘中。数据卷

  5. 所有的信息都配置完成后,单击创建

    创建成功后,您就可以正常使用数据卷。

通过kubectl命令行使用云盘动态存储卷

步骤一:创建StorageClass

在多可用区集群场景下,您可以根据不同的场景通过以下两种方式创建StorageClass。

使用Topology(延迟绑定)的方式

延迟绑定可以优化ECS和云盘不在一个可用区的问题。下文以部署名为storage-class-csi-wffc.yaml文件为例,创建StorageClass。

  1. 使用以下内容,创建storage-class-csi-wffc.yaml文件。

    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
      provisionedIops: "40000"
      burstingEnabled: "false"
    volumeBindingMode: WaitForFirstConsumer
    reclaimPolicy: Retain
    allowVolumeExpansion: true

    参数

    说明

    metadata

    name

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

    provisioner

    配置为diskplugin.csi.alibabacloud.com。表示使用阿里云云盘Provisioner插件创建StorageClass。

    parameters

    参见上文参数列表

    volumeBindingMode

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

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

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

    reclaimPolicy

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

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

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

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

    allowVolumeExpansion

    配置为true时,可以实现云盘的自动扩容。

  2. 执行以下命令,创建StorageClass。

    kubectl apply -f storage-class-csi-wffc.yaml
  3. 查看创建的StorageClass。

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

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

先创建云盘再创建Pod的方式

  1. 使用以下内容,创建storage-class-immediate.yaml文件。

    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

    参数

    说明

    metadata

    name

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

    provisioner

    配置为diskplugin.csi.alibabacloud.com。表示使用阿里云云盘Provisioner插件创建StorageClass。

    parameters

    参见上文参数列表

    reclaimPolicy

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

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

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

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

    allowVolumeExpansion

    配置为true时,可以实现云盘的自动扩容。

    volumeBindingMode

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

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

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

  2. 执行以下命令,创建StorageClass。

    kubectl apply -f storage-class-immediate.yaml
  3. 查看创建的StorageClass。

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

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

步骤二:创建PVC

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

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: disk-pvc
    spec:
      accessModes:
      - ReadWriteOnce
      volumeMode: Filesystem
      resources:
        requests:
          storage: 25Gi
      storageClassName: alicloud-disk-wait-for-first-consumer 

    参数

    说明

    name

    PVC的名称。

    accessModes

    配置访问模式。

    volumeMode

    可选,挂载云盘的格式,为FilesystemBlock。 默认为文件系统挂载。

    storageClassName

    StorageClass的名称,用于绑定StorageClass。

    storage

    申请的云盘大小,最小为20 GiB。

    其中,可用的访问模式取决于StorageClass中的multiAttach参数以及PVC中的volumeMode,如下表:

    参数设置

    可用访问模式

    multiAttach

    volumeMode

    ReadWriteOnce

    ReadOnlyMany

    ReadWriteMany

    image.png

    任意

    image.png

    image.png

    image.png

    image.png

    Filesystem

    image.png

    image.png

    image.png

    image.png

    Block

    image.png

    image.png

    image.png

    当使用云盘多挂载功能时,请参见使用NVMe云盘多重挂载及Reservation

  2. 执行以下命令,创建PVC。

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

    在集群管理页左侧导航栏,选择存储 > 存储声明。在存储声明页面可以看到创建的PVC。

步骤三:创建应用

  1. 使用以下命令,创建Secret,用于设置mysql应用的root账号密码。请注意,在生产环境中请更换密码。

    kubectl create secret generic mysql-pass --from-literal=password=mypassword
  2. 使用以下内容,创建mysql.yaml文件。

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: mysql
    spec:
      selector:
        matchLabels:
          app: mysql
      serviceName: mysql
      template:
        metadata:
          labels:
            app: mysql
        spec:
          containers:
          - name: mysql
            image: mysql:8
            env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-pass
                  key: password
            ports:
            - containerPort: 3306
              name: mysql
            volumeMounts:
            - name: pvc-disk
              mountPath: /var/lib/mysql
          volumes:
            - name: pvc-disk
              persistentVolumeClaim:
                claimName: disk-pvc

    参数

    说明

    mountPath

    云盘挂载的位置。

    claimName

    PVC的名称,用于绑定PVC。

  3. 执行以下命令,创建应用并挂载PVC。

    kubectl create -f mysql.yaml
  4. 查看已创建的应用。

    在集群管理页左侧导航栏,选择工作负载 > 有状态。您可以在有状态页面看到已创建的应用。

验证动态云盘的持久化存储

当某个Pod被删除时,重新部署的Pod将保留之前Pod在存储卷中写入的所有数据。您可以通过以下示例验证动态云盘的持久化存储特性。

  1. 确认MySQL应用中已挂载云盘:执行以下命令,查看/var/lib/mysql路径下是否挂载了新的云盘。

    kubectl exec mysql-0 -- df -h /var/lib/mysql

    预期输出:

    Filesystem      Size  Used Avail Use% Mounted on
    /dev/vdd         25G  213M   25G   1% /var/lib/mysql
  2. 在云盘里创建文件。

    1. 执行以下命令,在/var/lib/mysql路径下创建文件test-persistent

      kubectl exec mysql-0 -- touch /var/lib/mysql/test-persistent
    2. 执行以下命令,确认文件已创建。

      kubectl exec mysql-0 -- ls /var/lib/mysql/test-persistent

      预期输出:

      /var/lib/mysql/test-persistent
  3. 执行以下命令,删除名为mysql-0的Pod。

    kubectl delete pod mysql-0

    预期输出:

    pod "mysql-0" deleted
  4. 验证删除Pod后,云盘中创建的文件是否仍然存在。

    1. 执行以下命令,确认重建后的Pod已正常运行。

      kubectl get pod mysql-0

      预期输出:

      NAME      READY   STATUS    RESTARTS   AGE
      mysql-0   1/1     Running   0          12s
    2. 执行以下命令,查看之前创建的文件。

      kubectl exec mysql-0 -- ls /var/lib/mysql/test-persistent

      预期输出:

      /var/lib/mysql/test-persistent

      test-persistent文件仍然存在,说明动态云盘的数据可以持久保存。

相关文档