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

このドキュメントでは、ボリューム スナップショットを作成し、スナップショットを使用してボリュームを復元する方法について説明します。以下の手順は、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 を作成します。Deployment を編集して、そのボリュームが新しい PersistentVolumeClaim に関連付けられるようにします。次に、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 は 1 つの Pod で構成されています。ポッドの名前を取得します。

kubectl --kubeconfig CLUSTER_KUBECONFIG get pods

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

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!

トラブルシューティング

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