1 - 快照管理

在Kubernetes中, 卷快照(VolumeSnapshot) 是一个存储系统上卷的快照。卷快照能力为Kubernetes用户提供了一种标准的方式来在指定时间点复制卷的内容,并且不需要创建全新的卷。 例如,这一功能使得数据库管理员能够在执行编辑或删除之类的修改之前对数据库执行备份。

本章将介绍如何使用华为CSI创建卷快照。为了完成创建卷快照,需要完成如下两步:

  • 配置卷快照类
  • 配置卷快照

前提条件

  • 支持创建VolumeSnapshot的存储请参考存储自身的 特性表 ,选择对应存储类型和业务类型进行查询。
  • 支持创建VolumeSnapshot的Kubernetes版本请参考 表1
  • 如果您需要在容器环境中使用卷快照以及卷快照关联的特性,请通过 检查卷快照依赖组件 检查您的环境是否部署了卷快照依赖组件以及卷快照api-versions信息。

1.1 - 配置卷快照类

创建卷快照类

卷快照类(VolumeSnapshotClass) 提供了一种在配置VolumeSnapshot时描述存储“类”的方法。每个VolumeSnapshotClass都包含“driver”、“deletionPolicy” 和“parameters”字段, 在需要动态配置属于该类的VolumeSnapshot时使用。

VolumeSnapshotClass对象的名称很重要,是用户可以请求特定类的方式。 管理员在首次创建VolumeSnapshotClass对象时设置类的名称和其他参数, 对象一旦创建就无法更新。

华为CSI使用的VolumeSnapshotClass示例如下:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: mysnapclass
driver: csi.huawei.com
deletionPolicy: Delete

实际参数可以参考 表1 中的说明修改。

表 1 VolumeSnapshotClass参数说明

参数

说明

备注

metadata.name

自定义的VolumeSnapshotClass对象名称。

以Kubernetes v1.22.1为例,支持数字、小写字母、中划线(-)和点(.)的组合,并且必须以字母数字字符开头和结尾。

driver

driver标识。必填参数。

该字段需要指定为安装华为CSI时设置的驱动名。默认的驱动名为“csi.huawei.com”。

deletionPolicy

快照删除策略。必填参数。可选值为:

  • Delete
  • Retain
  • 如果删除策略是 Delete,那么存储设备上的快照会和VolumeSnapshotContent对象一起删除
  • 如果删除策略是Retain,那么存储设备上的快照和VolumeSnapshotContent对象都会被保留。

parameters.enableHyperMetroSnap

是否创建SAN双活双端快照。

  • "true":分别在组成双活的两端存储创建快照。
  • "false":在当前存储类关联的存储侧创建快照。

默认值为"false"。

当后端类型为oceanstor-san且存储版本在V700R001C10及以上,支持配置为"true"。

操作步骤

  1. 执行以下命令,使用已经创建的VolumeSnapshotClass配置文件创建VolumeSnapshotClass。

    kubectl create -f mysnapclass.yaml
    
  2. 执行以下命令,查看已创建的VolumeSnapshotClass信息。

    kubectl get volumesnapshotclass
    

    命令结果示例如下:

    NAME          DRIVER           DELETIONPOLICY   AGE
    mysnapclass   csi.huawei.com   Delete           25s
    

1.2 - 配置卷快照

配置卷快照的方式按类型可分为动态制备卷快照和预制备卷快照。

  • 动态制备卷快照通过创建VolumeSnapshot资源,从PVC中动态获取并创建快照,而不用使用已经存在的快照。
  • 预制备卷快照需要管理员事先在存储设备上创建好所需要的快照,通过创建VolumeSnapshotContent的方式使用已存在的快照。并且可以在创建VolumeSnapshot时指定关联的VolumeSnapshotContent。

1.2.1 - 动态制备卷快照

本章节将说明如何使用华为CSI动态制备卷快照。

前提条件

  • 源PVC存在,且PVC所在的backend支持创建VolumeSnapshot。

创建卷快照

VolumeSnapshot的配置文件示例如下:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: mysnapshot
spec:
  volumeSnapshotClassName: mysnapclass
  source:
    persistentVolumeClaimName: mypvc

实际参数可以参考 表1 中的说明修改。

表 1 VolumeSnapshot参数说明

参数

说明

备注

metadata.name

自定义的VolumeSnapshot对象名称。

以Kubernetes v1.22.1为例,支持数字、小写字母、中划线(-)和点(.)的组合,并且必须以字母数字字符开头和结尾。

spec.volumeSnapshotClassName

