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

Container Service for Kubernetes:複数のディスクボリュームのグループスナップショットの作成

最終更新日:Jan 21, 2025

ディスクからボリュームスナップショットを作成してアプリケーションデータをバックアップし、ボリュームスナップショットからアプリケーションデータを復元できます。 Container Service for Kubernetes (ACK) クラスターで複数のディスクが使用されている場合、VolumeSnapshotリソースを使用して、各ディスクからボリュームスナップショットを作成できます。 ただし、スナップショットは同時に作成されない可能性があり、スナップショット間でデータの不一致が発生する可能性があります。 この場合、ディスクからグループスナップショットを作成して、ディスク上のデータを一元的に管理およびバックアップできます。 これにより、非同期ボリューム作成によるデータの不整合のリスクを軽減できます。

前提条件

  • Kubernetes 1.28以降を実行するACKマネージドクラスターが作成されます。 詳細については、「ACK管理クラスターの作成」をご参照ください。

  • Container Storage Interface (CSI) プラグインがクラスターにインストールされており、CSIプラグインのバージョンは1.31.4以降です。 csi-pluginおよびcsi-provisionerを更新する方法の詳細については、「csi-pluginおよびcsi-provisionerの更新」をご参照ください。

    説明

    ACKで廃止されたFlexVolumeをクラスターが使用している場合は、FlexVolumeからCSIにアップグレードし、グループスナップショットを作成します。 詳細については、「FlexVolumeからCSIへのアップグレード」をご参照ください。 ACKコンソールのクラスター詳細ページに移動します。 左側のナビゲーションウィンドウで、[操作] > [アドオン] を選択します。 次に、[ストレージ] タブをクリックして、クラスターにインストールされているボリュームプラグインのタイプを確認します。

  • Elastic Compute Service (ECS) スナップショットサービスが有効化されています。 ECSスナップショットサービスを無料で有効化できます。 作成したスナップショットに対してのみ課金されます。 詳細については、「ECSスナップショットの有効化」をご参照ください。

  • kubectlクライアントがクラスターに接続されています

課金

グループスナップショットは、ECSのsnapshot-consistent Group機能に基づいて実装されます。 スナップショット一貫性グループは無料ですが、スナップショット一貫性グループ内のスナップショットは、スナップショットによって消費されたストレージ容量に基づいて課金されます。 詳細については、「スナップショット課金」をご参照ください。

制限事項

グループスナップショットとECSスナップショットにも同じ制限が適用されます。 詳細については、「制限事項」をご参照ください。

使用上の注意

ACKは、グループスナップショットを管理するカスタムリソースを作成するために使用できる次のCustomResourceDefinitions (CRD) を提供します。

CRD

説明

VolumeGroupSnapshotClass

削除ポリシーなど、VolumeGroupSnapshotの作成に使用するパラメーターを指定します。

VolumeGroupSnapshot

ボリュームグループのスナップショットの要求。 VolumeGroupSnapshotは、バックアップするディスクを指定します。

VolumeGroupSnapshotContent

ECSスナップショット整合性グループに関する情報を記録します。

VolumeSnapshot

ボリュームスナップショットの要求。 VolumeGroupSnapshotを作成すると、同時にバックアップするディスクに対してVolumeSnapshotのグループが自動的に作成されます。

VolumeSnapshotContent

ECSスナップショットに関する情報を記録します。

VolumeGroupSnapshotClassはStorageClassに似ています。 VolumeGroupSnapshotは、永続ボリュームクレーム (PVC) に似ています。 VolumeGroupSnapshotContentは、永続ボリューム (PV) に似ています。 VolumeGroupSnapshotを作成した後、CSIはECSスナップショット一貫性グループを作成し、VolumeSnapshotsとVolumeSnapshotContentsのグループを自動的に生成します。 ディスクでエラーが発生した場合は、ディスクをバックアップするVolumeSnapshotを使用して、ディスク上のデータを復元できます。

例:

1. グループスナップショットに関連する機能ゲートを有効にする

