云盘是阿里云为云服务器ECS提供的数据块级别的块存储产品,具有低时延、高性能、持久性、高可靠等特点。ACK支持使用CSI插件创建云盘静态存储卷和动态存储卷。本文介绍如何在CSI插件中挂载云盘动态存储卷及使用云盘动态存储卷如何实现持久化存储。

前提条件

在使用动态云盘卷前,请确保您已经完成以下操作。

背景信息

动态云盘的使用场景:没有购买云盘,在应用部署时自动购买云盘的情况。

动态云盘的使用方式:
  1. 手动创建PVC,在PVC中声明StorageClass。
  2. 部署应用时通过StorageClass自动创建PV。

有关StorageClass的详细说明,请参见存储类(StorageClass)

步骤一:创建StorageClass

阿里云容器服务Kubernetes在系统初始化的时候会默认创建4个StorageClass,且使用参数的默认情况。这4个StorageClass分别为:
  • alicloud-disk-efficiency:高效云盘。
  • alicloud-disk-ssd:SSD云盘。
  • alicloud-disk-essd:ESSD云盘。
  • alicloud-disk-available:提供高可用选项,优先创建SSD云盘;如果SSD云盘售尽,则创建高效云盘。
这4个StorageClass仅适用于单可用区集群。

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

方式一:使用Topology(延迟绑定)方式创建StorageClass

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

  1. 使用以下内容,创建storage-class-topology.yaml文件。
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
        name: alicloud-disk-topology-ssd
    provisioner: diskplugin.csi.alibabacloud.com
    reclaimPolicy: Retain
    parameters:
        type: cloud_ssd
          regionId: cn-hangzhou
          zoneId: cn-hangzhou-b
          fstype: "ext4"
          readonly: "false"
    reclaimPolicy: Retain
    volumeBindingMode: WaitForFirstConsumer
    allowVolumeExpansion: true
    参数 说明
    name StorageClass的名称。
    provisioner 配置为diskplugin.csi.alibabacloud.com。标识StorageClass使用阿里云云盘provisioner插件创建。
    reclaimPolicy 云盘的回收策略。支持DeleteRetain,默认情况为Delete
    说明 如果配置为Delete,删除PVC时,云盘会一起删除,云盘上的数据不可恢复。
    type 标识云盘类型,支持cloud_efficiency、cloud_ssd、cloud_essd、available四种参数,其中available会对ESSD、SSD、高效依次尝试创建,直到创建成功。
    说明 部分ECS机型不支持ESSD云盘挂载,请参见块存储FAQ
    注意
    regionId (可选)自动创建云盘所在的地域,与集群的地域相同。
    zoneId (可选)自动创建云盘所在的区域。
    • 单可用区集群,与集群所在区域相同。
    • 多可用区集群,zoneid可同时配置多个,例如:
      zoneid: cn-hangzhou-a,cn-hangzhou-b,cn-hangzhou-c
    fstype (可选)自动创建云盘所使用的文件系统,默认情况为ext4
    readonly (可选)挂载自动创建云盘的权限是否为可读,支持true:云盘具有只读权限,false:云盘具有可读可写权限,默认情况为false
    reclaimPolicy 云盘的回收策略,默认为Delete,支持Retain。
    • Delete模式:删除PVC的时候,PV和云盘会一起删除。
    • Retain模式:删除PVC的时候,PV和云盘数据不会被删除,需要您手动删除。

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

    encrypted (可选)标识创建的云盘是否加密。默认情况是false,创建的云盘不加密。
    volumeBindingMode WaitForFirstConsumer时表示使用延迟绑定,即调度器先调度pod,并根据pod的可用区信息创建云盘。
    allowVolumeExpansion 配置为true时,可以实现云盘的自动扩容。
    performanceLevel 值为PL1、PL2、或PL3。更多信息,请参见容量范围与性能级别的关系
  2. 执行以下命令创建StorageClass。
    kubectl apply -f storage-class-topology.yaml

