PersistentVolume のスナップショットを作成する

Kubernetes ボリューム スナップショット機能は、GKE クラスタの永続ボリュームと動的プロビジョニングに使用できます。

ボリューム スナップショットを使用すると、特定の時点でのボリュームのコピーを作成できます。このコピーを使用すると、ボリュームを以前の状態に戻すことや、置換用のボリュームをプロビジョニングすることが可能です。

ボリューム スナップショットのプロビジョニングとアタッチは、次のコンポーネントで行うことができます。

要件

GKE on AWS でボリューム スナップショットを使用するには、次のものが必要です。

  • スナップショットをサポートし Container Storage Interface(CSI)ドライバを使用するボリューム。GKE on AWS が使用する Elastic Block Store(EBS)ドライバは、デフォルトでスナップショットをサポートしています。

    スナップショットをサポートするすべての CSI ドライバの一覧については、Kubernetes ドキュメントのドライバにある「その他の機能」の列をご覧ください。

  • スナップショットに使用する既存の PersistentVolumeClaim が必要です。スナップショット ソースに使用する PersistentVolume は、CSI ドライバによって管理される必要があります。CSI ドライバを使用していることを確認するには、PersistentVolume 仕様の csi セクションで driver: ebs.csi.aws.com が指定されていることをチェックします。クラスタが、以降のセクションで説明する CSI ドライバで PersistentVolume を動的にプロビジョニングする場合、クラスタは CSI ドライバによって管理されます。

始める前に

ボリューム スナップショットを作成して使用する

このドキュメントの例では、次の作業を行う方法について説明します。

  1. サンプルの PersistentVolumeClaim と Pod を作成する。
  2. VolumeSnapshot を作成する。
  3. ボリューム スナップショットを復元する。
  4. 復元が機能していることを確認する。

ボリューム スナップショットを使用するには、次の手順を完了する必要があります。

  1. VolumeSnapshot オブジェクトを作成して、既存の PersistentVolumeClaim のスナップショットをリクエストします。
  2. PersistentVolumeClaim 内の VolumeSnapshot を参照して、そのスナップショットにボリュームを復元するか、スナップショットを使用して新しいボリュームを作成します。

サンプルの PersistentVolumeClaim と Pod を作成する

  1. PersistentVolumeClaim オブジェクトを作成するには、次のマニフェストを example-pvc.yaml として保存します。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: example-pvc
    spec:
      storageClassName: standard-rwo
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
    

    spec.storageClassName には、サポートされている CSI ドライバを使用するストレージ クラスを指定できます。この例では、デフォルトの standard-rwo ストレージ クラスを使用します。

  2. 次のようにマニフェストを適用します。

    kubectl apply -f example-pvc.yaml
    
  3. 現在の日時をボリュームに書き込む Pod を作成します。Pod を作成するには、次のマニフェストを snapshot-shell.yaml として保存します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: snapshot-shell
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: linux
        image: ubuntu:bionic
        command: ["/bin/sh"]
        args: ["-c", "echo $(date -u) >> /data/out.txt"]
        volumeMounts:
        - name: snapshot-volume
          mountPath: /data
      restartPolicy: Never
      volumes:
      - name: snapshot-volume
        persistentVolumeClaim:
          claimName: example-pvc
    
  4. 次のようにマニフェストを適用します。

    kubectl apply -f snapshot-shell.yaml
    
  5. Pod のステータスを確認します。

    kubectl get pod snapshot-shell
    

    Pod が実行されて完了するまで、しばらく時間がかかることがあります。次のような出力が表示されるまで、上記のコマンドを実行します。

    NAME             READY   STATUS      RESTARTS   AGE
    snapshot-shell   0/1     Completed   0          24s
    

VolumeSnapshot を作成する