グループスナップショットを作成する前に、EnableVolumeGroupSnapshots機能ゲートを有効にする必要があります。

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、[操作] > [アドオン] を選択します。

  3. [アドオン] ページで、csi-provisionerカードを見つけ、csi-provisionerカードの右下隅にある [設定] をクリックします。

  4. csi-provisionerのパラメーターダイアログボックスで、FeatureGateフィールドにEnableVolumeGroupSnapshots=trueを指定し、OKをクリックします。

    他のフィーチャゲートが有効になっている場合は、FeatureGateフィールドをxxxxxx=true、yyyyy=false、EnableVolumeGroupSnapshots=true形式に設定します。

2. MySQLアプリケーションの作成

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

    をクリックしてmysql.yamlファイルの内容を表示します

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: mysql
    spec:
      selector:
        matchLabels:
          app: mysql
      serviceName: "mysql"
      replicas: 2
      template:
        metadata:
          labels:
            app: mysql
        spec:
          containers:
          - name: mysql
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/mysql:8.0.30-8.6
            env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-pass
                  key: password
            imagePullPolicy: IfNotPresent
            volumeMounts:
            - name: data
              # The directory of MySQL data.
              mountPath: /var/lib/mysql
              subPath: mysql
      volumeClaimTemplates:
      - metadata:
          name: data
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: "alicloud-disk-essd"
          resources:
            requests:
              storage: 20Gi
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: mysql-pass
    type: Opaque
    data:   # The username and password used to log on to the MySQL database. The following data is encoded in Base64. 
      password: MTIzNDU2   
      username: cm9vdA==  
    
  2. MySQLをデプロイするステートフルなアプリケーションを作成します。

    kubectl apply -f mysql.yaml
  3. MySQLアプリケーションの2つのポッドレプリカにデータを書き込みます。

    1. mysql-0ポッドにログインし、MySQLデータベースに接続します。

      kubectl exec -it mysql-0 -- bash  # Log on to the pod. 
      mysql -uroot -p123456  # Connect to the MySQL database.
    2. 次のコマンドを実行して、データベースにデータを書き込みます。

      create database test;
      use test;
      create table scores( name VARCHAR(50) NOT NULL, score INT AUTO_INCREMENT PRIMARY KEY );
      insert into scores(name,score) values("Amy",95);
      select * from scores;

      期待される出力:

      +------+-------+
      | name | score |
      +------+-------+
      | Amy  |    95 |
      +------+-------+
    3. 上記の操作を再度実行して、mysql-1ポッドにデータを書き込みます。

3. MySQLアプリケーションのグループスナップショットの作成

  1. VolumeGroupSnapshotClassを作成します。

    alibabacloud-disk-group-snapshotという名前のデフォルトのVolumeGroupSnapshotClassがクラスターに作成されます。 次のgroup-snapshot-class-demo.yamlファイルを使用して、カスタムVolumeGroupSnapshotClassを作成できます。

    apiVersion: groupsnapshot.storage.k8s.io/v1alpha1
    kind: VolumeGroupSnapshotClass
    metadata:
      name: group-snapshot-class-demo
    deletionPolicy: Delete
    driver: diskplugin.csi.alibabacloud.com

    deletionPolicyパラメーターの有効な値:

    • 削除: VolumeGroupSnapshotを削除すると、VolumeGroupSnapshotContentと関連するグループスナップショットも削除されます。

    • 保持: VolumeGroupSnapshotを削除すると、VolumeGroupSnapshotContentと関連するグループスナップショットが保持されます。

    説明

    ECSスナップショット整合性グループの有効期限を設定することはできません。 グループスナップショットを手動で削除する必要があります。

  2. VolumeGroupSnapshotClassを作成します。

    kubectl apply -f group-snapshot-class-demo.yaml
  3. 次のgroup-snapshot-demo.yamlファイルを使用して、MySQLアプリケーションにマウントされた2つのディスクボリュームからグループスナップショットを作成します。

    apiVersion: groupsnapshot.storage.k8s.io/v1alpha1
    kind: VolumeGroupSnapshot
    metadata:
      name: group-snapshot-demo
      namespace: default
    spec:
      source:
        selector:
          matchLabels:
            app: mysql
      volumeGroupSnapshotClassName:
        group-snapshot-class-demo

    source.selector: バックアップ用のPVCを選択するためにVolumeGroupSnapshotが使用するラベルセレクタ。

    volumeClaimTemplatesセクションのパラメーターに基づいて作成されたPVCに、PVCがマウントされているアプリケーションを示すラベルが追加されます。 他の方法を使用してアプリケーションで使用されるPVCを作成する場合は、手動でPVCにラベルを追加して、PVCがマウントされているアプリケーションを示す必要があります。

  4. グループスナップショットを作成します。

    kubectl apply -f group-snapshot-demo.yaml

