このドキュメントでは、ボリューム スナップショットを作成し、そのスナップショットからボリュームを復元する方法について説明します。ここで説明する手順は、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!
トラブルシューティング
トラブルシューティングのガイダンスについては、ストレージのトラブルシューティングをご覧ください。