VolumeSnapshotClass对象名称。

--

spec.source.persistentVolumeClaimName

源PVC对象名称。

快照源PVC对应的名称

  1. 执行以下命令,使用已经创建的VolumeSnapshot配置文件创建VolumeSnapshot。

    kubectl create -f mysnapshot.yaml
    
  2. 执行以下命令,查看已创建的VolumeSnapshot信息。

    kubectl get volumesnapshot
    

    命令结果示例如下:

    NAME         READYTOUSE   SOURCEPVC   SOURCESNAPSHOTCONTENT   RESTORESIZE   SNAPSHOTCLASS   SNAPSHOTCONTENT                                    CREATIONTIME   AGE
    mysnapshot   true         mypvc                               100Gi         mysnapclass     snapcontent-1009af0a-24c2-4435-861c-516224503f2d   <invalid>      78s
    

1.2.2 - 预制备卷快照

本章节将说明如何使用华为CSI预制备卷快照。

前提条件

  • 已在华为存储设备上创建源卷快照,并能够获取到创建的快照名称。

创建卷快照实体

VolumeSnapshotContent的配置文件示例如下:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotContent
metadata:
  name: mysnapshotcontent
spec:
  deletionPolicy: Retain
  driver: csi.huawei.com
  volumeSnapshotRef:
    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshot
    name: mysnapshot
    namespace: default
  source:
    snapshotHandle: mybackend.1.snapshot_001
  volumeSnapshotClassName: "mysnapclass"

实际参数可以参考 表1 中的说明修改。

表 1 VolumeSnapshotContent参数说明

参数

说明

备注

metadata.name

自定义的VolumeSnapshotContent对象名称。

以Kubernetes v1.22.1为例,支持数字、小写字母、中划线(-)和点(.)的组合,并且必须以字母数字字符开头和结尾。

spec.deletionPolicy

删除策略。支持如下类型:

  • Delete:自动回收资源。
  • Retain:手动回收资源。
  • Delete:删除VolumeSnapshotContent时会关联删除存储上的快照资源。
  • Retain:删除VolumeSnapshotContent时不会删除存储上的快照资源。

spec.driver

驱动名称。

该字段需要指定为安装华为CSI时设置的驱动名称。

取值和values.yaml文件中driverName一致。

spec.volumeSnapshotRef

需要绑定的目标VolumeSnapshot信息,包含VolumeSnapshot名称以及所属命名空间。

--

spec.source.snapshotHandle

存储快照资源的唯一标志。必选参数。

格式为:<backend-name>.<parent-id>.<snapshot-name>

该参数值由以下三部分构成:

  • <backend-name>:该快照资源对应的后端名称,可使用如下命令获取配置的后端信息:oceanctl get backend
  • <parent-id>:存储上快照资源的父资源对象ID,可通过DeviceManager查看。
  • <snapshot-name>:存储上快照资源的名称,可通过DeviceManager查看。
须知:

<snapshot-name>,存储上快照资源名称仅支持数字、字母以及下划线(_)的组合。

spec.volumeSnapshotClassName

VolumeSnapshotClass对象名称。

--

  1. 执行以下命令,使用已经创建的VolumeSnapshotContent配置文件创建VolumeSnapshotContent。

    kubectl create -f mysnapshotcontent.yaml
    
  2. 执行以下命令,查看已创建的VolumeSnapshot信息。

    kubectl get volumesnapshotcontent
    

    命令结果示例如下:

    NAME               READYTOUSE   RESTORESIZE   DELETIONPOLICY   DRIVER           VOLUMESNAPSHOTCLASS   VOLUMESNAPSHOT   VOLUMESNAPSHOTNAMESPACE   AGE
    mysnapshotcontent  true         0             Retain           csi.huawei.com   mysnapclass           mysnapshot       default                   4s
    

创建卷快照

当VolumeSnapshotContent以预制备方式创建完成后,可以基于该VolumeSnapshotContent创建VolumeSnapshot。VolumeSnapshot的配置文件示例如下:

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: mysnapshot
  namespace: default
spec:
  volumeSnapshotClassName: mysnapclass
  source:
    volumeSnapshotContentName: mysnapshotcontent

实际参数可以参考 表2 中的说明修改。

表 2 VolumeSnapshot参数说明

参数

说明

备注

metadata.name

自定义的VolumeSnapshot对象名称。

以Kubernetes v1.22.1为例,支持数字、小写字母、中划线(-)和点(.)的组合,并且必须以字母数字字符开头和结尾。

VolumeSnapshotContent指定的VolumeSnapshot名称保持一致。