4. グループスナップショットが作成されているかどうかを確認する

  1. VolumeGroupSnapshotsを照会します。 VolumeGroupSnapshotsが作成されている場合は、作成されるまで待ちます。

    kubectl get vgs group-snapshot-demo -w

    READYTOUSEパラメーターの値がfalseからtrueに変更された場合、グループスナップショットが作成されます。

  2. バックアップされたPVCと、バックアップPVCごとに作成されたVolumeSnapshotを照会します。

    kubectl describe vgs group-snapshot-demo

    期待される出力:

    Status:
      Bound Volume Group Snapshot Content Name: groupsnapcontent-adcef6ef-811a-4e9d-ba51-3927caxxxxxx
      Creation Time: 2024-11-27T06:02:56Z
      Pvc Volume Snapshot Ref List:
        Persistent Volume Claim Ref:
          Name: disk-mysql-0
        Volume Snapshot Ref:
          Name: snapshot-1c2c5bcaf47ee2bffcc5b2f52dff65a4aacaaea38032c05d75acd536f7xxxxxx-2024-11-27-6.4.7
        Persistent Volume Claim Ref:
          Name: disk-mysql-1
        Volume Snapshot Ref:
          Name: snapshot-37a2fbf634d68cd2103f261313c2ed781fbd2bd52b5a0d0e0c0ef7c339xxxxxx-2024-11-27-6.4.9

    パラメーター

    説明

    バインドされたボリュームグループのスナップショットコンテンツ名

    VolumeGroupSnapshotにバインドされたVolumeGroupSnapshotContent。

    PvcボリュームスナップショットRef List

    PVCに関連付けられたVolumeSnapshot。 以下のパラメータが表示されます。

    • Persistent Volume Claim Ref: バックアップPVCの名前。

    • Volume Snapshot Ref: PVC用に作成されたVolumeSnapshotの名前。

  3. 作成されたVolumeSnapshotsを照会します。

    kubectl get volumesnapshot \ 

    期待される出力:

    snapshot-1c2c5bcaf47ee2bffcc5b2f52dff65a4aacaaea38032c05d75acd536f7xxxxxx-2024-11-27-6.4.7 \
    snapshot-37a2fbf634d68cd2103f261313c2ed781fbd2bd52b5a0d0e0c0ef7c339xxxxxx-2024-11-27-6.4.9

    2つのVolumeSnapshotのREADYTOUSEパラメーターの値が両方ともtrueの場合、VolumeSnapshotが作成されます。

  4. 作成されたECSスナップショット整合性グループを照会します。

    kubectl describe vgsc groupsnapcontent-adcef6ef-811a-4e9d-ba51-3927caxxxxxx

    期待される出力:

      Volume Group Snapshot Handle:  ssg-2zeg72d1qym6vnxxxxxx

    ECS コンソールに移動します。 左側のナビゲーションウィンドウで、[ストレージとスナップショット] > [スナップショット] を選択します。 [スナップショット整合性グループ] タブで、検索ボックスにssg-2zeg72d1qym6vnxxxxxx (上記の出力で返されたスナップショット整合性グループID) を入力し、検索アイコンをクリックします。 作成されたスナップショット整合性グループを表示できます。