VolumeSnapshot オブジェクトは、既存の PersistentVolumeClaim オブジェクトのスナップショットのリクエストです。VolumeSnapshot オブジェクトを作成すると、クラスタはこのオブジェクトを自動的に作成して VolumeSnapshotContent オブジェクト(PersistentVolume オブジェクトなどのクラスタ内のリソース)とバインドします。

  1. 次のマニフェストを volumesnapshot.yaml として保存します。

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshot
    metadata:
      name: example-snapshot
    spec:
      source:
        persistentVolumeClaimName: example-pvc
    
  2. 次のようにマニフェストを適用します。

    kubectl apply -f volumesnapshot.yaml
    

    ボリューム スナップショットを作成すると、クラスタによって対応する VolumeSnapshotContent オブジェクトが作成されます。このオブジェクトには、VolumeSnapshot オブジェクトのスナップショットとバインディングが格納されます。VolumeSnapshotContents オブジェクトを直接操作することはありません。

  3. クラスタが VolumeSnapshotContents オブジェクトを作成したことを確認します。

    kubectl get volumesnapshotcontents
    

    出力は次のようになります。

    NAME                                               AGE
    snapcontent-cee5fb1f-5427-11ea-a53c-42010a1000da   55s
    

ボリューム スナップショットの準備が完了していることを確認する

ボリューム スナップ ショットのコンテンツが作成されると、VolumeSnapshotClass で指定した CSI ドライバによって、対応するストレージ システムにスナップショットが作成されます。クラスタがストレージ システムにスナップショットを作成し、VolumeSnapshot オブジェクトにバインドすると、スナップショットが使用できるようになります。ステータスを確認するには、次のコマンドを実行します。

kubectl get volumesnapshot \
  -o custom-columns='NAME:.metadata.name,READY:.status.readyToUse'

スナップショットを使用できる場合は、出力は次のようになります。

NAME                    READY
example-snapshot        true

ボリューム スナップショットを復元する

PersistentVolumeClaim の VolumeSnapshot を参照して、既存のボリュームのデータで新しいボリュームをプロビジョニングできます。また、ボリュームをスナップショットでキャプチャした状態に復元することもできます。

PersistentVolumeClaim で VolumeSnapshot を参照するには、PersistentVolumeClaim に dataSource フィールドを追加します。

この例では、新しい PersistentVolumeClaim に作成した VolumeSnapshot を参照し、PersistentVolumeClaim をマウントする Pod を作成します。

  1. 次のマニフェストを pvc-restore.yaml として保存します。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
     name: pvc-restore
    spec:
     dataSource:
       name: example-snapshot
       kind: VolumeSnapshot
       apiGroup: snapshot.storage.k8s.io
     storageClassName: standard-rwo
     accessModes:
       - ReadWriteOnce
     resources:
       requests:
         storage: 1Gi
    
  2. 次のようにマニフェストを適用します。

    kubectl apply -f pvc-restore.yaml
    
  3. PVC を Pod にマウントする一時的な Pod を起動し、out.txt の内容をログに出力します。

    次のマニフェストを restore-log.yaml として保存します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: restore-verify
    spec:
      volumes:
        - name: restore-data
          persistentVolumeClaim:
            claimName: pvc-restore
      containers:
        - name: shell-container
          image: ubuntu:bionic
          volumeMounts:
            - mountPath: "/data"
              name: restore-data
          command: [ "/bin/sh" ]
          args: ["-c", "cat /data/out.txt", "exit", "1"]
      restartPolicy: Never
    
  4. 次のようにマニフェストを適用します。

    kubectl apply -f restore-log.yaml
    

スナップショットが正常に復元されたことを確認する

前のステップで作成した Pod は、スナップショットから読み取りを行います。スナップショットのデータを表示するには、kubectl logs コマンドを使用します。

kubectl logs restore-verify

出力には、スナップショットのタイムスタンプが含まれます。

クリーンアップ

このページで使用したリソースについて課金されないようにするには、次の手順に沿って操作します。

  1. VolumeSnapshot を削除します。

    kubectl delete volumesnapshot example-snapshot
    

  2. 一時的な Pod を削除します。

    kubectl delete -f restore-log.yaml
    
  3. Pod を削除します。

    kubectl delete -f snapshot-shell.yaml
    
  4. PersistentVolumeClaim オブジェクトを削除します。

    kubectl delete pvc example-pvc pvc-restore
    

次のステップ