Skip to main content
本製品の最新リリースがご利用いただけます。
日本語は機械翻訳による参考訳です。内容に矛盾や不一致があった場合には、英語の内容が優先されます。

スナップショットの操作

Kubernetes の Persistent Volume ( PV )のボリュームスナップショットにより、ポイントインタイムのボリュームコピーが可能になります。Trident を使用して作成されたボリュームのスナップショットを作成したり、 Trident 外部で作成されたスナップショットをインポートしたり、既存のスナップショットから新しいボリュームを作成したり、スナップショットからボリュームデータをリカバリしたりできます。

概要

ボリュームスナップショットは ontap-nasontap-nas-flexgroupontap-sanontap-san-economysolidfire-sanazure-netapp-files、および `google-cloud-netapp-volumes`ドライバでサポートされています。

開始する前に

スナップショットを操作するには、外部スナップショットコントローラーとカスタムリソース定義(CRD)が必要です。これは Kubernetes オーケストレーター(例: Kubeadm 、 GKE 、OpenShift)の責任です。

KubernetesディストリビューションにスナップショットコントローラとCRDが含まれていない場合は、ボリュームSnapshotコントローラを導入するを参照してください。

メモ GKE環境でオンデマンドボリュームスナップショットを作成する場合は、スナップショットコントローラを作成しないでください。GKEは組み込みの隠しスナップショットコントローラを使用します。

ボリューム Snapshot を作成する

手順
  1. `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
  2. 既存の 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-snap VolumeSnapshot用に特定できます。 `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でスナップショットの親ボリュームを作成またはインポートしておく必要があります。

手順
  1. *クラスタ管理者:*バックエンドスナップショットを参照する `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
  2. クラスタ管理者: `VolumeSnapshot`オブジェクトを参照するCRを作成します。 `VolumeSnapshotContent`これにより、指定されたネームスペースで `VolumeSnapshot`を使用するためのアクセスが要求されます。

    次の例では、 VolumeSnapshot`という名前のCRを作成し、 `VolumeSnapshotContent`という名前の `import-snap-content`を参照します。 `import-snap

    apiVersion: 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
  3. *内部処理(操作は不要):*外部スナップショットツールは新しく作成された `VolumeSnapshotContent`を認識し、 `ListSnapshots`呼び出しを実行します。Tridentは `TridentSnapshot`を作成します。

    • 外部スナップショットは、 `VolumeSnapshotContent`を `readyToUse`に設定し、 `VolumeSnapshot`を `true`に設定します。

    • Tridentが返します readyToUse=true

  4. 任意のユーザー: 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-sanontap-san-economyontap-nasontap-nas-flexgroupazure-netapp-filesgoogle-cloud-netapp-volumes、および `solidfire-san`ドライバでのスナップショットのリストアをサポートしています。

開始する前に

バインドされた PVC と使用可能なボリューム スナップショットが必要です。

  • PVC ステータスがバインドされていることを確認します。

    kubectl get pvc
  • ボリューム スナップショットが使用できる状態であることを確認します。

    kubectl get vs
手順
  1. TASR CRを作成します。この例では、PVC `pvc1`とボリュームSnapshot `pvc1-snapshot`のCRを作成します。

    メモ TASR CR は、PVC と VS が存在する名前空間に存在する必要があります。
    cat tasr-pvc1-snapshot.yaml
    apiVersion: trident.netapp.io/v1
    kind: TridentActionSnapshotRestore
    metadata:
      name: trident-snap
      namespace: trident
    spec:
      pvcName: pvc1
      volumeSnapshotName: pvc1-snapshot
  2. スナップショットから復元するには CR を適用します。この例では snapshot `pvc1`から復元します。

    kubectl create -f tasr-pvc1-snapshot.yaml
    tridentactionsnapshotrestore.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: ""
メモ
  • ほとんどの場合、Tridentは失敗した場合に操作を自動的に再試行しません。再度操作を実行する必要があります。

  • 管理者アクセス権を持たない Kubernetes ユーザーには、アプリケーション名前空間で TASR CR を作成するために、管理者からの権限付与が必要になる場合があります。

関連するスナップショットを含む PV を削除する

関連するスナップショットを持つ永続ボリュームを削除すると、対応するTridentボリュームは「削除中」状態に更新されます。Tridentボリュームを削除するには、ボリュームスナップショットを削除します。

ボリュームSnapshotコントローラを導入する

KubernetesディストリビューションにスナップショットコントローラとCRDが含まれていない場合は、次のようにデプロイできます。

手順
  1. ボリュームスナップショット 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
  2. Snapshot Controller を作成します。

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/release-6.1/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml
    kubectl 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`をネームスペースに更新します。