在业务系统跨多块云盘的场景下,您可以通过创建文件系统一致性快照,为业务中挂载的多块云盘同时创建快照,保证数据写入云盘的时序一致性,并保持其崩溃一致性。本文介绍文件系统一致性快照的使用方法。

前提条件

  • ACK发布的Kubernetes v1.18及之上版本默认提供了存储快照的功能,因此使用云盘存储快照时,请确保您创建的ACK集群Kubernetes版本等于或大于v1.18。具体操作,请参见创建Kubernetes托管版集群
  • 访问指定地域的ECS控制台,确认已开启云盘快照服务。具体操作,请参见开通快照

操作步骤

本文以nginx应用为例,介绍文件系统一致性快照的使用。

注意 创建文件系统一致性快照过程中会冻结云盘的文件系统,但不影响业务的正常运行。
  1. 部署应用。
    1. 使用以下内容,创建nginx-deploy.yaml文件。
      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: essd-pvc-0
        labels:
          app: nginx #创建一致性快照组时PVC的选择依据。
      spec:
        accessModes:
        - ReadWriteOnce
        volumeMode: Filesystem
        resources:
          requests:
            storage: 25Gi
        storageClassName: alicloud-disk-essd  #默认创建的ESSD存储类。
      ---
      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: essd-pvc-1
        labels:
          app: nginx   #创建一致性快照组时PVC的选择依据。
      spec:
        accessModes:
        - ReadWriteOnce
        volumeMode: Filesystem
        resources:
          requests:
            storage: 25Gi
        storageClassName: alicloud-disk-essd
      ---
      apiVersion: apps/v1
      kind: StatefulSet
      metadata:
        name: nginx
      spec:
        selector:
          matchLabels:
            app: nginx
        serviceName: nginx
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: nginx
              ports:
              - containerPort: 80
                name: web
              volumeMounts:
              - name: essd-0
                mountPath: /data/essd0
              - name: essd-1
                mountPath: /data/essd1
            volumes:
              - name: essd-0
                persistentVolumeClaim:
                  claimName: essd-pvc-0
              - name: essd-1
                persistentVolumeClaim:
                  claimName: essd-pvc-1
                                      
    2. 执行以下命令,部署nginx有状态应用,并挂载两个云盘。
      kubectl apply -f nginx-deploy.yaml
  2. 创建pre-rulepost-rule
    Rule用于定义创建的一致性快照的类型。若类型为应用一致性快照,Rule还将定义应用的冻结与解冻指令。
    1. 使用以下内容,创建rule.yaml文件。
      apiVersion: storage.alibabacloud.com/v1beta1
      kind: Rule
      metadata:
        name: post-rule
      spec:
        containerName: "csi-plugin"
        ruleType: filesystem_consistent
        rules:
          - actionType: command
            action: ""
      ---
      apiVersion: storage.alibabacloud.com/v1beta1
      kind: Rule
      metadata:
        name: pre-rule
      spec:
        containerName: "csi-plugin"
        ruleType: filesystem_consistent
        rules:
          - actionType: command
            action: ""
      参数 说明
      ruleType

      一致性快照的类型,包含文件系统一致性快照和应用一致性快照。

      • filesystem_consistent:表示使用文件系统一致性快照。
      • app_consistent:表示使用应用一致性快照。
      rules. actionType

      ruleType=app_consistent时,该参数生效。

      action的类型,目前仅支持command。当值为command时,执行action中的指令。

      rules. action

      ruleType=app_consistent时,该参数生效。

      • pre-rule中:表示一致性快照创建前执行的应用冻结指令。
      • post-rule中:表示一致性快照创建后执行的应用恢复指令。
      containerName

      ruleType=app_consistent时,该参数生效。

      Rules的执行容器。

      注意 文件系统一致性快照与应用一致性快照使用kube-system命名空间下的csi-plugin组件,将自动完成文件系统的冻结与解冻操作。
    2. 执行以下命令,创建pre-rulepost-rule
      kubectl apply -f rule.yaml
  3. 创建文件系统一致性快照。
    1. 使用以下内容,创建advanced-snapshot.yaml文件。
      apiVersion: storage.alibabacloud.com/v1beta1
      kind: AdvancedVolumeSnapshot
      metadata:
        name: advanced-snapshot
        namespace: default
      spec:
        pvcSelector:
          matchLabels: #当nameList字段不存在时生效。
            app: "nginx"
          #nameList: ["essd-pvc-0", "essd-pvc-1"]
        hook:
          preRule: "pre-rule"
          postRule: "post-rule"
        retentionDays: "1"
        reclaimPolicy: Delete
          targetRegions: ["cn-hanzghou"] #本文示例在cn-beijing本地域创建的文件系统一致性快照,拷贝到cn-hangzhou地域。
      参数 说明
      pvcSelector. matchLabels

      可选,目标PVC需要满足的标签。

      pvcSelector. nameList

      可选,目标PVC的名称。

      说明matchLabelsnameList同时存在,则只考虑nameList
      hook

      可选,一致性快照关联的Rule。

      该值为空时,将为每个目标PVC单独创建非一致性的快照。

      hook. preRule

      一致性快照创建前执行的Rule。

      选择集群中已存在的Rule作为pre-rule

      hook. postRule

      一致性快照创建后执行的Rule。

      选择集群中已存在的Rule作为post-rule

      retentionDays

      可选,创建的一致性快照的保留时间,默认为1天。

      reclaimPolicy

      可选,快照的回收机制,默认为Delete

      • Delete:删除整组AdvancedVolumeSnapshot或单个VolumeSnapshot时,对应的VolumeSnapshotContent及关联的快照会被同时删除。
      • Retain:删除整组AdvancedVolumeSnapshot或单个VolumeSnapshot时,对应的VolumeSnapshotContent及关联的快照不会被同时删除。
    2. 执行以下命令,创建文件系统一致性快照。
      kubectl apply -f advanced-snapshot.yaml
  4. 执行以下命令,查询文件系统一致性快照的创建状态及为各个云盘生成的SnapshotID。
    kubectl describe advancedvolumesnapshot advanced-snapshot

    预期输出的Status部分示例如下:

    Status:
      Group Snapshot ID:
      Group Volume Snapshot Status:  done
      Snapshot Status:
        Disk ID:      d-2zee3khhqsnfql******
        Message:
        Pvc Name:     essd-pvc-0
        Region ID:
        Snapshot ID:  s-2ze0wl2fd6337w******
        Status:       accomplished
        Disk ID:      d-2ze9b1j3v4w6pz******
        Message:
        Pvc Name:     essd-pvc-1
        Region ID:
        Snapshot ID:  s-2zeg9tk9plor4w******
        Status:       accomplished
        Disk ID:      d-2zee3khhqsnfql******
        Message:
        Pvc Name:     essd-pvc-0
        Region ID:    cn-hangzhou
        Snapshot ID:  s-bp1izimv6vjlyr******
        Status:       accomplished
        Disk ID:      d-2ze9b1j3v4w6pz******
        Message:
        Pvc Name:     essd-pvc-1
        Region ID:    cn-hangzhou
        Snapshot ID:  s-bp1hu9p9m3hfaq******
        Status:       accomplished

    其中,Region ID为空的快照,说明是在本地域创建的文件系统一致性快照;Region ID为cn-hangzhou的快照,说明是从本地域拷贝到targetRegions的文件系统一致性快照。

  5. 执行以下命令,确认集群中已创建关联的volumeSnapshot资源。
    kubectl get volumesnapshot

    预期输出:

    NAME                                                READYTOUSE   SOURCEPVC              SOURCESNAPSHOTCONTENT    RESTORESIZE   SNAPSHOTCLASS        SNAPSHOTCONTENT                                    CREATIONTIME   AGE
    s-2ze0wl2fd6337w******                              true                                s-2ze0wl2fd6337w******   25Gi                               s-2ze0wl2fd6337w******                             9m50s          8m45s
    s-2zeg9tk9plor4w******                              true                                s-2zeg9tk9plor4w******   25Gi                               s-2zeg9tk9plor4w******                             9m47s          8m45s
    s-bp1hu9p9m3hfaq******                              true                                s-bp1hu9p9m3hfaq******   0                                  s-bp1hu9p9m3hfaq******                             52y            6m35s
    s-bp1izimv6vjlyr******                              true                                s-bp1izimv6vjlyr******   0                                  s-bp1izimv6vjlyr******                             52y            6m36s

    Region ID为cn-hangzhou的快照在本集群中已创建volumeSnapshot资源,但由于地域不同,所以restoresize显示为0。

    可在ECS控制台左侧导航栏中单击存储与快照,查看不同地域的快照。
    说明 您通过跨地域拷贝的文件系统一致性快照会一直保留,如不需要,可手动删除。
  6. 将已有的文件系统一致性快照导入到使用快照恢复应用的目标集群中,恢复应用。
    可通过创建volumeSnapshot和volumeSnapshotContent的方式跨集群恢复应用。在本集群恢复应用时,可直接使用已有的volumeSnapshot和volumeSnapshotContent。具体操作,请参见静态创建快照