metadata.namespace

VolumeSnapshot所属命名空间。

VolumeSnapshotContent指定的VolumeSnapshot命名空间保持一致。

spec.volumeSnapshotClassName

VolumeSnapshotClass对象名称。

--

spec.source.volumeSnapshotContentName

VolumeSnapshotContent对象名称。

快照源VolumeSnapshotContent对应的名称

  1. 执行以下命令,使用已经创建的VolumeSnapshot配置文件创建VolumeSnapshot。

    kubectl create -f mysnapshot.yaml
    
  2. 执行以下命令,查看已创建的VolumeSnapshot信息。

    kubectl get volumesnapshot
    

    命令结果示例如下:

    NAME         READYTOUSE  SOURCEPVC  SOURCESNAPSHOTCONTENT   RESTORESIZE   SNAPSHOTCLASS   SNAPSHOTCONTENT     CREATIONTIME   AGE
    mysnapshot   true                   mysnapshotcontent       0             mysnapclass     mysnapshotcontent   2m39s          8s
    

1.3 - 管理卷快照

1.3.1 - 查询卷快照

查看卷快照类

  1. 执行以下命令,查看已创建的VolumeSnapshotClass信息。

    kubectl get volumesnapshotclass
    

    命令结果示例如下:

    NAME          DRIVER           DELETIONPOLICY   AGE
    mysnapclass   csi.huawei.com   Delete           25s
    

查询卷快照

  1. 执行以下命令,查看已创建的VolumeSnapshot信息。

    kubectl get volumesnapshot
    

    命令结果示例如下:

    NAME         READYTOUSE   SOURCEPVC   SOURCESNAPSHOTCONTENT   RESTORESIZE   SNAPSHOTCLASS   SNAPSHOTCONTENT                                    CREATIONTIME   AGE
    mysnapshot   true         mypvc                               100Gi         mysnapclass     snapcontent-1009af0a-24c2-4435-861c-516224503f2d   <invalid>      78s
    

1.3.2 - 从卷快照创建持久卷

前提条件

  • 支持从卷快照创建PVC的存储请参考存储自身的 特性表 ,选择对应存储类型和业务类型进行查询。
  • 支持从卷快照创建PVC的Kubernetes版本请参考 Kubernetes特性矩阵
  • 已经存在卷快照,且卷快照所在的backend支持克隆。

在创建PVC时,需要指定卷快照作为数据源。如下是一个从卷快照创建PVC示例,在该示例中,使用快照“mysnapshot”作为数据源,新创建了一个名叫“myrestore”的PVC。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myrestore
spec:
  storageClassName: mysc
  dataSource:
    name: mysnapshot
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 100Gi

  • 指定的storageClassName必须和dataSource中的快照源卷的StorageClass需一致。
  • 克隆卷的容量必须不小于快照容量,建议和快照容量保持一致。

操作步骤

  1. 执行以下命令,基于从快照创建卷的配置文件创建PVC。

    kubectl create -f myrestore.yaml
    

1.3.3 - 删除卷快照

删除卷快照

当后续不需要使用该卷快照时,执行该操作。

操作步骤

  1. 执行以下命令,查看已创建的VolumeSnapshot信息。

    kubectl get volumesnapshot
    

    命令结果示例如下:

    NAME         READYTOUSE   SOURCEPVC   SOURCESNAPSHOTCONTENT   RESTORESIZE   SNAPSHOTCLASS   SNAPSHOTCONTENT                                    CREATIONTIME   AGE
    mysnapshot   true         mypvc                               100Gi         mysnapclass     snapcontent-1009af0a-24c2-4435-861c-516224503f2d   <invalid>      78s
    
  2. 执行下列命令,删除VolumeSnapshot:

    kubectl delete volumesnapshot mysnapshot 
    

    回显如下所示,表示删除成功:

    volumesnapshot.snapshot.storage.k8s.io "mysnapshot" deleted
    

删除卷快照类

当该卷快照类没有绑定任何卷快照,且后续不需要使用该卷快照类时,执行该操作。

操作步骤

  1. 执行以下命令,查看卷快照类。

    kubectl get vsclass
    

    命令结果示例如下:

    NAME          DRIVER           DELETIONPOLICY   AGE
    mysnapclass   csi.huawei.com   Delete           25s
    
  2. 执行下列命令,删除存储类:

    kubectl delete vsclass mysnapclass
    

    回显如下所示,表示删除成功:

    volumesnapshotclass.snapshot.storage.k8s.io "mysnapclass" deleted