全部產品
Search
文件中心

Container Service for Kubernetes:為單個雲端硬碟儲存卷建立快照

更新時間:Jun 05, 2025

雲端硬碟儲存快照可以協助您實現應用資料的備份和恢複。本文介紹如何通過VolumeSnapshot資源為雲端硬碟儲存卷建立快照,以及如何基於快照恢複資料。

前提條件

功能概述

在ACK叢集中,通常使用雲端硬碟儲存卷為StatefulSet提供持久化儲存。雲端式盤本身提供的快照功能,Kubernetes使用以下兩個特性來實現雲端硬碟儲存卷的資料備份和恢複能力。

  • 通過VolumeSnapshot資源實現雲端硬碟資料的備份(快照功能)。

  • 通過PVC的DataSource功能實現雲端硬碟資料的恢複。

計費說明

ACK的儲存快照基於ECS快照實現。快照會收取儲存費用,具體請參見快照計費

使用說明

為了實現快照相關功能,ACK通過CRD定義了以下3個相關的資源類型。

資源類型名稱

描述

VolumeSnapshotContent

儲存後端的快照,由叢集管理員建立維護,無NameSpace。類似PV概念。

VolumeSnapshot

聲明一個快照,由操作人員建立維護,屬於特定Namespace。類似PVC概念。

VolumeSnapshotClass

定義一個快照類,描述建立快照使用的參數、Controller。類似StorageClass概念。

綁定規則如下:

  • 使用Snapshot資源類型時,類似PV和PVC,首先您需綁定VolumeSnapshot與VolumeSnapshotContent。

  • 如果VolumeSnapshot正確配置了VolumeSnapshotClassName欄位,叢集會自動建立VolumeSnapshotContent。如果沒有配置或者配置錯誤,則無法自動建立,您需要手動建立VolumeSnapshotContent,並綁定VolumeSnapshot。

  • VolumeSnapshotContent與VolumeSnapshot綁定是一對一的關係。

重要

刪除VolumeSnapshotContent時,後端的快照也會被刪除。

動態建立快照

使用流程

ACK使用雲端硬碟動態建立快照使用流程如下圖所示。snapshot

重要

使用PL0、PL1、PL2、PL3層級的ESSD雲端硬碟或ESSD AutoPL雲端硬碟時,動態建立的快照預設開啟快照極速可用能力

使用流程說明如下:

流程步驟

描述

建立應用並使用雲端硬碟儲存卷儲存資料。

建立關聯了VolumeSnapshotClass的VolumeSnapshot,此時叢集會自動建立VolumeSnapshotContent和儲存後端的快照。

建立新的應用,並配置PVC引用步驟②中建立的快照。

上述的三個步驟實現:

  • 備份:Volume1的資料被備份到Snapshot1。

  • 恢複:Snapshot1的資料(也就是Volume1的資料)被恢複成Volume2。

