すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:ディスクボリュームのスナップショットを作成する

最終更新日:Jun 14, 2025

ディスクからボリュームスナップショットを作成してアプリケーションデータをバックアップし、ボリュームスナップショットからアプリケーションデータを復元できます。このトピックでは、VolumeSnapshot リソースを使用してディスクボリュームからボリュームスナップショットを作成する方法と、ボリュームスナップショットからデータを復元する方法について説明します。

前提条件

機能の説明

ほとんどの場合、Container Service for Kubernetes (ACK) クラスターは、StatefulSet の永続ストレージを有効にするためにディスクボリュームを使用します。 Kubernetes は、ディスクスナップショットと以下の機能に基づいてデータのバックアップと復元を可能にします:

  • VolumeSnapshot: ディスクボリュームのデータをバックアップできるリソース。

  • DataSource: ボリュームスナップショットからデータを復元するために使用される永続ボリューム要求 (PVC) フィールド。

課金説明

ACK クラスターでは、ボリュームスナップショットは Elastic Compute Service (ECS) スナップショットに基づいて実装されます。 ECS スナップショットの使用に対して課金されます。 ECS スナップショットの課金ルールについては、「スナップショットの課金」をご参照ください。

使用上の注意

ボリュームスナップショットに関連する機能を実装するために、ACK は CustomResourceDefinitions (CRD) を使用して、以下のタイプのカスタムリソースを定義します:

リソースタイプ

説明

VolumeSnapshotContent

管理者によって作成および管理されるディスクスナップショット。 VolumeSnapshotContent はどの名前空間にも属しません。 VolumeSnapshotContent は永続ボリューム (PV) に似ています。

VolumeSnapshot

ボリュームスナップショットのリクエスト。ユーザーによって作成および管理されます。 VolumeSnapshot は特定の名前空間に属します。 VolumeSnapshot は PVC に似ています。

VolumeSnapshotClass

ボリュームスナップショットの属性 (ボリュームスナップショットの作成に使用されるパラメーターやコントローラーなど) を指定します。 VolumeSnapshotClass は StorageClass に似ています。

以下のリストは、前述のリソース間の関係を示しています:

  • ボリュームスナップショットを作成する場合は、VolumeSnapshot を VolumeSnapshotContent にバインドする必要があります。このバインドは、PVC と PV のバインドに似ています。

  • VolumeSnapshot の VolumeSnapshotClassName パラメーターを指定すると、ACK クラスターは VolumeSnapshot の VolumeSnapshotContent を自動的に作成します。 VolumeSnapshotClassName パラメーターが無効な値に設定されているか、指定されていない場合、クラスターは VolumeSnapshotContent を自動的に作成しません。この場合、VolumeSnapshotContent を手動で作成し、VolumeSnapshotContent を VolumeSnapshot にバインドする必要があります。

  • VolumeSnapshotContent と VolumeSnapshot の間のバインドは、1 対 1 のマッピングです。

重要

VolumeSnapshotContent を削除すると、関連するボリュームスナップショットも削除されます。

ボリュームスナップショットを動的に作成する

手順

次の図は、ACK がディスクボリュームから動的にプロビジョニングされたスナップショットを作成する方法を示しています。snapshot

重要

デフォルトでは、パフォーマンスレベル (PL) が PL0、PL1、PL2、PL3 の企業向け SSD (ESSD) または ESSD AutoPL ディスクのマウントに使用されるボリュームから作成された動的にプロビジョニングされたスナップショットに対して、インスタンスアクセス機能が有効になっています。

次の表に手順を示します。

ステップ

説明

ディスクボリュームがマウントされたアプリケーションを作成します。

VolumeSnapshotClass を使用する VolumeSnapshot を作成します。その後、ACK クラスターは VolumeSnapshotContent とディスクスナップショットを自動的に作成します。

PVC を使用してステップ ② で作成したボリュームスナップショットを参照する別のアプリケーションを作成します。

