スナップショットの操作
Kubernetes の Persistent Volume ( PV )のボリュームスナップショットにより、ポイントインタイムのボリュームコピーが可能になります。Trident を使用して作成されたボリュームのスナップショットを作成したり、 Trident 外部で作成されたスナップショットをインポートしたり、既存のスナップショットから新しいボリュームを作成したり、スナップショットからボリュームデータをリカバリしたりできます。
概要
ボリュームスナップショットは ontap-nas、 ontap-nas-flexgroup、 ontap-san、 ontap-san-economy、 solidfire-san、 azure-netapp-files、および `google-cloud-netapp-volumes`ドライバでサポートされています。
スナップショットを操作するには、外部スナップショットコントローラーとカスタムリソース定義(CRD)が必要です。これは Kubernetes オーケストレーター(例: Kubeadm 、 GKE 、OpenShift)の責任です。
KubernetesディストリビューションにスナップショットコントローラとCRDが含まれていない場合は、ボリュームSnapshotコントローラを導入するを参照してください。
|
|
GKE環境でオンデマンドボリュームスナップショットを作成する場合は、スナップショットコントローラを作成しないでください。GKEは組み込みの隠しスナップショットコントローラを使用します。 |
ボリューム Snapshot を作成する
-
`VolumeSnapshotClass`を作成します。詳細については、"VolumeSnapshotClass"を参照してください。
-
`driver`はTrident CSIドライバを指しています。
-
`deletionPolicy`は `Delete`または `Retain`に設定できます。 `Retain`に設定すると、 `VolumeSnapshot`オブジェクトが削除された場合でも、ストレージクラスター上の基礎となる物理Snapshotは保持されます。
例cat snap-sc.yaml
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: csi-snapclass driver: csi.trident.netapp.io deletionPolicy: Delete
-
-
既存の PVC のスナップショットを作成します。
例-
この例では、既存の PVC のスナップショットを作成します。
cat snap.yaml
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: pvc1-snap spec: volumeSnapshotClassName: csi-snapclass source: persistentVolumeClaimName: pvc1 -
この例では、 `pvc1`という名前のPVCのボリュームスナップショットオブジェクトを作成し、スナップショットの名前は `pvc1-snap`に設定されます。VolumeSnapshotはPVCに類似しており、実際のスナップショットを表す `VolumeSnapshotContent`オブジェクトに関連付けられています。
kubectl create -f snap.yaml volumesnapshot.snapshot.storage.k8s.io/pvc1-snap created kubectl get volumesnapshots NAME AGE pvc1-snap 50s
-
説明することで、
VolumeSnapshotContentオブジェクトをpvc1-snapVolumeSnapshot用に特定できます。 `Snapshot Content Name`は、このスナップショットに対応するVolumeSnapshotContentオブジェクトを識別します。 `Ready To Use`パラメータは、このスナップショットを使用して新しいPVCを作成できることを示します。kubectl describe volumesnapshots pvc1-snap Name: pvc1-snap Namespace: default ... Spec: Snapshot Class Name: pvc1-snap Snapshot Content Name: snapcontent-e8d8a0ca-9826-11e9-9807-525400f3f660 Source: API Group: Kind: PersistentVolumeClaim Name: pvc1 Status: Creation Time: 2019-06-26T15:27:29Z Ready To Use: true Restore Size: 3Gi ...
-
ボリュームSnapshotからPVCを作成する
`dataSource`を使用して、VolumeSnapshotという名前の `<pvc-name>`をデータのソースとして使用するPVCを作成できます。PVCが作成されると、ポッドに接続して他のPVCと同じように使用できるようになります。
|
|
PVC はソース ボリュームと同じバックエンドに作成されます。"KB:Trident PVC スナップショットからの PVC の作成は代替バックエンドでは実行できません"を参照してください。 |
次の例では、 `pvc1-snap`をデータソースとして使用してPVCを作成します。
cat pvc-from-snap.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-from-snap
spec:
accessModes:
- ReadWriteOnce
storageClassName: golden
resources:
requests:
storage: 3Gi
dataSource:
name: pvc1-snap
kind: VolumeSnapshot
apiGroup: snapshot.storage.k8s.io
ボリューム Snapshot をインポートする
Tridentは"Kubernetesの事前プロビジョニングされたスナップショットプロセス"をサポートしており、クラスタ管理者が `VolumeSnapshotContent`オブジェクトを作成し、Trident外部で作成されたスナップショットをインポートできるようにします。
Tridentでスナップショットの親ボリュームを作成またはインポートしておく必要があります。
-
*クラスタ管理者:*バックエンドスナップショットを参照する `VolumeSnapshotContent`オブジェクトを作成します。これにより、Tridentでスナップショットワークフローが開始されます。
-
`annotations`のバックエンドスナップショットの名前を `trident.netapp.io/internalSnapshotName: <"backend-snapshot-name">`として指定します。
-
`<name-of-parent-volume-in-trident>/<volume-snapshot-content-name>`を `snapshotHandle`で指定します。これは、外部スナップショッターが `ListSnapshots`コールでTridentに提供する唯一の情報です。
`<volumeSnapshotContentName>`は、CR の命名制約により、バックエンドのスナップショット名と常に一致するとは限りません。 例次の例では、バックエンドスナップショット `snap-01`を参照する `VolumeSnapshotContent`オブジェクトを作成します。
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotContent metadata: name: import-snap-content annotations: trident.netapp.io/internalSnapshotName: "snap-01" # This is the name of the snapshot on the backend spec: deletionPolicy: Retain driver: csi.trident.netapp.io source: snapshotHandle: pvc-f71223b5-23b9-4235-bbfe-e269ac7b84b0/import-snap-content # <import PV name or source PV name>/<volume-snapshot-content-name> volumeSnapshotRef: name: import-snap namespace: default -
-
クラスタ管理者: `VolumeSnapshot`オブジェクトを参照するCRを作成します。 `VolumeSnapshotContent`これにより、指定されたネームスペースで `VolumeSnapshot`を使用するためのアクセスが要求されます。
例次の例では、
VolumeSnapshot`という名前のCRを作成し、 `VolumeSnapshotContent`という名前の `import-snap-content`を参照します。 `import-snapapiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: import-snap spec: # volumeSnapshotClassName: csi-snapclass (not required for pre-provisioned or imported snapshots) source: volumeSnapshotContentName: import-snap-content -
*内部処理(操作は不要):*外部スナップショットツールは新しく作成された `VolumeSnapshotContent`を認識し、 `ListSnapshots`呼び出しを実行します。Tridentは `TridentSnapshot`を作成します。
-
外部スナップショットは、 `VolumeSnapshotContent`を `readyToUse`に設定し、 `VolumeSnapshot`を `true`に設定します。
-
Tridentが返します
readyToUse=true。
-
-
任意のユーザー:
PersistentVolumeClaim`を作成して新しい `VolumeSnapshot`を参照します。ここで、 `spec.dataSource(またはspec.dataSourceRef)名は `VolumeSnapshot`名です。例次の例では、 `VolumeSnapshot`という名前の `import-snap`を参照するPVCを作成します。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-from-snap spec: accessModes: - ReadWriteOnce storageClassName: simple-sc resources: requests: storage: 1Gi dataSource: name: import-snap kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io
スナップショットを使用してボリュームデータを回復する
`ontap-nas`および `ontap-nas-economy`ドライバーを使用してプロビジョニングされたボリュームの互換性を最大限に高めるために、スナップショットディレクトリはデフォルトでは非表示になっています。 `.snapshot`ディレクトリを有効にして、スナップショットから直接データをリカバリします。
volume snapshot restore ONTAP CLIを使用して、ボリュームを以前のスナップショットに記録された状態に復元します。
cluster1::*> volume snapshot restore -vserver vs0 -volume vol3 -snapshot vol3_snap_archive
|
|
Snapshotコピーをリストアすると、既存のボリューム構成が上書きされます。Snapshotコピーの作成後にボリュームデータに加えられた変更は失われます。 |
Snapshotからのインプレースボリュームリストア
Tridentは、 TridentActionSnapshotRestore(TASR)CRを使用して、スナップショットから迅速なインプレースボリュームリストアを提供します。このCRは命令型のKubernetesアクションとして機能し、操作の完了後は保持されません。
Tridentは、 ontap-san、 ontap-san-economy、 ontap-nas、 ontap-nas-flexgroup、 azure-netapp-files、 google-cloud-netapp-volumes、および `solidfire-san`ドライバでのスナップショットのリストアをサポートしています。
バインドされた PVC と使用可能なボリューム スナップショットが必要です。
-
PVC ステータスがバインドされていることを確認します。
kubectl get pvc -
ボリューム スナップショットが使用できる状態であることを確認します。
kubectl get vs
-
TASR CRを作成します。この例では、PVC `pvc1`とボリュームSnapshot `pvc1-snapshot`のCRを作成します。
TASR CR は、PVC と VS が存在する名前空間に存在する必要があります。 cat tasr-pvc1-snapshot.yamlapiVersion: trident.netapp.io/v1 kind: TridentActionSnapshotRestore metadata: name: trident-snap namespace: trident spec: pvcName: pvc1 volumeSnapshotName: pvc1-snapshot -
スナップショットから復元するには CR を適用します。この例では snapshot `pvc1`から復元します。
kubectl create -f tasr-pvc1-snapshot.yamltridentactionsnapshotrestore.trident.netapp.io/trident-snap created
Tridentはスナップショットからデータを復元します。スナップショットの復元ステータスを確認できます:
kubectl get tasr -o yaml
apiVersion: trident.netapp.io/v1
items:
- apiVersion: trident.netapp.io/v1
kind: TridentActionSnapshotRestore
metadata:
creationTimestamp: "2023-04-14T00:20:33Z"
generation: 3
name: trident-snap
namespace: trident
resourceVersion: "3453847"
uid: <uid>
spec:
pvcName: pvc1
volumeSnapshotName: pvc1-snapshot
status:
startTime: "2023-04-14T00:20:34Z"
completionTime: "2023-04-14T00:20:37Z"
state: Succeeded
kind: List
metadata:
resourceVersion: ""
|
|
|
関連するスナップショットを含む PV を削除する
関連するスナップショットを持つ永続ボリュームを削除すると、対応するTridentボリュームは「削除中」状態に更新されます。Tridentボリュームを削除するには、ボリュームスナップショットを削除します。
ボリュームSnapshotコントローラを導入する
KubernetesディストリビューションにスナップショットコントローラとCRDが含まれていない場合は、次のようにデプロイできます。
-
ボリュームスナップショット CRD を作成します。
cat snapshot-setup.sh
#!/bin/bash # Create volume snapshot CRDs kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/release-6.1/client/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/release-6.1/client/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/release-6.1/client/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml -
Snapshot Controller を作成します。
kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/release-6.1/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yamlkubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/release-6.1/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml必要に応じて `deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml`を開き、 `namespace`をネームスペースに更新します。