使用樣本

  1. 建立VolumeSnapshotClass。

    1. 使用以下YAML內容建立volumesnapshotclass.yaml檔案。

      apiVersion: snapshot.storage.k8s.io/v1
      kind: VolumeSnapshotClass
      metadata:
       name: default-snapclass
      driver: diskplugin.csi.alibabacloud.com
      parameters:
        retentionDays: "5"
        forceDelete: "true"
      deletionPolicy: Delete

      參數

      說明

      retentionDays

      指定快照自動回收時間。單位為天。

      forceDelete

      forceDelete配置為"true"時,表示使用強制移除快照功能。

      自csi-provisioner組件v1.26.5-92f859a-aliyun版本起,預設使用強制移除且不可修改,此前預設為普通刪除。

      • 強制移除:強制移除使用者建立的所有已使用和未使用的快照。

      • 普通刪除:只刪除未使用的快照。不刪除已經使用過的快照。

      deletionPolicy

      快照的回收策略。取值範圍:

      • Delete:刪除VolumeSnapshot時,VolumeSnapshotContent以及關聯的快照也會一起被刪除。

      • Retain:刪除VolumeSnapshot時,VolumeSnapshotContent以及關聯的快照不會被刪除。

    2. 建立VolumeSnapshotClass。

      kubectl apply -f volumesnapshotclass.yaml
  2. 建立應用並寫入資料。

    1. 使用以下YAML內容建立nginx.yaml檔案。

      apiVersion: apps/v1
      kind: StatefulSet
      metadata:
        name: nginx
      spec:
        selector:
          matchLabels:
            app: nginx
        serviceName: "nginx"
        replicas: 1
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
              imagePullPolicy: IfNotPresent
              volumeMounts:
              - name: disk
                mountPath: /data
        volumeClaimTemplates:
        - metadata:
            name: disk
          spec:
            accessModes: [ "ReadWriteOnce" ]
            storageClassName: "alicloud-disk-topology-alltype"
            resources:
              requests:
                storage: 20Gi 
    2. 建立應用。

      kubectl apply -f nginx.yaml
    3. 查看Pod部署狀態。

      kubectl get pod -l app=nginx

      預期返回:

      NAME        READY   STATUS    RESTARTS   AGE
      nginx-0     1/1     Running   0          82s
    4. 向掛載路徑寫入資料。

      kubectl exec -it nginx-0 -- touch /data/test
      kubectl exec -it nginx-0 -- ls /data

      預期返回:

      lost+found test
  3. 建立VolumeSnapshot。

    重要
    • 如果CSI組件版本不低於v1.22.12-b797ad9-aliyun,則建立快照時,不依賴該是否有Running Pod在使用PVC,可對任意掛載過的雲端硬碟建立快照。

    • 如果CSI組件版本低於v1.22.12-b797ad9-aliyun,則建立快照時,需要保證有Running Pod正在使用當前PVC,即保證雲端硬碟處於掛載狀態。

    1. 使用以下YAML內容建立snapshot-1.yaml檔案。

      apiVersion: snapshot.storage.k8s.io/v1
      kind: VolumeSnapshot
      metadata:
        name: new-snapshot-demo
        namespace: default
      spec:
        volumeSnapshotClassName: default-snapclass   # 關聯VolumeSnapshotClass
        source:
          persistentVolumeClaimName: disk-nginx-0
    2. 建立VolumeSnapshot。

      kubectl apply -f snapshot-1.yaml
  4. 查看VolumeSnapshot和VolumeSnapshotContent。

    說明

    您也可以登入ECS控制台查看VolumeSnapshotContent對應的快照。

    1. 查看VolumeSnapshot。

      kubectl get volumesnapshots

      預期返回:

      NAME                READYTOUSE   SOURCEPVC      SOURCESNAPSHOTCONTENT   RESTORESIZE   SNAPSHOTCLASS       SNAPSHOTCONTENT                                    CREATIONTIME   AGE
      new-snapshot-demo   true         disk-nginx-0                           20Gi          default-snapclass   snapcontent-48b04625-679a-490f-9ef3-f04b2b8e6c57   28s            28s
    2. 查看VolumeSnapshotContent。

      kubectl get VolumeSnapshotContent

      預期返回:

      NAME                                               READYTOUSE   RESTORESIZE   DELETIONPOLICY   DRIVER                            VOLUMESNAPSHOTCLASS   VOLUMESNAPSHOT      VOLUMESNAPSHOTNAMESPACE   AGE
      snapcontent-48b04625-679a-490f-9ef3-f04b2b8e6c57   true         21474836480   Delete           diskplugin.csi.alibabacloud.com   default-snapclass     new-snapshot-demo   default                   49s
  5. (可選)使用VolumeSnapshot建立一個新的應用,以此恢複資料。

    1. 使用以下YAML內容建立nginx-restore檔案。

      volumeClaimTemplates中,需設定dataSource.kindVolumeSnapshot,且dataSource.name為VolumeSnapshot名稱。

      apiVersion: apps/v1
      kind: StatefulSet
      metadata:
        name: nginx-restore
      spec:
        selector:
          matchLabels:
            app: nginx
        serviceName: "nginx"
        replicas: 1
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
              imagePullPolicy: IfNotPresent
              volumeMounts:
              - name: disk
                mountPath: /data
        volumeClaimTemplates:
        - metadata:
            name: disk
          spec:
            accessModes: [ "ReadWriteOnce" ]
            storageClassName: "alicloud-disk-topology-alltype"
            resources:
              requests:
                storage: 20Gi
            dataSource:
              name: new-snapshot-demo
              kind: VolumeSnapshot
              apiGroup: snapshot.storage.k8s.io
    2. 建立應用。

      kubectl apply -f nginx-restore.yaml
    3. 查看掛載路徑的資料,確認資料是否已經恢複。

      kubectl exec -it nginx-restore-0 -- ls /data

      返回樣本:

      lost+found test
  6. (可選)若您暫時不需要建立工作負載,可以使用VolumeSnapshot建立一個PVC。

    1. 使用以下YAML內容建立pvc-restore檔案。

      需設定dataSource.kindVolumeSnapshot,且dataSource.name為VolumeSnapshot名稱。

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: pvc-disk
        namespace: default
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 20Gi
        dataSource:
          name: new-snapshot-demo
          kind: VolumeSnapshot
          apiGroup: snapshot.storage.k8s.io
        storageClassName: alicloud-disk-topology-alltype
        volumeMode: Filesystem
    2. 建立PVC。

      說明

      對於以alicloud-disk-topology-alltype為例的VolumeBindingMode類型為WaitForFirstConsumer的儲存類,建立出的PVC會處於Pending狀態,直到被第一次掛載,期間需要保證VolumeSnapshot、VolumeSnapshotContent資源及對應的ECS快照執行個體未被刪除。

      kubectl apply -f pvc-restore.yaml