前述のステップは、以下の目的を達成するために行われます:

  • Snapshot1 を使用して Volume1 のデータをバックアップする。

  • Snapshot1 から Volume2 にデータを復元する。

  1. VolumeSnapshotClass を作成する

    1. 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 1.26.5-92f859a-aliyun 以降では、デフォルト値は "false" です。 csi-provisioner 1.26.5-92f859a-aliyun より前のバージョンでは、デフォルト値は "true" です。有効な値:

      • "true": すべてのボリュームスナップショットを強制的に削除します。

      • "false": 使用されていないスナップショットのみを削除します。

      deletionPolicy

      ボリュームスナップショットの再利用ポリシー。有効な値:

      • Delete: VolumeSnapshot を削除すると、対応する VolumeSnapshotContent とスナップショットも削除されます。

      • Retain: VolumeSnapshot を削除すると、対応する VolumeSnapshotContent とスナップショットは保持されます。

    2. VolumeSnapshotClass を作成する

      kubectl apply -f volumesnapshotclass.yaml
  2. アプリケーションを作成し、アプリケーションにデータを書き込みます。

    1. 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. アプリケーション ポッドのデプロイの進行状況を確認します。

      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 以降の場合、ディスクボリュームの PVC が Running 状態のポッドによって使用されているかどうかに関係なく、使用中のディスクボリュームからスナップショットを作成できます。

    • クラスターにインストールされている CSI プラグインのバージョンが V1.22.12-b797ad9-aliyun 以降の場合、PVC が Running 状態のポッドによって使用されているディスクボリュームからのみスナップショットを作成できます。

    1. snapshot-1.yaml という名前のファイルを作成し、以下の内容をファイルにコピーします:

      apiVersion: snapshot.storage.k8s.io/v1
      kind: VolumeSnapshot
      metadata:
        name: new-snapshot-demo
        namespace: default
      spec:
        volumeSnapshotClassName: default-snapclass   # VolumeSnapshot によって使用される 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. nginx-restore という名前のファイルを作成し、以下の内容をファイルにコピーします。

      volumeClaimTemplates セクションで、dataSource.name を作成した VolumeSnapshot に、dataSource.kindVolumeSnapshot に設定します。

      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 StorageClass の構成では、VolumeBindingMode パラメーターは WaitForFirstConsumer に設定されています。このバインディングモードの StorageClass を使用する PVC は、ポッドにマウントされるまで Pending 状態のままです。したがって、PVC がマウントされる前に、関連する VolumeSnapshot、VolumeSnapshotContent、および ECS スナップショットが削除されていないことを確認してください。

      kubectl apply -f pvc-restore.yaml

既存のディスクスナップショットから静的にプロビジョニングされたボリュームスナップショットを作成する

既存のディスクスナップショットを ACK クラスターにインポートするには、次の手順を実行します:

  1. 既存のディスクスナップショットを使用して VolumeSnapshotContent を作成します。

    1. 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

      VolumeSnapshotContent に対して作成される VolumeSnapshot に関する情報。

      • name: VolumeSnapshot の名前。

      • namespace: VolumeSnapshot が属する名前空間。

    2. VolumeSnapshotContent を作成します:

      kubectl apply -f snapshot-content.yaml
  2. VolumeSnapshot を作成し、作成した VolumeSnapshotContent とバインドします。

    1. 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

      VolumeSnapshot をバインドする VolumeSnapshotContent の名前。

    2. VolumeSnapshot を作成します。

      kubectl apply -f snapshot-2.yaml
  3. オプション: アプリケーションを作成し、VolumeSnapshot を使用してアプリケーションのデータを解凍します。

    1. nginx-restore という名前のファイルを作成し、次の内容をファイルにコピーします。

      dataSource.name を作成した VolumeSnapshot に設定し、dataSource.kindvolumeClaimTemplates セクションの 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