文档

使用云盘动态存储卷验证持久化存储

更新时间:

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

使用说明

类别

说明

适用场景

没有提前购买云盘,在应用部署时自动购买云盘的情况。

使用方式

  • 手动创建PVC,在PVC中声明StorageClass。

  • 部署应用时通过StorageClass自动创建PV。

前提条件

已使用kubectl连接Kubernetes集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群

环境准备

创建自定义存储类

ACS 默认提供了名为 alicloud-disk-topology-alltype 的存储类, 该存储类里面支持依次创建 cloud_essdcloud_ssdcloud_efficiency 类型的存储。 如果默认提供的存储类无法满足需求,您可以手动使用kubectl 创建存储类。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: alibaba-cloud-custom
parameters:
  type: cloud_essd,cloud_ssd
provisioner: diskplugin.csi.alibabacloud.com
reclaimPolicy: Delete
allowVolumeExpansion: true

parameters 部分相关参数说明如下:

字段

说明

举例

type

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

  • 高效云盘:cloud_efficiency

  • ESSD AutoPL云盘:cloud_auto

  • SSD云盘:cloud_ssd

  • ESSD云盘:cloud_essd

  • ESSD Entry云盘:cloud_essd_entry

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

type: cloud_essd,cloud_ssd

fstype

可选,自动创建云盘所使用的文件系统,默认为ext4。支持ext3ext4xfs

fstype: xfs

performanceLevel

可选,ESSD云盘的性能级别,取值PL0PL1PL2PL3。默认值为PL1

performanceLevel: PL0

操作步骤

您可以通过以下两种方式使用云盘动态存储卷。

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

步骤一:创建PVC

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

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

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

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

    image

    配置项

    说明

    存储声明类型

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

    名称

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

    分配模式

    目前仅支持使用存储类动态创建

    已有存储类

    单击选择存储类,在选择存储类对话框目标存储类右侧操作列单击选择

    总量

    所创建存储卷的容量。

    访问模式

    仅支持ReadWriteOncePod。

  5. 单击创建

创建成功后,在存储声明列表中可以看到创建的存储声明,其状态为Pending,表示当前存储声明还未绑定到存储卷。这是因为对应存储类的volumeBindingMode字段为WaitForFirstConsumer,即在该存储声明被工作负载消费后,才会创建存储卷并与之绑定。

步骤二:创建应用

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

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

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

    参数名

    应用名称

    mysql

    副本数量

    1

    类型

    有状态(StatefulSet)

    实例类型

    通用型

    QoS类型

    default

    镜像名称

    mysql:5.7

    端口

    80

    环境变量

    类型保密字典

    变量名称MYSQL_ROOT_PASSWORD

    变量/变量引用mysql-pass password

    数据卷

    增加云存储声明(PersistentVolumeClaim)

    • 挂载源disk-pvc

    • 容器路径/data

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

    ACS数据卷支持配置本地存储和云存储声明,本例中需要配置云存储类型。在下图中,存储卷类型选择云存储,挂载源选择之前创建的存储声明,将云盘挂载到容器中的/tmp路径下,在该路径下生成的容器数据会存储到云盘中。

    image.png

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

创建成功后,在集群管理页左侧导航栏选择存储 > 存储卷,可以看到创建了一个新的存储卷,并且已经和之前的存储声明绑定。在导航栏选择存储 > 存储声明,也可以看到之前创建的存储声明状态已经变成了Bound

image.png

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

步骤一:创建PVC

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

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: disk-pvc
    spec:
      accessModes:
      - ReadWriteOncePod
      volumeMode: Filesystem
      resources:
        requests:
          storage: 25Gi
      storageClassName: alicloud-disk-topology-alltype

    参数

    说明

    name

    PVC的名称。

    accessModes

    配置访问模式。

    volumeMode

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

    storageClassName

    StorageClass的名称,用于绑定StorageClass。

    storage

    申请的云盘大小

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

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

    在集群管理页左侧导航栏,选择存储 > 存储声明。可以在存储声明页面看到创建的PVC,其状态为Pending,等待应用消费。

步骤二:创建应用

  1. 使用以下内容,创建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:5.7
            env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-pass
                  key: password
            ports:
            - containerPort: 80
              name: mysql
            volumeMounts:
            - name: pvc-disk
              mountPath: /data
          volumes:
            - name: pvc-disk
              persistentVolumeClaim:
                claimName: disk-pvc
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: mysql-pass
    type: Opaque
    data:
      username: dGVz****             
      password: dGVzdDEt****     

    参数

    说明

    mountPath

    云盘挂载的位置。

    claimName

    PVC的名称,用于绑定PVC。

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

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

    在集群管理页左侧导航栏,选择工作负载 > 有状态。您可以在有状态页面看到已创建的应用。在左侧导航栏选择存储 > 存储声明,可以看到创建的PVC状态已经变为Bound。

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

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

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

  1. 查看MySQL应用所在的Pod和云盘文件。

    1. 执行以下命令,查看MySQL应用所在Pod的名称。

      kubectl get pod | grep mysql

      预期输出:

      mysql-0   1/1     Running     0          3m
    2. 执行以下命令,查看/data路径下是否挂载了新的云盘。

      kubectl exec mysql-0 -- df | grep data

      预期输出:

      /dev/vdb        25626852     24   25610444   1% /data
    3. 执行以下命令,查看/data路径下的文件。

      kubectl exec mysql-0 -- ls /data

      预期输出:

      lost+found
  2. 在云盘里创建文件。

    1. 执行以下命令,在/data路径下创建文件MySQL

      kubectl exec mysql-0 -- touch /data/mysql
    2. 执行以下命令,查看/data路径下的文件。

      kubectl exec mysql-0 -- ls /data

      预期输出:

      lost+found
      mysql
  3. 执行以下命令,删除名为mysql-0的Pod,等待其被重建。

    kubectl delete pod mysql-0

    预期输出:

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

    1. 执行以下命令,等待mysql-0被重建,状态变为Running。

      kubectl get pod 

      预期输出:

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

      kubectl exec mysql-0 -- ls /data

      预期输出:

      lost+found
      mysql

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