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

前提条件

背景信息

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

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

步骤一:创建StorageClass

  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏,单击集群
  3. 集群列表页面,单击目标集群名称或者目标集群右侧操作列下的详情
  4. 在集群管理页左侧导航栏,选择存储 > 存储类
  5. 存储类页面,单击右上角的创建
  6. 创建对话框,配置StorageClass的相关参数。
    部分参数的说明如下所示:
    参数说明
    名称StorageClass的名称。

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

    存储卷类型选择云盘
    存储驱动选择CSI
    参数默认参数type,其值为cloud_essd。表示云盘类型,支持cloud_efficiencycloud_ssdcloud_essdavailable四种参数及除available外其他三种参数的任意组合。例如,type: cloud_efficiency, cloud_ssd, cloud_essd,这种配置方式支持对指定类型云盘的依次创建,直到创建成功。其中available会对SSD、高效依次尝试创建,直到创建成功。
    说明 部分ECS机型不支持ESSD云盘挂载。更多信息,请参见块存储FAQ

    可添加自定义参数。例如,配置zoneId,表示自动创建云盘所在的区域。单可用区集群,与集群所在区域相同。例如,cn-beijing-a;多可用区集群,zoneId可同时配置多个。例如,cn-beijing-a, cn-beijing-b

    回收策略云盘的回收策略,默认为Delete,支持Retain
    • Delete模式:删除PVC的时候,PV和云盘会一起删除。
    • Retain模式:删除PVC的时候,PV和云盘数据不会被删除,需要您手动删除。

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

    绑定模式云盘的绑定模式。默认为Immediate:表示先创建云盘再创建Pod。
  7. 参数配置完成后,单击创建
    创建成功后在存储类列表中可看到刚创建的StorageClass。

步骤二:创建PVC

  1. 在集群管理页左侧导航栏,选择存储 > 存储声明
  2. 存储声明页面,单击右上角的创建
  3. 创建存储声明对话框中,配置参数。
    参数描述
    存储声明类型支持云盘、NAS两种云存储类型。本文中选择云盘
    名称创建的存储声明名称在命名空间内必须唯一。
    分配模式本文中选择使用存储类动态创建
    已有存储类单击选择存储类,在选择存储类对话框目标存储类右侧操作列单击选择
    总量所创建存储卷的容量。
    访问模式默认为ReadWriteOnce
  4. 单击创建
    创建成功后在存储声明列表中可看到创建的存储声明,并且已绑定相应的存储卷。

步骤三:创建应用

  1. 在集群管理页左侧导航栏,选择工作负载 > 有状态
  2. 有状态页面,单击使用镜像创建
  3. 配置创建应用的参数信息。
    以下主要为您介绍数据卷的配置。关于其他参数的描述,请参见创建有状态工作负载StatefulSet

    ASK数据卷支持配置本地存储和云存储,本示例需要配置云存储类型。

    本例中配置了一个云盘类型的数据卷,将该云盘挂载到容器中/tmp路径下,在该路径下生成的容器数据会存储到云盘中。数据存储
  4. 所有的信息都配置完成后,单击创建
    创建成功后,您就可以正常使用数据卷。

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

步骤一:创建StorageClass

在多可用区集群场景下,您可以用先创建云盘再创建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-beijing
      zoneId: cn-beijing-b
      encrypted: false
    reclaimPolicy: Retain
    allowVolumeExpansion: true
    volumeBindingMode: Immediate
    参数说明
    provisioner配置为diskplugin.csi.alibabacloud.com。表示使用阿里云云盘Provisioner插件创建StorageClass。
    type表示云盘类型,支持cloud_efficiencycloud_ssdcloud_essdavailable四种参数及除available外其他三种参数的任意组合。例如,type: cloud_efficiency, cloud_ssd, cloud_essd,这种配置方式支持对指定类型云盘的依次创建,直到创建成功。其中available会对SSD、高效依次尝试创建,直到创建成功。
    说明 部分ECS机型不支持ESSD云盘挂载。更多信息,请参见块存储FAQ
    regionId可选,期望创建云盘的区域。
    zoneId可选,期望创建云盘的可用区。
    encrypted可选,标识创建的云盘是否加密。默认情况是false,创建的云盘不加密。
    reclaimPolicy云盘的回收策略,默认为Delete,支持Retain
    • Delete模式:删除PVC的时候,PV和云盘会一起删除。
    • Retain模式:删除PVC的时候,PV和云盘数据不会被删除,需要您手动删除。

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

    allowVolumeExpansion配置为true时,可以实现云盘的自动扩容。
    volumeBindingMode云盘的绑定模式。默认为Immediate:表示先创建云盘再创建Pod。
  2. 执行以下命令,创建StorageClass。
    kubectl apply -f storage-class-csi.yaml
  3. 查看创建的StorageClass。
    1. 登录容器服务管理控制台
    2. 在控制台左侧导航栏,单击集群
    3. 集群列表页面,单击目标集群名称或者目标集群右侧操作列下的详情
    4. 在集群管理页左侧导航栏中,选择存储 > 存储类
      存储类页面查看创建的StorageClass。

步骤二:创建PVC

  1. 使用以下内容,创建pvc-ssd.yaml文件。
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: disk-pvc
    spec:
      accessModes:
      - ReadWriteOnce
      volumeMode: Filesystem
      resources:
        requests:
          storage: 25Gi
      storageClassName: alicloud-disk-ssd-b
    参数说明
    namePVC的名称。
    accessModes配置访问模式。
    volumeMode可选,挂载云盘的格式,为FilesystemBlock。 默认为文件系统挂载。
    storageClassNameStorageClass的名称,用于绑定StorageClass。
    storage申请的云盘大小,最小为20 GiB。
  2. 执行以下命令,创建PVC。
    kubectl create -f pvc-ssd.yaml
  3. 查看创建的PVC。
    在集群管理页左侧导航栏选择存储 > 存储声明。可以在存储声明页面可以看到创建的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-pvc
    参数说明
    mountPath云盘挂载的位置。
    claimNamePVC的名称,用于绑定PVC。
  2. 执行以下命令,创建应用并挂载PVC。
    kubectl create -f pvc-dynamic.yaml
  3. 查看创建的应用。
    在集群管理页左侧导航栏选择工作负载 > 有状态。您可以在有状态页面看到创建的应用。

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

云盘提供了持久化存储服务,当某个Pod删除时,重新部署的Pod将自动同步之前Pod的所有数据。

根据以下示例,验证动态云盘的持久化存储特性。

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

      预期输出:

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

      预期输出:

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

      预期输出:

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

      预期输出:

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

    预期输出:

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

      预期输出:

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

      预期输出:

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