方式二:先创建云盘再创建Pod方式创建StorageClass

  1. 使用以下内容,创建storage-class-csi.yaml文件。
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: alicloud-disk-ssd-b
    provisioner: diskplugin.csi.alibabacloud.com
    parameters:
      type: cloud_ssd
      regionId: cn-shenzhen
      zoneId: cn-shenzhen-b
    reclaimPolicy: Retain
    allowVolumeExpansion: true
    volumeBindingMode: Immediate
    参数 说明
    provisioner 配置为diskplugin.csi.alibabacloud.com。标识StorageClass使用阿里云云盘provisioner插件创建。
    type 标识云盘类型,支持cloud_efficiency、cloud_ssd、cloud_essd、available四种参数,其中available会对ESSD、SSD、高效依次尝试创建,直到创建成功。
    说明 部分ECS机型不支持ESSD云盘挂载,请参见块存储FAQ
    注意
    regionId 可选参数。期望创建云盘的区域。
    zoneId 可选参数。期望创建云盘的可用区。
    reclaimPolicy 云盘的回收策略,默认为Delete,支持Retain。
    • Delete模式:删除PVC的时候,PV和云盘会一起删除。
    • Retain模式:删除PVC的时候,PV和云盘数据不会被删除,需要您手动删除。

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

    encrypted 可选参数,标识创建的云盘是否加密。默认情况是false,创建的云盘不加密。
  2. 执行以下命令,创建StorageClass。
    kubectl apply -f storage-class-csi.yaml

结果验证

  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,单击集群
  3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
  4. 在集群管理页左侧导航栏中,选择存储 > 存储类
  5. 存储类页面查看已创建的StorageClass。

步骤二:创建PVC

  1. 使用以下内容,创建pvc-ssd.yaml文件。
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: disk-pvc
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 25Gi
      storageClassName: alicloud-disk-ssd
    参数 说明
    name PVC的名称。
    accessModes 配置访问模式。
    storageClassName StorageClass的名称,用于绑定StorageClass。
    storage 最小为20GiB,最小为20 GiB。
  2. 执行以下命令,创建PVC。
    kubectl create -f pvc-ssd.yaml
  3. 查看创建的PVC。
    1. 登录容器服务管理控制台
    2. 在控制台左侧导航栏中,单击集群
    3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
    4. 在集群管理页左侧导航栏选择存储 > 存储声明。可以在存储声明页面可以看到创建的PVC。

步骤三:创建应用

  1. 创建pvc-dynamic.yaml文件。

    创建一个名为nginx-dynamic的应用,并挂载PVC。

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: nginx-dynamic
    spec:
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            ports:
            - containerPort: 80
              name: web
            volumeMounts:
            - name: pvc-disk
              mountPath: /data
          volumes:
            - name: pvc-disk
              persistentVolumeClaim:
                claimName: disk-ssd
    • mountPath:云盘挂载的位置。
    • claimName:PVC的名称,用于绑定PVC。
  2. 执行以下命令,创建应用并挂载PVC。
    kubectl create -f nginx-dynamic.yaml
    在集群管理页左侧导航栏选择工作负载 > 有状态。您可以在有状态页面看到创建的应用。

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

  1. 查看nginx-dynamic应用所在的Pod和云盘文件。
    1. 执行以下命令,查看nginx-dynamic应用所在Pod的名称。
      kubectl get pod | grep dynamic

      预期输出:

      nginx-dynamic-xxx   1/1     Running     0          3m
    2. 执行以下命令,查看/data路径下是否挂载了新的云盘。
      kubectl exec nginx-dynamic-xxx df | grep data

      预期输出:

      /dev/vdh        20511312    45080  20449848   1% /data
    3. 执行以下命令,查看/data路径下的文件。
      kubectl exec nginx-dynamic-xxx ls /data

      预期输出:

      lost+found
  2. 在云盘里创建文件。
    1. 执行以下命令,在/data路径下创建文件dynamic
      kubectl exec nginx-dynamic-xxx touch /data/dynamic
    2. 执行以下命令,查看/data路径下的文件。
      kubectl exec nginx-dynamic-xxx ls /data

      预期输出:

      dynamic
      lost+found
  3. 执行以下命令,删除名为nginx-dynamic-xxx的Pod。
    kubectl delete pod nginx-dynamic-xxx

    预期输出:

    pod "nginx-dynamic-xxx" deleted
  4. 验证删除Pod后,云盘中创建的文件是否还存在。
    1. 执行以下命令,查看重建的Pod名称。
      kubectl get pod 

      预期输出:

      NAME                               READY   STATUS      RESTARTS   AGE
      nginx-dynamic-xxx                   1/1     Running     0          2m
    2. 执行以下命令,查看/data路径下的文件。
      kubectl exec nginx-dynamic-xxx ls /data

      预期输出:

      dynamic
      lost+found
      dynamic文件仍然存在,说明动态云盘的数据可持久保存。