ディスクからボリュームスナップショットを作成してアプリケーションデータをバックアップし、ボリュームスナップショットからアプリケーションデータを復元できます。このトピックでは、VolumeSnapshot リソースを使用してディスクボリュームからボリュームスナップショットを作成する方法と、ボリュームスナップショットからデータを復元する方法について説明します。
前提条件
ACK マネージドクラスターが作成されている。また、クラスターの Kubernetes バージョンが 1.18 以降である。
Elastic Compute Service (ECS) スナップショットサービスがアクティブ化されている。 ECS スナップショットサービスは無料でアクティブ化できます。作成したスナップショットに対してのみ課金されます。詳細については、「ECS スナップショットをアクティブ化する」をご参照ください。
機能の説明
ほとんどの場合、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 がディスクボリュームから動的にプロビジョニングされたスナップショットを作成する方法を示しています。
デフォルトでは、パフォーマンスレベル (PL) が PL0、PL1、PL2、PL3 の企業向け SSD (ESSD) または ESSD AutoPL ディスクのマウントに使用されるボリュームから作成された動的にプロビジョニングされたスナップショットに対して、インスタンスアクセス機能が有効になっています。
次の表に手順を示します。
ステップ | 説明 |
① | ディスクボリュームがマウントされたアプリケーションを作成します。 |
② | VolumeSnapshotClass を使用する VolumeSnapshot を作成します。その後、ACK クラスターは VolumeSnapshotContent とディスクスナップショットを自動的に作成します。 |
③ | PVC を使用してステップ ② で作成したボリュームスナップショットを参照する別のアプリケーションを作成します。 |
前述のステップは、以下の目的を達成するために行われます:
Snapshot1 を使用して Volume1 のデータをバックアップする。
Snapshot1 から Volume2 にデータを復元する。
例
VolumeSnapshotClass を作成する
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 とスナップショットは保持されます。
VolumeSnapshotClass を作成する
kubectl apply -f volumesnapshotclass.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アプリケーションを作成します。
kubectl apply -f nginx.yamlアプリケーション ポッドのデプロイの進行状況を確認します。
kubectl get pod -l app=nginx期待される出力:
NAME READY STATUS RESTARTS AGE nginx-0 1/1 Running 0 82sコンテナーのマウントパスにデータを書き込みます。
kubectl exec -it nginx-0 -- touch /data/test kubectl exec -it nginx-0 -- ls /data期待される出力:
lost+found test
VolumeSnapshot を作成します。
重要クラスターにインストールされている CSI プラグインのバージョンが V1.22.12-b797ad9-aliyun 以降の場合、ディスクボリュームの PVC が Running 状態のポッドによって使用されているかどうかに関係なく、使用中のディスクボリュームからスナップショットを作成できます。
クラスターにインストールされている CSI プラグインのバージョンが V1.22.12-b797ad9-aliyun 以降の場合、PVC が Running 状態のポッドによって使用されているディスクボリュームからのみスナップショットを作成できます。
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-0VolumeSnapshot を作成します。
kubectl apply -f snapshot-1.yaml
VolumeSnapshot と VolumeSnapshotContent を確認します。
説明ECS コンソールの [スナップショット] ページで、VolumeSnapshotContent に対応するボリュームスナップショットを表示することもできます。
次のコマンドを実行して、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次のコマンドを実行して、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
オプション: アプリケーションを作成し、VolumeSnapshot を使用してアプリケーションのデータを復元します。
nginx-restore という名前のファイルを作成し、以下の内容をファイルにコピーします。
volumeClaimTemplatesセクションで、dataSource.nameを作成した VolumeSnapshot に、dataSource.kindを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アプリケーションを作成します。
kubectl apply -f nginx-restore.yamlコンテナーのマウントパスにデータが復元されているかどうかを確認します。
kubectl exec -it nginx-restore-0 -- ls /data期待される出力:
lost+found test
オプション: ワークロードを作成する必要がない場合は、VolumeSnapshot を参照する PVC を作成できます。
次の YAML テンプレートを使用して、pvc-restore ファイルを作成します。
dataSource.kindをVolumeSnapshotに、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: FilesystemPVC を作成します。
説明alicloud-disk-topology-alltype StorageClass の構成では、VolumeBindingMode パラメーターは WaitForFirstConsumer に設定されています。このバインディングモードの StorageClass を使用する PVC は、ポッドにマウントされるまで Pending 状態のままです。したがって、PVC がマウントされる前に、関連する VolumeSnapshot、VolumeSnapshotContent、および ECS スナップショットが削除されていないことを確認してください。
kubectl apply -f pvc-restore.yaml
既存のディスクスナップショットから静的にプロビジョニングされたボリュームスナップショットを作成する
既存のディスクスナップショットを ACK クラスターにインポートするには、次の手順を実行します:
既存のディスクスナップショットを使用して VolumeSnapshotContent を作成します。
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 を取得できます。
volumeSnapshotRefVolumeSnapshotContent に対して作成される VolumeSnapshot に関する情報。
name: VolumeSnapshot の名前。namespace: VolumeSnapshot が属する名前空間。
VolumeSnapshotContent を作成します:
kubectl apply -f snapshot-content.yaml
VolumeSnapshot を作成し、作成した VolumeSnapshotContent とバインドします。
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.nameVolumeSnapshot の名前。値は、作成した VolumeSnapshotContent の
volumeSnapshotRef.nameパラメーターの値と同じである必要があります。volumeSnapshotContentNameVolumeSnapshot をバインドする VolumeSnapshotContent の名前。
VolumeSnapshot を作成します。
kubectl apply -f snapshot-2.yaml
オプション: アプリケーションを作成し、VolumeSnapshot を使用してアプリケーションのデータを解凍します。
nginx-restore という名前のファイルを作成し、次の内容をファイルにコピーします。
dataSource.nameを作成した VolumeSnapshot に設定し、dataSource.kindをvolumeClaimTemplatesセクションの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アプリケーションを作成します。
kubectl apply -f nginx-restore.yamlコンテナーのマウントパスにデータが解凍されているかどうかを確認します。
kubectl exec -it nginx-restore-0 -- ls /data期待される出力:
lost+found test