Container Service for Kubernetes (ACK) を使用すると、ディスクからボリュームスナップショットを作成し、ボリュームスナップショットを使用してアプリケーションデータを復元できます。 このトピックでは、ボリュームスナップショットに関連する基本的な用語と、ACKクラスターでボリュームスナップショットを使用する方法について説明します。 このトピックでは、ボリュームスナップショットを動的および静的に作成する方法についても説明します。
前提条件
Kubernetes 1.18以降を実行するACKクラスターが作成されます。 詳細については、「ACK管理クラスターの作成」をご参照ください。
Elastic Compute Service (ECS) コンソールにログインし、クラスターがデプロイされているリージョンを選択します。 ボリュームスナップショット機能が有効になっていることを確認してください。 詳細については、「ECSスナップショットの有効化」をご参照ください。
背景情報
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クラスターで使用されるディスクからボリュームスナップショットを動的に作成する手順を示しています。
PL0拡張SSD (ESSD) 、PL1 ESSD、PL2 ESSD、PL3 ESSD、またはESSD AutoPLディスクを使用する場合、動的に作成されるスナップショットは、デフォルトでインスタントアクセス機能が有効になっています。
次の表に、プロシージャで実行される手順を示します。
ステップ | 説明 |
① | アプリケーションを作成し、アプリケーションデータを保存するディスクボリュームを作成します。 |
② | VolumeSnapshotを作成します。 その後、ACKクラスターは自動的にVolumeSnapshotContentとボリュームスナップショットを作成します。 |
③ | 別のアプリケーションを作成し、そのアプリケーションのPVCを作成し、手順2で作成したボリュームスナップショットをPVCのソースとして指定します。 |
上記の手順を実行して、次の機能を有効にします。
バックアップ: スナップショット1は、ボリューム1のデータをバックアップするために作成されます。
復元: スナップショット1は、ボリューム1のデータをボリューム2に復元するために使用されます。
次の例は、ボリュームスナップショットを使用してMySQLアプリケーションを作成し、アプリケーションのデータを復元する方法を示しています。 次の手順では、ボリュームスナップショットを使用してアプリケーションのデータを復元する方法を示します。
VolumeSnapshotClassを作成します。
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" に設定します。
次のコマンドを実行して、VolumeSnapshotClassを作成します。
kubectl apply -f volumesnapshotclass.yaml
アプリケーションを作成し、アプリケーションにデータを書き込みます。
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****
次のコマンドを実行して、MySQLアプリケーションを作成します。
kubectl apply -f mysql.yaml
次のコマンドを実行して、データをポッドmysql-0に書き込みます。
kubectl exec -it mysql-0 -- touch /data/test kubectl exec -it mysql-0 -- ls /data
期待される出力:
lost+found test
VolumeSnapshotを作成します。
説明クラスターで使用されるContainer Storage Interface (CSI) プラグインのバージョンがV1.22.12-b797ad9-aliyun以降の場合、ディスクボリュームのPVCが実行中のポッドで使用されているかどうかに関係なく、ディスクボリュームからスナップショットを作成できます。 CSIバージョンの詳細については、「csi-provisioner」をご参照ください。
クラスターで使用されているCSIプラグインのバージョンがV1.22.12-b797ad9-aliyunより前の場合、ポッドにマウントされているディスクボリュームからのみスナップショットを作成できます。 つまり、ディスクボリュームのPVCをポッドで使用する必要があります。
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
次のコマンドを実行して、VolumeSnapshotを作成します。
kubectl apply -f snapshot.yaml
次のコマンドを実行して、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
データを復元します。
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で作成されます。
次のコマンドを実行して、アプリケーションデータを復元します。
kubectl apply -f mysql-restore.yaml
次のコマンドを実行して、ポッドmysql-restore-0のアプリケーションデータを表示します。
kubectl exec -it mysql-restore-0 -- ls /data
期待される出力:
lost+found test
出力は、同じアプリケーションデータが返されたことを示します。 これは、アプリケーションデータが復元されたことを示します。
静的にボリュームスナップショットを作成する (ECSインスタンスから既存のスナップショットをインポートする)
次の手順は、既存のスナップショットをECSインスタンスからACKクラスターにインポートする方法を示しています。
次の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が属する名前空間。
次の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の名前と同じである必要があります。
データを復元します。
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で作成されます。
次のコマンドを実行して、アプリケーションデータを復元します。
kubectl apply -f mysql-restore.yaml
次のコマンドを実行して、ポッドmysql-restore-0のアプリケーションデータを表示します。
kubectl exec -it mysql-restore-0 ls /data
期待される出力:
lost+found test
出力は、同じアプリケーションデータが返されたことを示します。 これは、アプリケーションデータが復元されたことを示します。