5. スナップショットからディスクボリュームを復元する

ディスクボリュームを1つずつ手動で復元するか、スナップショットからディスクボリュームを1つのバッチで復元するスクリプトを実行することができます。

手動でディスクボリュームを1つずつ復元する

disk-mysql-0ポッドにマウントされているディスクボリュームを復元する例を次に示します。

  1. disk-mysql-0-copy.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。 このファイルは、ディスクボリュームをプロビジョニングできるPVCを作成するために使用されます。 CSIは、PVCに基づいて新しいディスクを自動的に作成します。 ディスクには、disk-mysql-0ポッドに接続されているディスクと同じデータが格納されます。

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: disk-mysql-0-copy
    spec:
      volumeMode: Filesystem
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi 
      storageClassName: "alicloud-disk-essd"
      dataSource:
        # The VolumeSnapshot created for the PVC mounted to the disk-mysql-0 pod. 
        name: snapshot-1c2c5bcaf47ee2bffcc5b2f52dff65a4aacaaea38032c05d75acd536f7xxxxxx-2024-11-27-6.4.7
        kind: VolumeSnapshot
        apiGroup: snapshot.storage.k8s.io
  2. ディスクボリュームを復元します。

    kubectl apply -f disk-mysql-0-copy.yaml
  3. 作成されたPVCを照会します。

    kubectl get pvc disk-mysql-0-copy

    期待される出力:

    disk-mysql-0-copy   Bound    d-2ze0iwwqg0s6b0xxxxxx             20Gi       RWO            alicloud-disk-essd               <unset>                 69s

    ECS コンソールに移動します。 左側のナビゲーションウィンドウで、[ストレージとスナップショット] > [ストレージのブロック] を選択します。 [クラウドディスク] タブで、検索ボックスにd-2ze0iwwqg0s6b0xxxxxx (上記の出力で返されたディスクID) を入力し、検索アイコンをクリックします。 作成されたディスクを表示できます。 ディスクIDをクリックして、ディスクの詳細ページに移動します。 ディスクがスナップショットから作成されていることがわかります。

スナップショットからディスクボリュームを1回のバッチで復元するためのスクリプトの実行

