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

このドキュメントでは、ボリューム スナップショットを作成し、そのスナップショットからボリュームを復元する方法について説明します。ここで説明する手順は、vSphere CSI ドライバを使用するクラスタを対象としています。

始める前に

vSphere Container Storage Interface ドライバの使用を読みます。

クラスタに standard-rwo という名前の StorageClass があり、vSphere CSI ドライバがインストールされていることを確認します。

vSphere のバージョン、ESXi、vCenter Server が 7.0 Update 3 以降である必要があります。詳細については、ストレージのトラブルシューティングをご覧ください。

手順の概要

このドキュメントで説明する演習の主な手順は次のとおりです。

  1. PersistentVolumeClaim を作成します。
    standard-rwo ストレージ クラスをリクエストする PersistentVolumeClaim を作成します。これにより、クラスタは PersistentVolume を動的にプロビジョニングし、PersistentVolumeClaim に関連付けます。
  2. Deployment を作成します。
    Pod が 1 つある Deployment を作成します。Pod は、PersistentVolumeClaim に基づいてボリュームを指定します。Pod 内の 1 つのコンテナがボリュームを /hello/ にマウントします。
  3. Pod ボリュームにファイルを書き込みます。
    Pod ボリュームに hello.txt という名前のファイルを作成します。ファイルの内容は「Hello World!」です。
  4. VolumeSnapshot を作成します。
    Pod ボリュームの状態をキャプチャする VolumeSnapshot を作成します。
  5. ファイルを壊します。
    hello.txt ファイルを変更して、壊れたファイルのようにします。ファイルの内容が「Hello W-corrupted-file-orld!」になりました。
  6. スナップショットを使用してボリュームを復元します。
    VolumeSnapshot をデータソースとして使用する 2 つ目の PersistentVolumeClaim を作成します。ボリュームが新しい PersistentVolumeClaim に関連付けられるように Deployment を編集します。hello.txt ファイルが復元されたことを確認します。

PersistentVolumeClaim を作成する

PersistentVolumeClaim のマニフェストは次のとおりです。

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

前述のマニフェストでは、storageClassNamestandard-rwo に設定されています。これは、vSphere CSI ドライバに関連付けられたストレージ クラスです。

マニフェストを my-pvc.yaml という名前のファイルに保存します。PersistentVolumeClaim を作成して表示します。

kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-pvc.yaml

kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc

出力を見ると、PersistentVolumeClaim が動的にプロビジョニングされた PersistentVolume にバインドされていることがわかります。たとえば、次の出力は、my-pvc という名前の PersistentVolumeClaim が pvc-467d211c-26e4-4d69-aaa5-42219aee6fd5 という名前の PersistentVolume にバインドされていることを示しています。

my-pvc   Bound    pvc-467d211c-26e4-4d69-aaa5-42219aee6fd5  …  standard-rwo   100s

Deployment を作成する

Deployment のマニフェストは次のとおりです。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  selector:
    matchLabels:
      app: hello-app
  template:
    metadata:
      labels:
        app: hello-app
    spec:
      containers:
      - name: hello-app
        image: google/cloud-sdk:slim
        args: [ "sleep", "3600" ]
        volumeMounts:
        - name: my-volume
          mountPath: /hello/
      volumes:
      - name: my-volume
        persistentVolumeClaim:
          claimName: my-pvc

この演習では、上記の Deployment マニフェストについて次のことを理解しておくことが重要です。

  • Pod は、前に作成した PersistentVolumeClaim my-pvc を指定してストレージをリクエストします。

  • Pod には 1 つのコンテナがあり、コンテナは /hello/ にボリュームをマウントします。

このマニフェストを my-deployment.yaml という名前のファイルに保存して、Deployment を作成します。

kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-deployment.yaml

Deployment には Pod が 1 つあります。Pod の名前を取得します。

kubectl --kubeconfig CLUSTER_KUBECONFIG get pods

Pod 名をメモします。たとえば、次の出力では my-deployment-7575c4f5bf-r59nt が Pod 名です。

my-deployment-7575c4f5bf-r59nt   1/1     Running   0          65s

Pod ボリュームにファイルを作成し、そのファイルを表示します。

kubectl --kubeconfig CLUSTER_KUBECONFIG \
    exec POD_NAME \
    -- sh -c 'echo "Hello World!" > /hello/hello.txt'

kubectl --kubeconfig CLUSTER_KUBECONFIG \
    exec POD_NAME \
    -- sh -c 'cat /hello/hello.txt'

出力には、ファイル /hello/hello.txt の内容が表示されます。

Hello World!

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

VolumeSnapshot のマニフェストは次のとおりです。

apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: my-snapshot
spec:
  volumeSnapshotClassName: csi-vsphere-snapshot-class
  source:
    persistentVolumeClaimName: my-pvc

このマニフェストを my-snapshot.yaml という名前のファイルに保存して VolumeSnapshot を作成します。

kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-snapshot.yaml

ボリューム内のファイルを壊す

hello.txt の内容が変更し、壊れたようにします。

kubectl --kubeconfig CLUSTER_KUBECONFIG \
    exec POD_NAME \
    -- sh -c 'echo "Hello W-corrupted-file-orld!" > /hello/hello.txt'

kubectl --kubeconfig CLUSTER_KUBECONFIG \
    exec POD_NAME \
    -- sh -c 'cat /hello/hello.txt'

出力を見ると、ファイルが変更されたことがわかります。

Hello W-corrupted-file-orld!

復元

2 つ目の PersistentVolumeClaim のマニフェストは次のとおりです。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc-2
spec:
  storageClassName: standard-rwo
  dataSource:
    name: my-snapshot
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

前述のマニフェストでは、新しい PersistentVolume クレームのデータソースが、以前に作成した VolumeSnapshot になっています。

マニフェストを my-pvc-2.yaml という名前のファイルに保存します。PersistentVolumeClaim を作成して表示します。

kubectl --kubeconfig CLUSTER_KUBECONFIG apply -f my-pvc-2.yaml

kubectl --kubeconfig CLUSTER_KUBECONFIG get pvc my-pvc-2

Deployment を編集用に開きます。

kubectl --kubeconfig CLUSTER_KUBECONFIG edit deployment my-deployment

my-pvcmy-pvc-2 に変更し、エディタを閉じます。

…
  volumes:
  - name: my-volume
    persistentVolumeClaim:
    claimName: my-pvc-2

Deployment は Pod を削除し、新しい PersistentVolumeClaim を使用する Pod を新たに作成します。

数分待ってから、新しい Pod 名を取得します。

kubectl --kubeconfig CLUSTER_KUBECONFIG get pods

Pod ボリュームが復元されたことを確認します。

kubectl --kubeconfig CLUSTER_KUBECONFIG \
   exec NEW_POD_NAME \
   -- sh -c 'cat /hello/hello.txt'

出力には、ボリュームが復元されたことが示されます。

Hello World!

トラブルシューティング

トラブルシューティングのガイダンスについては、ストレージのトラブルシューティングをご覧ください。