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

Container Service for Kubernetes:ディスクから作成したボリュームスナップショットの使用

最終更新日:Nov 14, 2024

Container Service for Kubernetes (ACK) を使用すると、ディスクからボリュームスナップショットを作成し、ボリュームスナップショットを使用してアプリケーションデータを復元できます。 このトピックでは、ボリュームスナップショットに関連する基本的な用語と、ACKクラスターでボリュームスナップショットを使用する方法について説明します。 このトピックでは、ボリュームスナップショットを動的および静的に作成する方法についても説明します。

前提条件

背景情報

ACKクラスターにステートフルアプリケーションをデプロイする場合、ディスクは通常、アプリケーションデータの格納に使用されます。 ディスクからスナップショットを作成し、これらのスナップショットを使用してアプリケーションデータを復元できます。 ACKを使用すると、スナップショットを使用してデータをバックアップおよび復元することもできます。 次の方法で、ACKクラスターのデータをバックアップおよび復元できます。

  • VolumeSnapshotsを使用してディスクからバックアップ (ボリュームスナップショット) を作成します。

  • dataSourceを関連する永続ボリュームクレーム (PVC) に設定して、データを復元します。

課金ルール

ディスクスナップショットは、Alibaba Cloud ECSスナップショット機能を使用して作成されます。 ECSスナップショットの課金ルールの詳細については、「スナップショット」をご参照ください。

2023年10月12日の11:00 (UTC + 8) 以降、ECSスナップショット機能のインスタントアクセス機能のストレージ料金と機能使用料金は課金されなくなります。 詳細については、「インスタントアクセス機能の使用」をご参照ください。

使用上の注意

ボリュームスナップショットを有効にするには、CustomResourceDefinitions (CRD) を使用して、ACKクラスターに次のリソースを定義します。

リソース名

説明

VolumeSnapshotContent

ACKクラスターのボリュームから作成されたスナップショット。 管理者によって作成および管理されます。 VolumeSnapshotContentは名前空間に属しません。 VolumeSnapshotContentは、永続ボリューム (PV) に似たクラスタリソースです。

VolumeSnapshot

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

VolumeSnapshotClass

スナップショットの作成に使用するパラメーターやコントローラーなど、VolumeSnapshotの属性を指定します。 VolumeSnapshotClassは、StorageClassに似たクラスタリソースです。

ボリュームスナップショットを使用するには、次のルールに基づいてこれらのリソースを相互に関連付ける必要があります。

  • ボリュームスナップショットを使用する前に、PVをPVCに関連付けるのと同じ方法で、VolumeSnapshotをVolumeSnapshotContentに関連付けます。

  • VolumeSnapshotClassNameフィールドに有効な値を指定すると、ACKクラスターは自動的にVolumeSnapshotのVolumeSnapshotContentを作成します。 無効な値を指定した場合、またはVolumeSnapshotClassNameフィールドに値を指定しなかった場合、VolumeSnapshotContentは自動的に作成できません。 この場合、VolumeSnapshotContentを手動で作成し、VolumeSnapshotContentをVolumeSnapshotに関連付ける必要があります。

  • 各VolumeSnapshotContentは、1つのVolumeSnapshotにのみ関連付けることができます。

重要

VolumeSnapshotContentを削除すると、関連付けられたスナップショットも削除されます。

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

次の図は、ACKクラスターで使用されるディスクからボリュームスナップショットを動的に作成する手順を示しています。 snapshot

PL0拡張SSD (ESSD) 、PL1 ESSD、PL2 ESSD、PL3 ESSD、またはESSD AutoPLディスクを使用する場合、動的に作成されるスナップショットは、デフォルトでインスタントアクセス機能が有効になっています。

次の表に、プロシージャで実行される手順を示します。

ステップ

説明

アプリケーションを作成し、アプリケーションデータを保存するディスクボリュームを作成します。

VolumeSnapshotを作成します。 その後、ACKクラスターは自動的にVolumeSnapshotContentとボリュームスナップショットを作成します。

別のアプリケーションを作成し、そのアプリケーションのPVCを作成し、手順2で作成したボリュームスナップショットをPVCのソースとして指定します。

上記の手順を実行して、次の機能を有効にします。

  • バックアップ: スナップショット1は、ボリューム1のデータをバックアップするために作成されます。

  • 復元: スナップショット1は、ボリューム1のデータをボリューム2に復元するために使用されます。

