このドキュメントでは、ボリューム スナップショットを作成し、そのスナップショットからボリュームを復元する方法について説明します。ここで説明する手順は、vSphere CSI ドライバを使用するクラスタを対象としています。
始める前に
vSphere Container Storage Interface ドライバの使用を読みます。
クラスタに standard-rwo
という名前の StorageClass があり、vSphere CSI ドライバがインストールされていることを確認します。
vSphere のバージョン、ESXi、vCenter Server が 7.0 Update 3 以降である必要があります。詳細については、ストレージのトラブルシューティングをご覧ください。
手順の概要
このドキュメントで説明する演習の主な手順は次のとおりです。
- PersistentVolumeClaim を作成します。
standard-rwo
ストレージ クラスをリクエストする PersistentVolumeClaim を作成します。これにより、クラスタは PersistentVolume を動的にプロビジョニングし、PersistentVolumeClaim に関連付けます。
- Deployment を作成します。
- Pod が 1 つある Deployment を作成します。Pod は、PersistentVolumeClaim に基づいてボリュームを指定します。Pod 内の 1 つのコンテナがボリュームを
/hello/
にマウントします。
- Pod ボリュームにファイルを書き込みます。
- Pod ボリュームに
hello.txt
という名前のファイルを作成します。ファイルの内容は「Hello World!」です。
- VolumeSnapshot を作成します。
- Pod ボリュームの状態をキャプチャする VolumeSnapshot を作成します。
- ファイルを壊します。
hello.txt
ファイルを変更して、壊れたファイルのようにします。ファイルの内容が「Hello W-corrupted-file-orld!」になりました。
- スナップショットを使用してボリュームを復元します。
- 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
前述のマニフェストでは、storageClassName
が standard-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-pvc
を my-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!
トラブルシューティング
トラブルシューティングのガイダンスについては、ストレージのトラブルシューティングをご覧ください。