靜態建立快照(使用已有ECS快照)

如果您已在ECS控制台雲端式盤建立了快照,可參考以下步驟將ECS快照匯入至ACK叢集中。

  1. 基於已有ECS快照建立VolumeSnapshotContent。

    1. 使用以下YAML內容建立snapshot-content.yaml檔案。

      apiVersion: snapshot.storage.k8s.io/v1
      kind: VolumeSnapshotContent
      metadata:
        name: new-snapshot-content-test
      spec:
        deletionPolicy: Retain
        driver: diskplugin.csi.alibabacloud.com
        source:
          snapshotHandle: <YOUR-SNAPSHOTID>
        volumeSnapshotRef:
          name: new-snapshot-demo
          namespace: default

      參數

      描述

      snapshotHandle

      已有快照的ID。您可以在ECS控制台快照頁面擷取快照ID。

      volumeSnapshotRef

      填寫要建立的VolumeSnapshot的資訊。

      • name:將要建立的VolumeSnapshot的名稱。

      • namespace:將要建立的VolumeSnapshot所在的命名空間。

    2. 建立VolumeSnapshotContent。

      kubectl apply -f snapshot-content.yaml
  2. 建立VolumeSnapshot,並綁定VolumeSnapshotContent。

    1. 使用以下YAML內容建立snapshot-2.yaml檔案。

      apiVersion: snapshot.storage.k8s.io/v1
      kind: VolumeSnapshot
      metadata:
        name: new-snapshot-demo
        namespace: default
      spec:
        source:
          volumeSnapshotContentName: new-snapshot-content-test

      參數

      描述

      metadata.name

      VolumeSnapshot名稱,需要和VolumeSnapshotContent中volumeSnapshotRef.name的配置一致。

      volumeSnapshotContentName

      要綁定的VolumeSnapshotContent的名稱。

    2. 建立VolumeSnapshot。

      kubectl apply -f snapshot-2.yaml
  3. (可選)使用VolumeSnapshot建立一個新的應用,以此恢複資料。

    1. 使用以下YAML內容建立nginx-restore檔案。

      volumeClaimTemplates中,需設定dataSource.kindVolumeSnapshot,且dataSource.name為VolumeSnapshot名稱。

      apiVersion: apps/v1
      kind: StatefulSet
      metadata:
        name: nginx-restore
      spec:
        selector:
          matchLabels:
            app: nginx
        serviceName: "nginx"
        replicas: 1
        template:
          metadata:
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
              imagePullPolicy: IfNotPresent
              volumeMounts:
              - name: disk
                mountPath: /data
        volumeClaimTemplates:
        - metadata:
            name: disk
          spec:
            accessModes: [ "ReadWriteOnce" ]
            storageClassName: "alicloud-disk-topology-alltype"
            resources:
              requests:
                storage: 20Gi
            dataSource:
              name: new-snapshot-demo
              kind: VolumeSnapshot
              apiGroup: snapshot.storage.k8s.io
    2. 建立應用。

      kubectl apply -f nginx-restore.yaml
    3. 查看掛載路徑的資料,確認資料是否已經恢複。

      kubectl exec -it nginx-restore-0 -- ls /data

      返回樣本:

      lost+found test