次の例は、ボリュームスナップショットを使用してMySQLアプリケーションを作成し、アプリケーションのデータを復元する方法を示しています。 次の手順では、ボリュームスナップショットを使用してアプリケーションのデータを復元する方法を示します。

  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"
      deletionPolicy: Delete

      パラメーター

      説明

      deletionPolicy

      • 値がDeleteに設定されている場合、VolumeSnapshotを削除すると、対応するVolumeSnapshotContentとスナップショットが削除されます。

      • 値がRetainに設定されている場合、VolumeSnapshotを削除するときに、対応するVolumeSnapshotContentとスナップショットが保持されます。

      パラメータ. retentionDays

      このパラメーターは、指定されたスナップショットの自動リサイクル時間を示します。

      パラメーター。forceDelete

      スナップショットを強制的に削除するには、forceDelete"true" に設定します。 デフォルトでは、このパラメーターは指定されていません。 csi-provisioner v1.26.5-92f859a-aliyun以降、forceDeleteはデフォルトで有効になっており、変更することはできません。

      • 値を "true" に設定すると、すべてのスナップショットが削除されます。

      • このパラメーターを指定しない場合、使用されていないスナップショットのみが削除されます。 使用中のスナップショットを削除する場合は、値を "true" に設定します。

    2. 次のコマンドを実行して、VolumeSnapshotClassを作成します。

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

    1. mysql.yamlという名前のファイルを作成し、次のコンテンツをファイルにコピーします。

      apiVersion: apps/v1
      kind: StatefulSet
      metadata:
        name: mysql
      spec:
        selector:
          matchLabels:
            app: mysql
        serviceName: "mysql"
        replicas: 1
        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
              imagePullPolicy: IfNotPresent
              volumeMounts:
              - name: disk
                mountPath: /data
        volumeClaimTemplates:
        - metadata:
            name: disk
          spec:
            accessModes: [ "ReadWriteOnce" ]
            storageClassName: "alicloud-disk-topology-alltype"
            resources:
              requests:
                storage: 20Gi
      ---
      apiVersion: v1
      kind: Secret
      metadata:
        name: mysql-pass
      type: Opaque
      data:
        username: dGVz****            
        password: dGVzdDEt****    
    2. 次のコマンドを実行して、MySQLアプリケーションを作成します。

      kubectl apply -f mysql.yaml
    3. 次のコマンドを実行して、データをポッドmysql-0に書き込みます。

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

      期待される出力:

      lost+found test
  3. VolumeSnapshotを作成します。

    説明
    • クラスターで使用されるContainer Storage Interface (CSI) プラグインのバージョンがV1.22.12-b797ad9-aliyun以降の場合、ディスクボリュームのPVCが実行中のポッドで使用されているかどうかに関係なく、ディスクボリュームからスナップショットを作成できます。 CSIバージョンの詳細については、「csi-provisioner」をご参照ください。

    • クラスターで使用されているCSIプラグインのバージョンがV1.22.12-b797ad9-aliyunより前の場合、ポッドにマウントされているディスクボリュームからのみスナップショットを作成できます。 つまり、ディスクボリュームのPVCをポッドで使用する必要があります。

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

      apiVersion: snapshot.storage.k8s.io/v1
      kind: VolumeSnapshot
      metadata:
        name: new-snapshot-demo
        namespace: default
      spec:
        volumeSnapshotClassName: default-snapclass
        source:
          persistentVolumeClaimName: disk-mysql-0
    2. 次のコマンドを実行して、VolumeSnapshotを作成します。

      kubectl apply -f snapshot.yaml
    3. 次のコマンドを実行して、VolumeSnapshotとVolumeSnapshotContentが作成されているかどうかを確認します。 ECSコンソールにログインしてスナップショットを表示することもできます。

      次のコマンドを実行して、VolumeSnapshotを表示します。

      kubectl get volumesnapshots.snapshot.storage.k8s.io

      期待される出力:

      NAME                      AGE
      new-snapshot-demo                    36m

      次のコマンドを実行して、VolumeSnapshotContentを表示します。

      kubectl get VolumeSnapshotContent

      期待される出力:

      NAME                      AGE
      snapshotcontent-222222                  36m
  4. データを復元します。

    1. mysql-restoreという名前のファイルを作成し、次のコンテンツをファイルにコピーします。

      apiVersion: apps/v1
      kind: StatefulSet
      metadata:
        name: mysql-restore
      spec:
        selector:
          matchLabels:
            app: mysql
        serviceName: "mysql"
        replicas: 1
        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
              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
      説明

      volumeClaimTemplatesセクションのdataSourceフィールドで、kindをVolumeSnapshotに設定し、nameをnew-snapshot-demoに設定します。 new-snapshot-demoスナップショットはステップ3で作成されます。

    2. 次のコマンドを実行して、アプリケーションデータを復元します。

      kubectl apply -f mysql-restore.yaml
  5. 次のコマンドを実行して、ポッドmysql-restore-0のアプリケーションデータを表示します。

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

    期待される出力:

    lost+found test

    出力は、同じアプリケーションデータが返されたことを示します。 これは、アプリケーションデータが復元されたことを示します。

静的にボリュームスナップショットを作成する (ECSインスタンスから既存のスナップショットをインポートする)

次の手順は、既存のスナップショットをECSインスタンスからACKクラスターにインポートする方法を示しています。

  1. 次のYAMLテンプレートを使用して、VolumeSnapshotContentを作成します。

    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

    ECSインスタンスページで生成されるスナップショットIDを入力します。

    volumeSnapshotRef

    作成するVolumeSnapshotの次の情報を入力します。

    • name: VolumeSnapshotの名前。

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

  2. 次のYAMLテンプレートを使用して、VolumeSnapshotを作成します。

    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で指定されたVolumeSnapshot名と同じである必要があります。

    spec.source.volumeSnapshotContentName

    VolumeSnapshotに関連付けられているVolumeSnapshotContentの名前。 名前は、前の手順で作成されたVolumeSnapshotContentの名前と同じである必要があります。

  3. データを復元します。

    1. mysql-restoreという名前のファイルを作成し、次のコンテンツをファイルにコピーします。

      apiVersion: apps/v1
      kind: StatefulSet
      metadata:
        name: mysql-restore
      spec:
        selector:
          matchLabels:
            app: mysql
        serviceName: "mysql"
        replicas: 1
        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
              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
      
      説明

      volumeClaimTemplatesセクションのdataSourceフィールドで、kindをVolumeSnapshotに設定し、nameをnew-snapshot-demoに設定します。 new-snapshot-demoスナップショットはステップ2で作成されます。

    2. 次のコマンドを実行して、アプリケーションデータを復元します。

      kubectl apply -f mysql-restore.yaml
  4. 次のコマンドを実行して、ポッドmysql-restore-0のアプリケーションデータを表示します。

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

    期待される出力:

    lost+found test

    出力は、同じアプリケーションデータが返されたことを示します。 これは、アプリケーションデータが復元されたことを示します。