次の例では、グループスナップショットを使用して、MySQLアプリケーションにマウントされたPVCを1回のバッチで復元する方法について説明します。

  1. MySQLアプリケーションによってプロビジョニングされたポッドレプリカの数をゼロにスケーリングします。

    kubectl scale sts mysql --replicas=0
  2. MySQLアプリケーションにマウントされている2つのディスクボリュームを削除します。

    kubectl delete pvc data-mysql-0 data-mysql-1
  3. 次の内容を使用してgenerate_pvc.shという名前のスクリプトを作成し、そのスクリプトを使用してスナップショットからPVCを順番に展開するYAMLファイルを作成します。

    1. 最初にjqコマンドラインツールをインストールする必要があります。

      クリックしてjqのインストール方法を表示

      • CentOS:

        yum install jq 
      • Ubuntu:

        apt-get install jq

      クリックしてgenerate_pvc.shスクリプトのコンテンツを表示

      #!/bin/bash
      
      # Input parameters. 
      NAMESPACE=$1
      VGS_NAME=$2
      STORAGE_CLASS_NAME=$3
      CAPACITY=$4
      KUBECONFIG_PATH=$5
      OUTPUT_FILE=$6
      
      # Obtain information about the specified VolumeGroupSnapshot. 
      VGS_INFO=$(kubectl --kubeconfig=${KUBECONFIG_PATH} -n ${NAMESPACE} get vgs ${VGS_NAME} -o json)
      
      # Check whether the .status.pvcVolumeSnapshotRefList parameter exists. 
      if !  echo ${VGS_INFO} | jq -e '.status.pvcVolumeSnapshotRefList' &>/dev/null; then
        echo "Error: .status.pvcVolumeSnapshotRefList not found in VolumeGroupSnapshot."
        exit 1
      fi
      
      # Parse the .status.pvcVolumeSnapshotRefList parameter. 
      PVCS=($(echo ${VGS_INFO} | jq -r '.status.pvcVolumeSnapshotRefList[].persistentVolumeClaimRef.name'))
      SNAPSHOTS=($(echo ${VGS_INFO} | jq -r '.status.pvcVolumeSnapshotRefList[].volumeSnapshotRef.name'))
      
      # Clear the output file. 
      > ${OUTPUT_FILE}
      
      # Generate the YAML files of N PVCs. 
      for i in "${!PVCS[@]}"; do
        PVC_NAME=${PVCS[$i]}
        SNAPSHOT_NAME=${SNAPSHOTS[$i]}
      
        cat <<EOF >> ${OUTPUT_FILE}
      ---
      kind: PersistentVolumeClaim
      apiVersion: v1
      metadata:
        name: ${PVC_NAME}
      spec:
        volumeMode: Filesystem
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: ${CAPACITY}
        storageClassName: "${STORAGE_CLASS_NAME}"
        dataSource:
          name: ${SNAPSHOT_NAME}
          kind: VolumeSnapshot
          apiGroup: snapshot.storage.k8s.io
      EOF
      done
      
      echo "PVC YAML files have been written to ${OUTPUT_FILE}"

      次の表に、generate_pvc.shスクリプトの入力パラメーターを示します。

      入力パラメータ

      説明

      1

      VolumeGroupSnapshotが属する名前空間。

      default

      2

      VolumeGroupSnapshotの名前。

      group-snapshot-デモ

      3

      StorageClassの名前。

      alicloud-disk-essd

      4

      ディスク容量。

      20Gi

      5

      kubeconfigファイルのパス。

      . kube/config (デフォルト)

      6

      生成されたPVC YAMLファイルのパス。

      . /output.yaml

    2. スナップショットから作成されたPVCのYAMLファイルを生成します。

      bash generate_pvc.sh default group-snapshot-demo alicloud-disk-essd 20Gi .kube/config ./output.yaml

      次のYAMLテンプレートに、output.yamlファイルの例を示します。 ビジネス要件に基づいてファイルを編集し、クラスターにファイルをデプロイできます。

      ---
      kind: PersistentVolumeClaim
      apiVersion: v1
      metadata:
        name: disk-mysql-0
      spec:
        volumeMode: Filesystem
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 20Gi
        storageClassName: "alicloud-disk-essd"
        dataSource:
          name: snapshot-1c2c5bcaf47ee2bffcc5b2f52dff65a4aacaaea38032c05d75acd536f7adb850-2024-11-27-6.4.7
          kind: VolumeSnapshot
          apiGroup: snapshot.storage.k8s.io
      ---
      kind: PersistentVolumeClaim
      apiVersion: v1
      metadata:
        name: disk-mysql-1
      spec:
        volumeMode: Filesystem
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 20Gi
        storageClassName: "alicloud-disk-essd"
        dataSource:
          name: snapshot-37a2fbf634d68cd2103f261313c2ed781fbd2bd52b5a0d0e0c0ef7c3396fea1c-2024-11-27-6.4.9
          kind: VolumeSnapshot
          apiGroup: snapshot.storage.k8s.io
    3. 出力. yamlファイルをクラスターにデプロイして、ディスクのPVCを1つのバッチで復元します。

      kubectl apply -f output.yaml
  4. MySQLアプリケーションによってプロビジョニングされたポッドレプリカの数を2つにスケーリングします。

    kubectl scale sts mysql --replicas=2
  5. アプリケーションの再起動後、データが復元されているかどうかを確認します。

    kubectl exec -it mysql-0 -- bash   # Log on to the pod. 
    mysql -uroot -p123456              # Run this command in the pod. 
    use test;                          # Run this command in the database. 
    select * from scores;

    期待される出力:

    +------+-------+
    | name | score |
    +------+-------+
    | Amy  |    95 |
    +------+-------+

関連ドキュメント

ディスクボリュームのスナップショットを作成する方法の詳細については、「ディスクボリュームのスナップショットの作成」をご参照ください。